Date: Mon, 3 May 2010 21:03:49 GMT From: Ana Kukec <anchie@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 177677 for review Message-ID: <201005032103.o43L3nah081080@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@177677?ac=10 Change 177677 by anchie@anchie_malimis on 2010/05/03 21:03:44 Getting rid of the global variable V_send_so from files other then send.[ch]. Affected files ... .. //depot/projects/soc2009/anchie_send/src/sys/netinet6/icmp6.c#39 edit .. //depot/projects/soc2009/anchie_send/src/sys/netinet6/nd6.c#29 edit .. //depot/projects/soc2009/anchie_send/src/sys/netinet6/nd6_nbr.c#16 edit .. //depot/projects/soc2009/anchie_send/src/sys/netinet6/raw_ip6.c#10 edit .. //depot/projects/soc2009/anchie_send/src/sys/netinet6/send.c#43 edit .. //depot/projects/soc2009/anchie_send/src/sys/netinet6/send.h#21 edit Differences ... ==== //depot/projects/soc2009/anchie_send/src/sys/netinet6/icmp6.c#39 (text+ko) ==== @@ -424,7 +424,7 @@ int icmp6len = m->m_pkthdr.len - *offp; int code, sum, noff; char ip6bufs[INET6_ADDRSTRLEN], ip6bufd[INET6_ADDRSTRLEN]; - int ip6len; + int ip6len, error = -1; ifp = m->m_pkthdr.rcvif; @@ -780,24 +780,37 @@ /* give up local */ /* Send incoming SeND-protected/ND packet to user space. */ - if (send_sendso_input_hook != NULL && V_send_so != NULL) { - IP6_EXTHDR_CHECK(m, off, icmp6len, IPPROTO_DONE); - printf("send_sendso_input_hook\n"); - send_sendso_input_hook(V_send_so, m, SND_IN, ip6len); - } else { + if (send_sendso_input_hook != NULL) { + IP6_EXTHDR_CHECK(m, off, + icmp6len, IPPROTO_DONE); + error = send_sendso_input_hook(m, + SND_IN, ip6len); + /* -1 == no app on SEND socket */ + if (!error) + return (IPPROTO_DONE); + } + if ((send_sendso_input_hook != NULL + && error == -1) || + send_sendso_input_hook == NULL) { /* give up local */ nd6_rs_input(m, off, icmp6len); } m = NULL; goto freeit; } - if (send_sendso_input_hook != NULL && V_send_so != NULL) { - IP6_EXTHDR_CHECK(m, off, icmp6len, IPPROTO_DONE); - printf("send_sendso_input_hook\n"); - send_sendso_input_hook(V_send_so, n, SND_IN, ip6len); - return (IPPROTO_DONE); - } else + if (send_sendso_input_hook != NULL) { + IP6_EXTHDR_CHECK(m, off, + icmp6len, IPPROTO_DONE); + error = send_sendso_input_hook(n, + SND_IN, ip6len); + /* -1 == no app on SEND socket */ + if (!error) + return (IPPROTO_DONE); + } + if ((send_sendso_input_hook != NULL && error == -1) + || (send_sendso_input_hook == NULL)) { nd6_rs_input(n, off, icmp6len); + } /* m stays. */ break; @@ -810,20 +823,30 @@ if ((n = m_copym(m, 0, M_COPYALL, M_DONTWAIT)) == NULL) { /* Send incoming SeND-protected/ND packet to user space. */ - if (send_sendso_input_hook != NULL && V_send_so != NULL) { - - send_sendso_input_hook(V_send_so, m, SND_IN, ip6len); - return (IPPROTO_DONE); - } else + if (send_sendso_input_hook != NULL) { + error = send_sendso_input_hook(m, + SND_IN, ip6len); + if (!error) + return (IPPROTO_DONE); + } + if ((send_sendso_input_hook != NULL + && error == -1) || + send_sendso_input_hook == NULL) { nd6_ra_input(m, off, icmp6len); + } m = NULL; goto freeit; } - if (send_sendso_input_hook != NULL && V_send_so != NULL) { - send_sendso_input_hook(V_send_so, n, SND_IN, ip6len); - return (IPPROTO_DONE); - } else + if (send_sendso_input_hook != NULL) { + error = send_sendso_input_hook(n, + SND_IN, ip6len); + if (!error) + return (IPPROTO_DONE); + } + if ((send_sendso_input_hook != NULL && error == -1) + || (send_sendso_input_hook == NULL)) { nd6_ra_input(n, off, icmp6len); + } /* m stays. */ break; @@ -834,23 +857,27 @@ if (icmp6len < sizeof(struct nd_neighbor_solicit)) goto badlen; if ((n = m_copym(m, 0, M_COPYALL, M_DONTWAIT)) == NULL) { - if (send_sendso_input_hook != NULL && V_send_so != NULL) { - /* Send incoming SeND/ND packet to user space. */ - printf("%s: send_sendso_input_hook m=%p\n", __func__, m); - send_sendso_input_hook(V_send_so, m, SND_IN, ip6len); - } else { + if (send_sendso_input_hook != NULL) { + error = send_sendso_input_hook(m, + SND_IN, ip6len); + } + if ((send_sendso_input_hook != NULL + && error == -1) || + send_sendso_input_hook == NULL) { /* give up local */ nd6_ns_input(m, off, icmp6len); } m = NULL; goto freeit; } - if (send_sendso_input_hook != NULL && V_send_so != NULL) { - /* Send incoming SeND/ND packet to user space. */ - printf("%s: send_sendso_input_hook n=%p\n", __func__, n); - send_sendso_input_hook(V_send_so, n, SND_IN, ip6len); - } else + if (send_sendso_input_hook != NULL) { + error = send_sendso_input_hook(n, + SND_IN, ip6len); + } + if ((send_sendso_input_hook != NULL && error == -1) + || (send_sendso_input_hook == NULL)) { nd6_ns_input(n, off, icmp6len); + } /* m stays. */ break; @@ -863,20 +890,29 @@ if ((n = m_copym(m, 0, M_COPYALL, M_DONTWAIT)) == NULL) { /* Send incoming SeND-protected/ND packet to user space. */ - if (send_sendso_input_hook != NULL && V_send_so != NULL) { - send_sendso_input_hook(V_send_so, m, SND_IN, ip6len); - return (IPPROTO_DONE); - } else { + if (send_sendso_input_hook != NULL) { + error = send_sendso_input_hook(m, + SND_IN, ip6len); + if (!error) + return (IPPROTO_DONE); + } + if ((send_sendso_input_hook != NULL + && error == -1) || + send_sendso_input_hook == NULL) { /* give up local */ nd6_na_input(m, off, icmp6len); } m = NULL; goto freeit; } - if (send_sendso_input_hook != NULL) - send_sendso_input_hook(V_send_so, n, SND_IN, ip6len); - else + if (send_sendso_input_hook != NULL) { + error = send_sendso_input_hook(n, + SND_IN, ip6len); + } + if ((send_sendso_input_hook != NULL && error == -1) + || (send_sendso_input_hook == NULL)) { nd6_na_input(n, off, icmp6len); + } /* m stays. */ break; @@ -887,23 +923,35 @@ if (icmp6len < sizeof(struct nd_redirect)) goto badlen; if ((n = m_copym(m, 0, M_COPYALL, M_DONTWAIT)) == NULL) { - - /* Send incoming SeND-protected/ND packet to user space. */ - if (send_sendso_input_hook != NULL && V_send_so != NULL) { - send_sendso_input_hook(V_send_so, m, SND_IN, ip6len); - return (IPPROTO_DONE); - } else { + if (send_sendso_input_hook != NULL) { + error = send_sendso_input_hook(m, + SND_IN, ip6len); + if (!error) + return (IPPROTO_DONE); + else + goto freeit; + } + if ((send_sendso_input_hook != NULL + && error == -1) || + send_sendso_input_hook == NULL) { /* give up local */ icmp6_redirect_input(m, off); } m = NULL; goto freeit; } - if (send_sendso_input_hook != NULL && V_send_so != NULL) { - send_sendso_input_hook(V_send_so, n, SND_IN, ip6len); - return (IPPROTO_DONE); - } else + if (send_sendso_input_hook != NULL) { + error = send_sendso_input_hook(n, + SND_IN, ip6len); + if (!error) + return (IPPROTO_DONE); + else + goto freeit; + } + if ((send_sendso_input_hook != NULL && error == -1) + || (send_sendso_input_hook == NULL)) { icmp6_redirect_input(n, off); + } /* m stays. */ break; @@ -2805,7 +2853,7 @@ nd_rd->nd_rd_cksum = in6_cksum(m, IPPROTO_ICMPV6, sizeof(*ip6), ntohs(ip6->ip6_plen)); - if (send_sendso_input_hook != NULL && V_send_so != NULL) { + if (send_sendso_input_hook != NULL) { mtag = m_tag_get(PACKET_TAG_ND_OUTGOING, sizeof(unsigned short), M_NOWAIT); if (mtag == NULL) ==== //depot/projects/soc2009/anchie_send/src/sys/netinet6/nd6.c#29 (text+ko) ==== @@ -113,7 +113,7 @@ static struct sockaddr_in6 all1_sa; -int (*send_sendso_input_hook)(struct socket *, struct mbuf *, int, int); +int (*send_sendso_input_hook)(struct mbuf *, int, int); static int nd6_is_new_addr_neighbor __P((struct sockaddr_in6 *, struct ifnet *)); @@ -1803,9 +1803,10 @@ struct m_tag *mtag; struct llentry *ln = lle; struct ip6_hdr *ip6; - int error = 0; + int error = -1; int flags = 0; - int ip6len, skip = 0; + int ip6len; + int skip; unsigned short *nd_type; ip6 = mtod(m, struct ip6_hdr *); @@ -1985,15 +1986,19 @@ mac_netinet6_nd6_send(ifp, m); #endif + skip = 0; /* send outgoing NS/NA/REDIRECT packet to sendd. */ - if (send_sendso_input_hook != NULL && V_send_so != NULL) { + if (send_sendso_input_hook != NULL) { mtag = m_tag_find(m, PACKET_TAG_ND_OUTGOING, NULL); if (mtag != NULL) { skip = 1; nd_type = (unsigned short *)(mtag + 1); /* Use the SEND socket */ - return (send_sendso_input_hook(V_send_so, - m, SND_OUT, ip6len); + error = send_sendso_input_hook(m, SND_OUT, + ip6len); + /* -1 == no app on SEND socket */ + if (error == 0 && error != -1) + return (error); } } ==== //depot/projects/soc2009/anchie_send/src/sys/netinet6/nd6_nbr.c#16 (text+ko) ==== @@ -569,9 +569,9 @@ nd_ns->nd_ns_cksum = in6_cksum(m, IPPROTO_ICMPV6, sizeof(*ip6), icmp6len); - if (send_sendso_input_hook != NULL && V_send_so != NULL) { - mtag = m_tag_get(PACKET_TAG_ND_OUTGOING, sizeof(unsigned short), - M_NOWAIT); + if (send_sendso_input_hook != NULL) { + mtag = m_tag_get(PACKET_TAG_ND_OUTGOING, + sizeof(unsigned short), M_NOWAIT); if (mtag == NULL) goto bad; *(unsigned short *)(mtag + 1) = nd_ns->nd_ns_type; @@ -896,7 +896,7 @@ * the 2nd argument as the 1st one. */ - if (send_sendso_input_hook != NULL && V_send_so != NULL) { + if (send_sendso_input_hook != NULL) { mtag = m_tag_get(PACKET_TAG_ND_OUTGOING, sizeof(unsigned short), M_NOWAIT); if (mtag == NULL) @@ -1091,8 +1091,9 @@ nd_na->nd_na_cksum = in6_cksum(m, IPPROTO_ICMPV6, sizeof(struct ip6_hdr), icmp6len); - if (send_sendso_input_hook != NULL && V_send_so != NULL) { - mtag = m_tag_get(PACKET_TAG_ND_OUTGOING, sizeof(unsigned short), + if (send_sendso_input_hook != NULL) { + mtag = m_tag_get(PACKET_TAG_ND_OUTGOING, + sizeof(unsigned short), M_NOWAIT); if (mtag == NULL) goto bad; ==== //depot/projects/soc2009/anchie_send/src/sys/netinet6/raw_ip6.c#10 (text+ko) ==== @@ -535,8 +535,7 @@ * Send RA/RS messages to user land for protection, before sending * them to rtadvd/rtsol. */ - if (send_sendso_input_hook != NULL && - V_send_so != NULL && + if ((send_sendso_input_hook != NULL) && so->so_proto->pr_protocol == IPPROTO_ICMPV6) { switch (type) { case ND_ROUTER_ADVERT: ==== //depot/projects/soc2009/anchie_send/src/sys/netinet6/send.c#43 (text+ko) ==== @@ -195,12 +195,15 @@ * Send a message to the SEND daemon on the SEND socket. */ static int -send_sendso_input(struct socket *s, struct mbuf *m, int direction, int msglen) +send_sendso_input(struct mbuf *m, int direction, int msglen) { u_int len; struct ip6_hdr *ip6; struct snd_hdr *snd_hdr = NULL; + if (V_send_so == NULL) + goto freeit; + /* * Make sure to clear any possible internally embedded scope before * passing the packet to userspace for SeND cryptographic signature @@ -225,15 +228,14 @@ * protected (outgoing) or validated (incoming) according to rfc3971. */ - if (s) { - SOCKBUF_LOCK(&s->so_rcv); - sbappendrecord_locked(&s->so_rcv, m); - sorwakeup_locked(s); - return (0); - } + SOCKBUF_LOCK(&s->so_rcv); + sbappendrecord_locked(&s->so_rcv, m); + sorwakeup_locked(s); + return (0); +freeit: m_freem(m); - return -1; + return (-1); } static void ==== //depot/projects/soc2009/anchie_send/src/sys/netinet6/send.h#21 (text+ko) ==== @@ -34,4 +34,4 @@ int ifidx; }; -extern int (*send_sendso_input_hook)(struct socket *, struct mbuf *, int, int); +extern int (*send_sendso_input_hook)(struct mbuf *, int, int);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005032103.o43L3nah081080>