Date: Thu, 21 Mar 2013 09:44:02 -0700 From: "Sechang Son" <sonsechang@gmail.com> To: "'freebsd-net'" <freebsd-net@freebsd.org> Subject: Accessing/modifying route without lock in ip_output Message-ID: <01e701ce2653$4c23f8d0$e46bea70$@gmail.com>
next in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?01e701ce2653$4c23f8d0$e46bea70$>