On 25/04/14(Fri) 10:58, Stuart Henderson wrote:
> On 2014/04/24 16:41, Martin Pieuchot wrote:
> > in_localaddr() is used only once in our tree and only if the sysctl
> > net.inet.ip.mtudisc is set to 0.
> > 
> > It is used to optimize the size of the MSS if the forward address
> > correspond to a host on one of our subnets.  Since it's an
> > optimization for a special case that's not enabled by default, I'd
> > like to  kill it to remove one usage of the global list of IPv4 
> > addresses.
> 
> Is this definitely just an "optimization" or is it needed in order
> to set the correct mss on packets to a local destination?

It is just an optimization is will now use the default size defined
by net.inet.tcp.mssdflt as max instead of the mtu of the interface.

> (I do set mtudisc=0 on boxes doing dynamic routing, to avoid one
> source of cloned routes which sometimes get in the way when restarting
> routing protocol daemons).

Maybe it makes sense to be able to clean such routes instead.

> 
> > 
> > Index: netinet/in.c
> > ===================================================================
> > RCS file: /home/ncvs/src/sys/netinet/in.c,v
> > retrieving revision 1.95
> > diff -u -p -r1.95 in.c
> > --- netinet/in.c    10 Apr 2014 13:47:21 -0000      1.95
> > +++ netinet/in.c    24 Apr 2014 14:33:43 -0000
> > @@ -99,22 +99,6 @@ int in_scrubprefix(struct in_ifaddr *);
> >  int in_addhost(struct in_ifaddr *);
> >  int in_scrubhost(struct in_ifaddr *);
> >  
> > -/* Return 1 if an internet address is for a directly connected host */
> > -int
> > -in_localaddr(struct in_addr in, u_int rdomain)
> > -{
> > -   struct in_ifaddr *ia;
> > -
> > -   rdomain = rtable_l2(rdomain);
> > -   TAILQ_FOREACH(ia, &in_ifaddr, ia_list) {
> > -           if (ia->ia_ifp->if_rdomain != rdomain)
> > -                   continue;
> > -           if ((in.s_addr & ia->ia_netmask) == ia->ia_net)
> > -                   return (1);
> > -   }
> > -   return (0);
> > -}
> > -
> >  /*
> >   * Determine whether an IP address is in a reserved set of addresses
> >   * that may not be forwarded, or whether datagrams to that destination
> > Index: netinet/in.h
> > ===================================================================
> > RCS file: /home/ncvs/src/sys/netinet/in.h,v
> > retrieving revision 1.107
> > diff -u -p -r1.107 in.h
> > --- netinet/in.h    21 Apr 2014 10:07:58 -0000      1.107
> > +++ netinet/in.h    24 Apr 2014 14:33:43 -0000
> > @@ -778,7 +778,6 @@ int        in_broadcast(struct in_addr, stru
> >  int           in_canforward(struct in_addr);
> >  int           in_cksum(struct mbuf *, int);
> >  int           in4_cksum(struct mbuf *, u_int8_t, int, int);
> > -int           in_localaddr(struct in_addr, u_int);
> >  void          in_proto_cksum_out(struct mbuf *, struct ifnet *);
> >  void          in_ifdetach(struct ifnet *);
> >  int           in_mask2len(struct in_addr *);
> > Index: netinet/tcp_input.c
> > ===================================================================
> > RCS file: /home/ncvs/src/sys/netinet/tcp_input.c,v
> > retrieving revision 1.275
> > diff -u -p -r1.275 tcp_input.c
> > --- netinet/tcp_input.c     21 Apr 2014 12:22:26 -0000      1.275
> > +++ netinet/tcp_input.c     24 Apr 2014 14:33:43 -0000
> > @@ -3040,7 +3040,6 @@ tcp_mss(struct tcpcb *tp, int offer)
> >             goto out;
> >     }
> >  
> > -#ifdef RTV_MTU
> >     /*
> >      * if there's an mtu associated with the route and we support
> >      * path MTU discovery for the underlying protocol family, use it.
> > @@ -3058,23 +3057,21 @@ tcp_mss(struct tcpcb *tp, int offer)
> >                      */
> >                     mss = IPV6_MMTU - iphlen - sizeof(struct ip6_frag) -
> >                         sizeof(struct tcphdr);
> > -           } else
> > -                   mss = rt->rt_rmx.rmx_mtu - iphlen - sizeof(struct 
> > tcphdr);
> > -   } else
> > -#endif /* RTV_MTU */
> > -   if (!ifp)
> > +           } else {
> > +                   mss = rt->rt_rmx.rmx_mtu - iphlen -
> > +                       sizeof(struct tcphdr);
> > +           }
> > +   } else if (!ifp) {
> >             /*
> >              * ifp may be null and rmx_mtu may be zero in certain
> >              * v6 cases (e.g., if ND wasn't able to resolve the
> >              * destination host.
> >              */
> >             goto out;
> > -   else if (ifp->if_flags & IFF_LOOPBACK)
> > +   } else if (ifp->if_flags & IFF_LOOPBACK) {
> >             mss = ifp->if_mtu - iphlen - sizeof(struct tcphdr);
> > -   else if (tp->pf == AF_INET) {
> > +   } else if (tp->pf == AF_INET) {
> >             if (ip_mtudisc)
> > -                   mss = ifp->if_mtu - iphlen - sizeof(struct tcphdr);
> > -           else if (inp && in_localaddr(inp->inp_faddr, inp->inp_rtableid))
> >                     mss = ifp->if_mtu - iphlen - sizeof(struct tcphdr);
> >     }
> >  #ifdef INET6
> > 
> 

Reply via email to