On 07/06/16 18:07, Martin Pieuchot wrote: > KAME people started putting multicast addresses in the routing table. > But since it hasn't been designed for that they used workarounds. > > I believe it's time to embrace and consolidate this choice. > > . The first reason is that multicast address are not going away from > the routing table, thanks to IPv6. > > . The second reason is that using the routing table for mcast group > lookup would make them MP-safe for free. > > . Finally adding joined groups in the routing table would allow user > to see which multicast addresses are accepted by which interface. > > Since we are already late in the 6.0 release cycle I don't plan to change > much for now. However Aaron Riekenberg reported [0] a leak due to one > of the existing workaround. The proper way to fix the leak would be to > introduce the RTF_MULTICAST flag and use it instead of RTF_CLONING. > > Diff below does that and reuses the 'm' marker for displaying such route > entries in route(8) and netstat(1). Man page bits are for the moment > missing. > > Comments? Oks?
I got one ok for that, any other comment? > > [0] http://marc.info/?l=openbsd-misc&m=146676764030238&w=2 > > Index: sys/net/route.h > =================================================================== > RCS file: /cvs/src/sys/net/route.h,v > retrieving revision 1.138 > diff -u -p -r1.138 route.h > --- sys/net/route.h 14 Jun 2016 09:48:52 -0000 1.138 > +++ sys/net/route.h 5 Jul 2016 14:28:22 -0000 > @@ -131,7 +131,7 @@ struct rtentry { > #define RTF_DONE 0x40 /* message confirmed */ > #define RTF_MASK 0x80 /* subnet mask present */ > #define RTF_CLONING 0x100 /* generate new routes on use */ > -/* 0x200 unused */ > +#define RTF_MULTICAST 0x200 /* route associated to a mcast > addr. */ > #define RTF_LLINFO 0x400 /* generated by ARP or ND */ > #define RTF_STATIC 0x800 /* manually added */ > #define RTF_BLACKHOLE 0x1000 /* just discard pkts (during > updates) */ > Index: sys/netinet/if_ether.c > =================================================================== > RCS file: /cvs/src/sys/netinet/if_ether.c,v > retrieving revision 1.216 > diff -u -p -r1.216 if_ether.c > --- sys/netinet/if_ether.c 28 Jun 2016 17:18:24 -0000 1.216 > +++ sys/netinet/if_ether.c 5 Jul 2016 14:34:10 -0000 > @@ -139,7 +139,7 @@ arp_rtrequest(struct ifnet *ifp, int req > timeout_add_sec(&arptimer_to, 1); > } > > - if (rt->rt_flags & (RTF_GATEWAY|RTF_BROADCAST)) > + if (ISSET(rt->rt_flags, RTF_GATEWAY|RTF_BROADCAST|RTF_MULTICAST)) > return; > > switch (req) { > Index: sys/netinet6/in6.c > =================================================================== > RCS file: /cvs/src/sys/netinet6/in6.c,v > retrieving revision 1.188 > diff -u -p -r1.188 in6.c > --- sys/netinet6/in6.c 5 Jul 2016 10:17:14 -0000 1.188 > +++ sys/netinet6/in6.c 5 Jul 2016 14:19:36 -0000 > @@ -757,8 +757,7 @@ in6_update_ifa(struct ifnet *ifp, struct > info.rti_info[RTAX_GATEWAY] = sin6tosa(&ia6->ia_addr); > info.rti_info[RTAX_NETMASK] = sin6tosa(&mltmask); > info.rti_info[RTAX_IFA] = sin6tosa(&ia6->ia_addr); > - /* XXX: we need RTF_CLONING to fake nd6_rtrequest */ > - info.rti_flags = RTF_CLONING; > + info.rti_flags = RTF_MULTICAST; > error = rtrequest(RTM_ADD, &info, RTP_CONNECTED, NULL, > ifp->if_rdomain); > if (error) > @@ -814,7 +813,7 @@ in6_update_ifa(struct ifnet *ifp, struct > info.rti_info[RTAX_GATEWAY] = sin6tosa(&ia6->ia_addr); > info.rti_info[RTAX_NETMASK] = sin6tosa(&mltmask); > info.rti_info[RTAX_IFA] = sin6tosa(&ia6->ia_addr); > - info.rti_flags = RTF_CLONING; > + info.rti_flags = RTF_MULTICAST; > error = rtrequest(RTM_ADD, &info, RTP_CONNECTED, NULL, > ifp->if_rdomain); > if (error) > Index: sys/netinet6/nd6.c > =================================================================== > RCS file: /cvs/src/sys/netinet6/nd6.c,v > retrieving revision 1.186 > diff -u -p -r1.186 nd6.c > --- sys/netinet6/nd6.c 15 Jun 2016 11:49:34 -0000 1.186 > +++ sys/netinet6/nd6.c 5 Jul 2016 14:34:55 -0000 > @@ -882,7 +882,7 @@ nd6_rtrequest(struct ifnet *ifp, int req > dr->installed = 0; > } > > - if ((rt->rt_flags & RTF_GATEWAY) != 0) > + if (ISSET(rt->rt_flags, RTF_GATEWAY|RTF_MULTICAST)) > return; > > if (nd6_need_cache(ifp) == 0 && (rt->rt_flags & RTF_HOST) == 0) { > Index: sbin/route/show.c > =================================================================== > RCS file: /cvs/src/sbin/route/show.c,v > retrieving revision 1.103 > diff -u -p -r1.103 show.c > --- sbin/route/show.c 27 Nov 2015 16:26:52 -0000 1.103 > +++ sbin/route/show.c 5 Jul 2016 14:18:24 -0000 > @@ -78,8 +78,8 @@ static const struct bits bits[] = { > { RTF_DYNAMIC, 'D' }, > { RTF_MODIFIED, 'M' }, > { RTF_DONE, 'd' }, /* Completed -- for routing messages only */ > - { RTF_MASK, 'm' }, /* Mask Present -- for routing messages only */ > { RTF_CLONING, 'C' }, > + { RTF_MULTICAST,'m' }, > { RTF_LLINFO, 'L' }, > { RTF_STATIC, 'S' }, > { RTF_PROTO1, '1' }, > Index: usr.bin/netstat/show.c > =================================================================== > RCS file: /cvs/src/usr.bin/netstat/show.c,v > retrieving revision 1.49 > diff -u -p -r1.49 show.c > --- usr.bin/netstat/show.c 11 Sep 2015 20:10:26 -0000 1.49 > +++ usr.bin/netstat/show.c 5 Jul 2016 14:20:05 -0000 > @@ -78,8 +78,8 @@ static const struct bits bits[] = { > { RTF_DYNAMIC, 'D' }, > { RTF_MODIFIED, 'M' }, > { RTF_DONE, 'd' }, /* Completed -- for routing messages only */ > - { RTF_MASK, 'm' }, /* Mask Present -- for routing messages only */ > { RTF_CLONING, 'C' }, > + { RTF_MULTICAST,'m' }, > { RTF_LLINFO, 'L' }, > { RTF_STATIC, 'S' }, > { RTF_PROTO1, '1' }, > Index: usr.sbin/route6d/route6d.c > =================================================================== > RCS file: /cvs/src/usr.sbin/route6d/route6d.c,v > retrieving revision 1.86 > diff -u -p -r1.86 route6d.c > --- usr.sbin/route6d/route6d.c 25 Jan 2016 05:15:43 -0000 1.86 > +++ usr.sbin/route6d/route6d.c 5 Jul 2016 14:24:03 -0000 > @@ -2319,45 +2319,16 @@ do { \ > RTFLAG("D", RTF_DYNAMIC); > RTFLAG("M", RTF_MODIFIED); > RTFLAG("d", RTF_DONE); > -#ifdef RTF_MASK > - RTFLAG("m", RTF_MASK); > -#endif > + RTFLAG("m", RTF_MULTICAST); > RTFLAG("C", RTF_CLONING); > -#ifdef RTF_CLONED > RTFLAG("c", RTF_CLONED); > -#endif > -#ifdef RTF_PRCLONING > - RTFLAG("c", RTF_PRCLONING); > -#endif > -#ifdef RTF_WASCLONED > - RTFLAG("W", RTF_WASCLONED); > -#endif > RTFLAG("L", RTF_LLINFO); > RTFLAG("S", RTF_STATIC); > RTFLAG("B", RTF_BLACKHOLE); > -#ifdef RTF_PROTO3 > RTFLAG("3", RTF_PROTO3); > -#endif > RTFLAG("2", RTF_PROTO2); > RTFLAG("1", RTF_PROTO1); > -#ifdef RTF_BROADCAST > RTFLAG("b", RTF_BROADCAST); > -#endif > -#ifdef RTF_DEFAULT > - RTFLAG("d", RTF_DEFAULT); > -#endif > -#ifdef RTF_ISAROUTER > - RTFLAG("r", RTF_ISAROUTER); > -#endif > -#ifdef RTF_TUNNEL > - RTFLAG("T", RTF_TUNNEL); > -#endif > -#ifdef RTF_AUTH > - RTFLAG("A", RTF_AUTH); > -#endif > -#ifdef RTF_CRYPT > - RTFLAG("E", RTF_CRYPT); > -#endif > #undef RTFLAG > return buf; > } > Index: share/man/man4/route.4 > =================================================================== > RCS file: /cvs/src/share/man/man4/route.4,v > retrieving revision 1.40 > diff -u -p -r1.40 route.4 > --- share/man/man4/route.4 23 Mar 2016 12:57:53 -0000 1.40 > +++ share/man/man4/route.4 5 Jul 2016 14:22:27 -0000 > @@ -358,6 +358,7 @@ Flags include the values: > #define RTF_DONE 0x40 /* message confirmed */ > #define RTF_MASK 0x80 /* subnet mask present */ > #define RTF_CLONING 0x100 /* generate new routes on use */ > +#define RTF_MULTICAST 0x200 /* route associated to a mcast addr. */ > #define RTF_LLINFO 0x400 /* generated by ARP or NDP */ > #define RTF_STATIC 0x800 /* manually added */ > #define RTF_BLACKHOLE 0x1000 /* just discard pkts (during updates) */ >
