route(4): Add ifam_pid and ifam_addrflags to ifa_msghdr
authorRoy Marples <roy@marples.name>
Thu, 12 Sep 2019 08:13:30 +0000 (09:13 +0100)
committerRoy Marples <roy@marples.name>
Thu, 12 Sep 2019 08:13:30 +0000 (09:13 +0100)
While here, re-arrange other route(4) message headers so the same
values appear in the same order for consistency.

Bump RTM_VERSION.

share/man/man4/route.4
sys/net/if.h
sys/net/route.h
sys/net/rtsock.c

index caa8b8f..0166355 100644 (file)
@@ -29,7 +29,7 @@
 .\" $FreeBSD: src/share/man/man4/route.4,v 1.9.2.6 2002/03/17 09:12:44 schweikh Exp $
 .\" $DragonFly: src/share/man/man4/route.4,v 1.3 2004/03/11 12:28:55 hmp Exp $
 .\"
-.Dd August 7, 2019
+.Dd September 12, 2019
 .Dt ROUTE 4
 .Os
 .Sh NAME
@@ -238,9 +238,9 @@ struct if_msghdr {
     u_short ifm_msglen;         /* to skip over non-understood messages */
     u_char  ifm_version;        /* future binary compatibility */
     u_char  ifm_type;           /* message type */
-    int     ifm_addrs;          /* like rtm_addrs */
-    int     ifm_flags;          /* value of if_flags */
     u_short ifm_index;          /* index for associated ifp */
+    int     ifm_flags;          /* value of if_flags */
+    int     ifm_addrs;          /* like rtm_addrs */
     struct  if_data ifm_data;   /* statistics and other data about if */
 };
 
@@ -248,9 +248,11 @@ struct ifa_msghdr {
     u_short ifam_msglen;        /* to skip over non-understood messages */
     u_char  ifam_version;       /* future binary compatibility */
     u_char  ifam_type;          /* message type */
-    int     ifam_addrs;         /* like rtm_addrs */
-    int     ifam_flags;         /* value of ifa_flags */
     u_short ifam_index;         /* index for associated ifp */
+    int     ifam_flags;         /* value of ifa_flags */
+    int     ifam_addrs;         /* like rtm_addrs */
+    pid_t   ifam_pid;           /* identify sender */
+    int     ifam_addrflags;    /* family specific address flags */
     int     ifam_metric;        /* value of ifa_metric */
 };
 
@@ -258,9 +260,9 @@ struct ifma_msghdr {
     u_short ifmam_msglen;       /* to skip over non-understood messages */
     u_char  ifmam_version;      /* future binary compatibility */
     u_char  ifmam_type;         /* message type */
-    int     ifmam_addrs;        /* like rtm_addrs */
-    int     ifmam_flags;        /* value of ifa_flags */
     u_short ifmam_index;        /* index for associated ifp */
+    int     ifmam_flags;        /* value of ifa_flags */
+    int     ifmam_addrs;        /* like rtm_addrs */
 };
 
 struct if_announcemsghdr {
index a5fd574..91cc8cd 100644 (file)
@@ -169,9 +169,9 @@ struct if_msghdr {
        u_short ifm_msglen;     /* to skip over non-understood messages */
        u_char  ifm_version;    /* future binary compatibility */
        u_char  ifm_type;       /* message type */
-       int     ifm_addrs;      /* like rtm_addrs */
-       int     ifm_flags;      /* value of if_flags */
        u_short ifm_index;      /* index for associated ifp */
+       int     ifm_flags;      /* value of if_flags */
+       int     ifm_addrs;      /* like rtm_addrs */
        struct  if_data ifm_data;/* statistics and other data about if */
 };
 
@@ -183,9 +183,11 @@ struct ifa_msghdr {
        u_short ifam_msglen;    /* to skip over non-understood messages */
        u_char  ifam_version;   /* future binary compatibility */
        u_char  ifam_type;      /* message type */
-       int     ifam_addrs;     /* like rtm_addrs */
-       int     ifam_flags;     /* value of ifa_flags */
        u_short ifam_index;     /* index for associated ifp */
+       int     ifam_flags;     /* value of ifa_flags */
+       int     ifam_addrs;     /* like rtm_addrs */
+       pid_t   ifam_pid;       /* identify sender */
+       int     ifam_addrflags; /* family specific address flags */
        int     ifam_metric;    /* value of ifa_metric */
 };
 
@@ -197,9 +199,9 @@ struct ifma_msghdr {
        u_short ifmam_msglen;   /* to skip over non-understood messages */
        u_char  ifmam_version;  /* future binary compatibility */
        u_char  ifmam_type;     /* message type */
-       int     ifmam_addrs;    /* like rtm_addrs */
-       int     ifmam_flags;    /* value of ifa_flags */
        u_short ifmam_index;    /* index for associated ifp */
+       int     ifmam_flags;    /* value of ifa_flags */
+       int     ifmam_addrs;    /* like rtm_addrs */
 };
 
 /*
index 54a4be5..1b8ddb5 100644 (file)
@@ -225,7 +225,7 @@ struct rt_msghdr {
        struct  rt_metrics rtm_rmx; /* metrics themselves */
 };
 
