On Wed, Nov 19, 2014 at 04:50:23PM +0100, Martin Pieuchot wrote:
> ...and in the end, they believe the mbuf(9) flags!
> 
> There's no good reason to recheck if the IP destination address is a
> multicast or broadcast in {tcp,udp}_input().  We've already done that
> when the packet got delivered.
> 
> So the diff below makes sure the multicast flag is set (jut be as
> paranoid as with broadcast) and check for these flags in the upper
> layer.
> 
> I verified with crafted packets that this works, the goal of this diff
> is obviously to reduce the usage of "rcvif" pointers (and simplify
> in_broadcast() afterward).
> 
> Comments, ok?
> 

Ok

> 
> Index: netinet/ip_input.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/netinet/ip_input.c,v
> retrieving revision 1.241
> diff -u -p -r1.241 ip_input.c
> --- netinet/ip_input.c        5 Nov 2014 14:03:02 -0000       1.241
> +++ netinet/ip_input.c        19 Nov 2014 15:39:59 -0000
> @@ -348,6 +348,10 @@ ipv4_input(struct mbuf *m)
>  
>       if (IN_MULTICAST(ip->ip_dst.s_addr)) {
>               struct in_multi *inm;
> +
> +             /* Paranoia. */
> +             m->m_flags |= M_MCAST;
> +
>  #ifdef MROUTING
>               if (ipmforwarding && ip_mrouter) {
>                       if (m->m_flags & M_EXT) {
> Index: netinet/tcp_input.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/netinet/tcp_input.c,v
> retrieving revision 1.283
> diff -u -p -r1.283 tcp_input.c
> --- netinet/tcp_input.c       18 Nov 2014 02:37:31 -0000      1.283
> +++ netinet/tcp_input.c       19 Nov 2014 15:39:59 -0000
> @@ -394,7 +394,6 @@ tcp_input(struct mbuf *m, ...)
>  
>       /*
>        * RFC1122 4.2.3.10, p. 104: discard bcast/mcast SYN
> -      * See below for AF specific multicast.
>        */
>       if (m->m_flags & (M_BCAST|M_MCAST))
>               goto drop;
> @@ -459,10 +458,6 @@ tcp_input(struct mbuf *m, ...)
>       switch (af) {
>       case AF_INET:
>               ip = mtod(m, struct ip *);
> -             if (IN_MULTICAST(ip->ip_dst.s_addr) ||
> -                 in_broadcast(ip->ip_dst, m->m_pkthdr.rcvif,
> -                 m->m_pkthdr.ph_rtableid))
> -                     goto drop;
>  #ifdef TCP_ECN
>               /* save ip_tos before clearing it for checksum */
>               iptos = ip->ip_tos;
> Index: netinet/udp_usrreq.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/netinet/udp_usrreq.c,v
> retrieving revision 1.191
> diff -u -p -r1.191 udp_usrreq.c
> --- netinet/udp_usrreq.c      9 Nov 2014 22:05:08 -0000       1.191
> +++ netinet/udp_usrreq.c      19 Nov 2014 15:39:59 -0000
> @@ -400,16 +400,7 @@ udp_input(struct mbuf *m, ...)
>       }
>  #endif
>  
> -#ifdef INET6
> -     if ((ip6 && IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) ||
> -         (ip && IN_MULTICAST(ip->ip_dst.s_addr)) ||
> -         (ip && in_broadcast(ip->ip_dst, m->m_pkthdr.rcvif,
> -         m->m_pkthdr.ph_rtableid))) {
> -#else /* INET6 */
> -     if (IN_MULTICAST(ip->ip_dst.s_addr) ||
> -         in_broadcast(ip->ip_dst, m->m_pkthdr.rcvif,
> -             m->m_pkthdr.ph_rtableid)) {
> -#endif /* INET6 */
> +     if (m->m_flags & (M_BCAST|M_MCAST)) {
>               struct inpcb *last;
>               /*
>                * Deliver a multicast or broadcast datagram to *all* sockets
> Index: netinet6/ip6_input.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/netinet6/ip6_input.c,v
> retrieving revision 1.130
> diff -u -p -r1.130 ip6_input.c
> --- netinet6/ip6_input.c      14 Oct 2014 09:52:26 -0000      1.130
> +++ netinet6/ip6_input.c      19 Nov 2014 15:39:59 -0000
> @@ -398,6 +398,9 @@ ip6_input(struct mbuf *m)
>       if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) {
>               struct  in6_multi *in6m = 0;
>  
> +             /* Paranoia. */
> +             m->m_flags |= M_MCAST;
> +
>               in6_ifstat_inc(ifp, ifs6_in_mcast);
>               /*
>                * See if we belong to the destination multicast group on the
> 

-- 
:wq Claudio

Reply via email to