On Mon, Jun 11, 2018 at 10:13:36AM +0200, Bastien Durel wrote:
> Because it's lower than RTP_CONNECTED and I don't know what it is. The
> /* local address routes (must be the highest) */ comment makes me think
> it MAY be 127.0.0.0/8 or ::1/128 (useless for rtadvd then), but it may
> be related to interface addresses; I did not check in the kernel code
> how this flag is set. (hence the question marks)
>
RTP_LOCAL are local addresses, they won't pass the test at L367 of rtadvd.c
anyway.
Here is a diff if you want to try :
Index: if.c
===================================================================
RCS file: /cvs/src/usr.sbin/rtadvd/if.c,v
retrieving revision 1.46
diff -u -p -r1.46 if.c
--- if.c 12 Aug 2017 07:38:26 -0000 1.46
+++ if.c 17 Jun 2018 19:37:55 -0000
@@ -285,6 +285,14 @@ get_ifm_flags(char *buf)
return (ifm->ifm_flags);
}
+u_char
+get_priority(char *buf)
+{
+ struct rt_msghdr *rtm = (struct rt_msghdr *)buf;
+
+ return (rtm->rtm_priority);
+}
+
int
get_prefixlen(char *buf)
{
Index: if.h
===================================================================
RCS file: /cvs/src/usr.sbin/rtadvd/if.h,v
retrieving revision 1.14
diff -u -p -r1.14 if.h
--- if.h 10 Aug 2017 19:07:14 -0000 1.14
+++ if.h 17 Jun 2018 19:37:55 -0000
@@ -45,6 +45,7 @@ struct in6_addr *get_addr(char *);
int get_rtm_ifindex(char *);
int get_ifm_ifindex(char *);
int get_ifam_ifindex(char *);
+u_char get_priority(char *);
int get_ifm_flags(char *);
int get_prefixlen(char *);
int prefixlen(u_char *, u_char *);
Index: rtadvd.c
===================================================================
RCS file: /cvs/src/usr.sbin/rtadvd/rtadvd.c,v
retrieving revision 1.91
diff -u -p -r1.91 rtadvd.c
--- rtadvd.c 22 Aug 2017 01:44:09 -0000 1.91
+++ rtadvd.c 17 Jun 2018 19:37:55 -0000
@@ -309,7 +309,7 @@ rtsock_cb(int fd, short event, void *arg
{
int n, type, ifindex = 0, oldifflags, plen;
char *rtm;
- u_char ifname[IF_NAMESIZE];
+ u_char ifname[IF_NAMESIZE], prio;
struct prefix *prefix;
struct rainfo *rai;
struct in6_addr *addr;
@@ -362,6 +362,11 @@ rtsock_cb(int fd, short event, void *arg
addr = get_addr(rtm);
plen = get_prefixlen(rtm);
+ prio = get_priority(rtm);
+
+ if (!(prio & RTP_CONNECTED))
+ break;
+
/* sanity check for plen */
/* as RFC2373, prefixlen is at least 4 */
if (plen < 4 || plen > 127) {