-#define RTM_VERSION    6       /* Up the ante and ignore older versions */
+#define RTM_VERSION    7       /* Up the ante and ignore older versions */
 
 /*
  * Message types.
index 43d48c1..2217aff 100644 (file)
@@ -142,6 +142,7 @@ static void rt_msg_buffer (int, struct rt_addrinfo *, void *buf, int len);
 static int     rt_msgsize(int type, const struct rt_addrinfo *rtinfo);
 static int     rt_xaddrs (char *, char *, struct rt_addrinfo *);
 static int     sysctl_rttable(int af, struct sysctl_req *req, int op, int arg);
+static int     if_addrflags(const struct ifaddr *ifa);
 static int     sysctl_iflist (int af, struct walkarg *w);
 static int     route_output(struct mbuf *, struct socket *, ...);
 static void    rt_setmetrics (u_long, struct rt_metrics *,
@@ -1151,9 +1152,11 @@ rt_ifamsg(int cmd, struct ifaddr *ifa)
 
        ifam = mtod(m, struct ifa_msghdr *);
        ifam->ifam_index = ifp->if_index;
-       ifam->ifam_metric = ifa->ifa_metric;
        ifam->ifam_flags = ifa->ifa_flags;
        ifam->ifam_addrs = rtinfo.rti_addrs;
+       ifam->ifam_pid = curproc->p_pid;
+       ifam->ifam_addrflags = if_addrflags(ifa);
+       ifam->ifam_metric = ifa->ifa_metric;
 
        rts_input(m, familyof(ifa->ifa_addr));
 }
@@ -1369,6 +1372,19 @@ ifnet_compute_stats(struct ifnet *ifp)
        IFNET_STAT_GET(ifp, oqdrops, ifp->if_oqdrops);
 }
 
+static int
+if_addrflags(const struct ifaddr *ifa)
+{
+       switch (ifa->ifa_addr->sa_family) {
+#ifdef INET6
+       case AF_INET6:
+               return ((const struct in6_ifaddr *)ifa)->ia6_flags;
+#endif
+       default:
+               return 0;
+       }
+}
+
 static int
 sysctl_iflist(int af, struct walkarg *w)
 {
@@ -1463,8 +1479,10 @@ sysctl_iflist(int af, struct walkarg *w)
 
                                ifam->ifam_index = ifa->ifa_ifp->if_index;
                                ifam->ifam_flags = ifa->ifa_flags;
-                               ifam->ifam_metric = ifa->ifa_metric;
                                ifam->ifam_addrs = rtinfo.rti_addrs;
+                               ifam->ifam_pid = 0 ;
+                               ifam->ifam_addrflags = if_addrflags(ifa);
+                               ifam->ifam_metric = ifa->ifa_metric;
                                error = SYSCTL_OUT(w->w_req, w->w_tmem, msglen);
                                if (error) {
                                        IFAFREE(ifa);