Accessing/modifying route without lock in ip_output

Sechang Son sonsechang at gmail.com
Thu Mar 21 16:44:06 UTC 2013


Hi,

It seems that route entry (i.e. ro->ro_rt) is read/modified without lock in
ip_output. The code snippet below is from FreeBSD 10 and other releases are
similar to this. Can somebody tell me why it is okay or a design decision of
doing this? Appreciated in advance...

  114 int
  115 ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int
flags,
  116     struct ip_moptions *imo, struct inpcb *inp)
  117 {
...
  268                 if (rte == NULL) {
  269 #ifdef RADIX_MPATH
  270                         rtalloc_mpath_fib(ro,
  271                             ntohl(ip->ip_src.s_addr ^
ip->ip_dst.s_addr),
  272                             inp ? inp->inp_inc.inc_fibnum :
M_GETFIB(m));
  273 #else
  274                         in_rtalloc_ign(ro, 0,
  275                             inp ? inp->inp_inc.inc_fibnum :
M_GETFIB(m));
  276 #endif
  277                         rte = ro->ro_rt;      <====== Note that
ro->ro_rt is not locked here...
...
  310         if (rte != NULL && (rte->rt_flags & (RTF_UP|RTF_HOST))) {
  311                 /*
  312                  * This case can happen if the user changed the MTU
  313                  * of an interface after enabling IP on it.  Because
  314                  * most netifs don't keep track of routes pointing to
  315                  * them, there is no way for one to update all its
  316                  * routes when the MTU is changed.
  317                  */
  318                 if (rte->rt_rmx.rmx_mtu > ifp->if_mtu)
  319                         rte->rt_rmx.rmx_mtu = ifp->if_mtu;
  320                 mtu = rte->rt_rmx.rmx_mtu;

- Sonny



More information about the freebsd-net mailing list