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