On Sat, Jan 21, 2017 at 01:28:02AM +0100, Claudio Jeker wrote: > On Fri, Jan 20, 2017 at 02:51:52AM +0100, Claudio Jeker wrote: > > I sent this diff out some time ago and would really like to get this in. > > This is one step on makeing rtsock.c less of a hornets nest. > > This reduces the side effects in route_output and simplifies some other > > bits as well. For example route_input is less variadic and simpler. > > > > Here is just the route_input change. Which should be easier to OK. > Changed a few things based on input from bluhm@
OK bluhm@ > > -- > :wq Claudio > > Index: net/rtsock.c > =================================================================== > RCS file: /cvs/src/sys/net/rtsock.c,v > retrieving revision 1.214 > diff -u -p -r1.214 rtsock.c > --- net/rtsock.c 20 Jan 2017 08:10:54 -0000 1.214 > +++ net/rtsock.c 21 Jan 2017 00:10:16 -0000 > @@ -92,7 +92,6 @@ > > struct sockaddr route_dst = { 2, PF_ROUTE, }; > struct sockaddr route_src = { 2, PF_ROUTE, }; > -struct sockproto route_proto = { PF_ROUTE, }; > > struct walkarg { > int w_op, w_arg, w_given, w_needed, w_tmemsize; > @@ -100,7 +99,7 @@ struct walkarg { > }; > > int route_ctloutput(int, struct socket *, int, int, struct mbuf **); > -void route_input(struct mbuf *m0, ...); > +void route_input(struct mbuf *m0, sa_family_t); > int route_arp_conflict(struct rtentry *, struct rt_addrinfo *); > int route_cleargateway(struct rtentry *, void *, unsigned int); > > @@ -332,7 +331,7 @@ rt_senddesync(void *data) > } > > void > -route_input(struct mbuf *m0, ...) > +route_input(struct mbuf *m0, sa_family_t sa_family) > { > struct rawcb *rp; > struct routecb *rop; > @@ -340,15 +339,10 @@ route_input(struct mbuf *m0, ...) > struct mbuf *m = m0; > int s, sockets = 0; > struct socket *last = NULL; > - va_list ap; > - struct sockproto *proto; > struct sockaddr *sosrc, *sodst; > > - va_start(ap, m0); > - proto = va_arg(ap, struct sockproto *); > - sosrc = va_arg(ap, struct sockaddr *); > - sodst = va_arg(ap, struct sockaddr *); > - va_end(ap); > + sosrc = &route_src; > + sodst = &route_dst; > > /* ensure that we can access the rtm_type via mtod() */ > if (m->m_len < offsetof(struct rt_msghdr, rtm_type) + 1) { > @@ -359,10 +353,16 @@ route_input(struct mbuf *m0, ...) > LIST_FOREACH(rp, &rawcb, rcb_list) { > if (rp->rcb_socket->so_state & SS_CANTRCVMORE) > continue; > - if (rp->rcb_proto.sp_family != proto->sp_family) > + if (rp->rcb_proto.sp_family != PF_ROUTE) > continue; > - if (rp->rcb_proto.sp_protocol && proto->sp_protocol && > - rp->rcb_proto.sp_protocol != proto->sp_protocol) > + /* > + * If route socket is bound to an address family only send > + * messages that match the address family. Address family > + * agnostic messages are always send. > + */ > + if (rp->rcb_proto.sp_protocol != AF_UNSPEC && > + sa_family != AF_UNSPEC && > + rp->rcb_proto.sp_protocol != sa_family) > continue; > /* > * We assume the lower level routines have > @@ -953,8 +953,6 @@ flush: > rtm->rtm_flags |= RTF_DONE; > } > } > - if (info.rti_info[RTAX_DST]) > - route_proto.sp_protocol = info.rti_info[RTAX_DST]->sa_family; > if (rt) > rtfree(rt); > > @@ -970,9 +968,8 @@ fail: > } > /* There is another listener, so construct message */ > rp = sotorawcb(so); > - } > - if (rp) > rp->rcb_proto.sp_family = 0; /* Avoid us */ > + } > if (rtm) { > if (m_copyback(m, 0, rtm->rtm_msglen, rtm, M_NOWAIT)) { > m_freem(m); > @@ -982,9 +979,10 @@ fail: > free(rtm, M_RTABLE, 0); > } > if (m) > - route_input(m, &route_proto, &route_src, &route_dst); > + route_input(m, info.rti_info[RTAX_DST] ? > + info.rti_info[RTAX_DST]->sa_family : AF_UNSPEC); > if (rp) > - rp->rcb_proto.sp_family = PF_ROUTE; > + rp->rcb_proto.sp_family = PF_ROUTE; /* Readd us */ > > return (error); > } > @@ -1056,7 +1054,6 @@ rt_setmetrics(u_long which, const struct > > out->rmx_expire = expire; > } > - /* RTV_PRIORITY handled before */ > } > > void > @@ -1258,11 +1255,7 @@ rt_missmsg(int type, struct rt_addrinfo > rtm->rtm_tableid = tableid; > rtm->rtm_addrs = rtinfo->rti_addrs; > rtm->rtm_index = ifidx; > - if (sa == NULL) > - route_proto.sp_protocol = 0; > - else > - route_proto.sp_protocol = sa->sa_family; > - route_input(m, &route_proto, &route_src, &route_dst); > + route_input(m, sa ? sa->sa_family : AF_UNSPEC); > } > > /* > @@ -1287,8 +1280,7 @@ rt_ifmsg(struct ifnet *ifp) > ifm->ifm_xflags = ifp->if_xflags; > ifm->ifm_data = ifp->if_data; > ifm->ifm_addrs = 0; > - route_proto.sp_protocol = 0; > - route_input(m, &route_proto, &route_src, &route_dst); > + route_input(m, AF_UNSPEC); > } > > /* > @@ -1324,11 +1316,7 @@ rt_sendaddrmsg(struct rtentry *rt, int c > ifam->ifam_addrs = info.rti_addrs; > ifam->ifam_tableid = ifp->if_rdomain; > > - if (ifa->ifa_addr == NULL) > - route_proto.sp_protocol = 0; > - else > - route_proto.sp_protocol = ifa->ifa_addr->sa_family; > - route_input(m, &route_proto, &route_src, &route_dst); > + route_input(m, ifa->ifa_addr ? ifa->ifa_addr->sa_family : AF_UNSPEC); > } > > /* > @@ -1350,8 +1338,7 @@ rt_ifannouncemsg(struct ifnet *ifp, int > ifan->ifan_index = ifp->if_index; > strlcpy(ifan->ifan_name, ifp->if_xname, sizeof(ifan->ifan_name)); > ifan->ifan_what = what; > - route_proto.sp_protocol = 0; > - route_input(m, &route_proto, &route_src, &route_dst); > + route_input(m, AF_UNSPEC); > } > > #ifdef BFD > @@ -1382,8 +1369,7 @@ rt_bfdmsg(struct bfd_config *bfd) > bfd2sa(bfd->bc_rt, &sa_bfd); > memcpy(&bfdm->bm_sa, &sa_bfd, sizeof(sa_bfd)); > > - route_proto.sp_protocol = info.rti_info[RTAX_DST]->sa_family; > - route_input(m, &route_proto, &route_src, &route_dst); > + route_input(m, info.rti_info[RTAX_DST]->sa_family); > } > #endif /* BFD */ > > @@ -1665,7 +1651,7 @@ extern struct domain routedomain; /* or > > struct protosw routesw[] = { > { SOCK_RAW, &routedomain, 0, PR_ATOMIC|PR_ADDR|PR_WANTRCVD, > - route_input, route_output, 0, route_ctloutput, > + 0, route_output, 0, route_ctloutput, > route_usrreq, > raw_init, 0, 0, 0, > sysctl_rtable,