]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: implement FreeBSD route attr handling
authorRafael Zalamena <rzalamena@opensourcerouting.org>
Tue, 8 Jan 2019 10:14:28 +0000 (08:14 -0200)
committerRafael Zalamena <rzalamena@opensourcerouting.org>
Tue, 8 Jan 2019 10:31:08 +0000 (08:31 -0200)
When porting routing socket macro data handling to functions, the
attribute function was forgotten. The only difference between the
attribute and address handler is the family type check.

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
zebra/kernel_socket.c

index 3e46a79e964191c82a1905abe12ab236a0bbb390..1f82c1d591c1a4065a0044edafb69666a677b0e8 100644 (file)
@@ -232,7 +232,9 @@ int dplane_routing_sock = -1;
 /* Yes I'm checking ugly routing socket behavior. */
 /* #define DEBUG */
 
+size_t _rta_get(caddr_t sap, void *destp, size_t destlen, bool checkaf);
 size_t rta_get(caddr_t sap, void *dest, size_t destlen);
+size_t rta_getattr(caddr_t sap, void *destp, size_t destlen);
 size_t rta_getsdlname(caddr_t sap, void *dest, short *destlen);
 
 /* Supported address family check. */
@@ -245,7 +247,7 @@ static inline int af_check(int family)
        return 0;
 }
 
-size_t rta_get(caddr_t sap, void *destp, size_t destlen)
+size_t _rta_get(caddr_t sap, void *destp, size_t destlen, bool checkaf)
 {
        struct sockaddr *sa = (struct sockaddr *)sap;
        uint8_t *dest = destp;
@@ -258,7 +260,10 @@ size_t rta_get(caddr_t sap, void *destp, size_t destlen)
        copylen = tlen = SAROUNDUP(sap);
 #endif /* !HAVE_STRUCT_SOCKADDR_SA_LEN */
 
-       if (copylen > 0 && dest != NULL && af_check(sa->sa_family)) {
+       if (copylen > 0 && dest != NULL) {
+               if (checkaf && af_check(sa->sa_family) == 0)
+                       return tlen;
+
                if (copylen > destlen) {
                        zlog_warn("%s: destination buffer too small (%lu vs %lu)",
                                  __func__, copylen, destlen);
@@ -270,6 +275,16 @@ size_t rta_get(caddr_t sap, void *destp, size_t destlen)
        return tlen;
 }
 
+size_t rta_get(caddr_t sap, void *destp, size_t destlen)
+{
+       return _rta_get(sap, destp, destlen, true);
+}
+
+size_t rta_getattr(caddr_t sap, void *destp, size_t destlen)
+{
+       return _rta_get(sap, destp, destlen, false);
+}
+
 size_t rta_getsdlname(caddr_t sap, void *destp, short *destlen)
 {
        struct sockaddr_dl *sdl = (struct sockaddr_dl *)sap;
@@ -684,7 +699,7 @@ static void ifam_read_mesg(struct ifa_msghdr *ifm, union sockunion *addr,
                        pnt += rta_get(pnt, &gateway, sizeof(gateway));
                        break;
                case RTA_NETMASK:
-                       pnt += rta_get(pnt, mask, sizeof(*mask));
+                       pnt += rta_getattr(pnt, mask, sizeof(*mask));
                        break;
                case RTA_IFP:
                        pnt += rta_getsdlname(pnt, ifname, ifnlen);