On Tue, Nov 15, 2016 at 04:03:40PM +0100, Martin Pieuchot wrote:
> Assert that the sync cache functions are always called under the correct
> IPL.
>
> This kill some more recursive splsoftnet().
>
> While here keep local declarations local, this makes my life easier.
> This way I know I don't need to grep the whole tree to look where the
> functions are called.
You are a bit inconsistent wether you remove the {} from one line
if blocks.
OK bluhm@
>
> Index: netinet/tcp_input.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/tcp_input.c,v
> retrieving revision 1.331
> diff -u -p -r1.331 tcp_input.c
> --- netinet/tcp_input.c 15 Nov 2016 14:30:59 -0000 1.331
> +++ netinet/tcp_input.c 15 Nov 2016 14:54:42 -0000
> @@ -186,8 +186,22 @@ do { \
> if_put(ifp); \
> } while (0)
>
> -void syn_cache_put(struct syn_cache *);
> -void syn_cache_rm(struct syn_cache *);
> +void syn_cache_put(struct syn_cache *);
> +void syn_cache_rm(struct syn_cache *);
> +int syn_cache_respond(struct syn_cache *, struct mbuf *);
> +void syn_cache_timer(void *);
> +void syn_cache_reaper(void *);
> +void syn_cache_insert(struct syn_cache *, struct tcpcb *);
> +void syn_cache_reset(struct sockaddr *, struct sockaddr *,
> + struct tcphdr *, u_int);
> +int syn_cache_add(struct sockaddr *, struct sockaddr *, struct tcphdr *,
> + unsigned int, struct socket *, struct mbuf *, u_char *, int,
> + struct tcp_opt_info *, tcp_seq *);
> +struct socket *syn_cache_get(struct sockaddr *, struct sockaddr *,
> + struct tcphdr *, unsigned int, unsigned int, struct socket *,
> + struct mbuf *);
> +struct syn_cache *syn_cache_lookup(struct sockaddr *, struct sockaddr *,
> + struct syn_cache_head **, u_int);
>
> /*
> * Insert segment ti into reassembly queue of tcp with
> @@ -3382,9 +3396,9 @@ syn_cache_insert(struct syn_cache *sc, s
> struct syn_cache_set *set = &tcp_syn_cache[tcp_syn_cache_active];
> struct syn_cache_head *scp;
> struct syn_cache *sc2;
> - int i, s;
> + int i;
>
> - s = splsoftnet();
> + splsoftassert(IPL_SOFTNET);
>
> /*
> * If there are no entries in the hash table, reinitialize
> @@ -3507,8 +3521,6 @@ syn_cache_insert(struct syn_cache *sc, s
> if (set->scs_use <= 0 &&
> tcp_syn_cache[!tcp_syn_cache_active].scs_count == 0)
> tcp_syn_cache_active = !tcp_syn_cache_active;
> -
> - splx(s);
> }
>
> /*
> @@ -3576,9 +3588,8 @@ void
> syn_cache_cleanup(struct tcpcb *tp)
> {
> struct syn_cache *sc, *nsc;
> - int s;
>
> - s = splsoftnet();
> + splsoftassert(IPL_SOFTNET);
>
> LIST_FOREACH_SAFE(sc, &tp->t_sc, sc_tpq, nsc) {
> #ifdef DIAGNOSTIC
> @@ -3590,8 +3601,6 @@ syn_cache_cleanup(struct tcpcb *tp)
> }
> /* just for safety */
> LIST_INIT(&tp->t_sc);
> -
> - splx(s);
> }
>
> /*
> @@ -3662,16 +3671,15 @@ syn_cache_get(struct sockaddr *src, stru
> struct inpcb *inp, *oldinp;
> struct tcpcb *tp = NULL;
> struct mbuf *am;
> - int s;
> struct socket *oso;
> #if NPF > 0
> struct pf_divert *divert = NULL;
> #endif
>
> - s = splsoftnet();
> + splsoftassert(IPL_SOFTNET);
> +
> if ((sc = syn_cache_lookup(src, dst, &scp,
> sotoinpcb(so)->inp_rtableid)) == NULL) {
> - splx(s);
> return (NULL);
> }
>
> @@ -3683,13 +3691,11 @@ syn_cache_get(struct sockaddr *src, stru
> SEQ_LEQ(th->th_seq, sc->sc_irs) ||
> SEQ_GT(th->th_seq, sc->sc_irs + 1 + sc->sc_win)) {
> (void) syn_cache_respond(sc, m);
> - splx(s);
> return ((struct socket *)(-1));
> }
>
> /* Remove this cache entry */
> syn_cache_rm(sc);
> - splx(s);
>
> /*
> * Ok, create the full blown connection, and set things up
> @@ -3898,19 +3904,16 @@ syn_cache_reset(struct sockaddr *src, st
> {
> struct syn_cache *sc;
> struct syn_cache_head *scp;
> - int s = splsoftnet();
>
> - if ((sc = syn_cache_lookup(src, dst, &scp, rtableid)) == NULL) {
> - splx(s);
> + splsoftassert(IPL_SOFTNET);
> +
> + if ((sc = syn_cache_lookup(src, dst, &scp, rtableid)) == NULL)
> return;
> - }
> if (SEQ_LT(th->th_seq, sc->sc_irs) ||
> SEQ_GT(th->th_seq, sc->sc_irs+1)) {
> - splx(s);
> return;
> }
> syn_cache_rm(sc);
> - splx(s);
> tcpstat.tcps_sc_reset++;
> syn_cache_put(sc);
> }
> @@ -3921,16 +3924,14 @@ syn_cache_unreach(struct sockaddr *src,
> {
> struct syn_cache *sc;
> struct syn_cache_head *scp;
> - int s;
>
> - s = splsoftnet();
> + splsoftassert(IPL_SOFTNET);
> +
> if ((sc = syn_cache_lookup(src, dst, &scp, rtableid)) == NULL) {
> - splx(s);
> return;
> }
> /* If the sequence number != sc_iss, then it's a bogus ICMP msg */
> if (ntohl (th->th_seq) != sc->sc_iss) {
> - splx(s);
> return;
> }
>
> @@ -3944,12 +3945,10 @@ syn_cache_unreach(struct sockaddr *src,
> */
> if ((sc->sc_flags & SCF_UNREACH) == 0 || sc->sc_rxtshift < 3) {
> sc->sc_flags |= SCF_UNREACH;
> - splx(s);
> return;
> }
>
> syn_cache_rm(sc);
> - splx(s);
> tcpstat.tcps_sc_unreach++;
> syn_cache_put(sc);
> }
> Index: netinet/tcp_var.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/tcp_var.h,v
> retrieving revision 1.116
> diff -u -p -r1.116 tcp_var.h
> --- netinet/tcp_var.h 4 Oct 2016 13:54:32 -0000 1.116
> +++ netinet/tcp_var.h 15 Nov 2016 14:36:09 -0000
> @@ -670,24 +670,10 @@ int tcp_signature(struct tdb *, int, str
> #endif /* TCP_SIGNATURE */
> void tcp_set_iss_tsm(struct tcpcb *);
>
> -int syn_cache_add(struct sockaddr *, struct sockaddr *,
> - struct tcphdr *, unsigned int, struct socket *,
> - struct mbuf *, u_char *, int, struct tcp_opt_info *, tcp_seq *);
> void syn_cache_unreach(struct sockaddr *, struct sockaddr *,
> struct tcphdr *, u_int);
> -struct socket *syn_cache_get(struct sockaddr *, struct sockaddr *,
> - struct tcphdr *, unsigned int, unsigned int,
> - struct socket *so, struct mbuf *);
> void syn_cache_init(void);
> -void syn_cache_insert(struct syn_cache *, struct tcpcb *);
> -struct syn_cache *syn_cache_lookup(struct sockaddr *, struct sockaddr *,
> - struct syn_cache_head **, u_int);
> -void syn_cache_reset(struct sockaddr *, struct sockaddr *,
> - struct tcphdr *, u_int);
> -int syn_cache_respond(struct syn_cache *, struct mbuf *);
> -void syn_cache_timer(void *);
> void syn_cache_cleanup(struct tcpcb *);
> -void syn_cache_reaper(void *);
>
> #endif /* _KERNEL */
> #endif /* _NETINET_TCP_VAR_H_ */