]> rtime.felk.cvut.cz Git - lisovros/iproute2_canprio.git/commitdiff
Import patch addr-del
authornet[shemminger]!shemminger <net[shemminger]!shemminger>
Wed, 30 Mar 2005 18:16:10 +0000 (18:16 +0000)
committernet[shemminger]!shemminger <net[shemminger]!shemminger>
Wed, 30 Mar 2005 18:16:10 +0000 (18:16 +0000)
(Logical change 1.178)

ChangeLog
include/utils.h
ip/ipaddress.c
lib/utils.c

index 3d854fb3b65c9e94ea4e5b153dd3f4949afb4e63..087bc6315c49eccda4e3515bd048bfd8dddb2d67 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2005-03-19  Thomas Graf <tgraf@suug.ch>
+
+       * Warn about wildcard deletions and provide IFA_ADDRESS upon
+         deletions to enforce prefix length validation for IPv4.
+
 2005-03-30  Masahide NAKAMURA <nakam@linux-ipv6.org>
        
        * ipv6 xfrm allocspi and monitor support.
index 906e394140c76d8451fa592b9dd0f73472d947e3..ddbf97c43a7253722a095ebc407b9f303cd9fade 100644 (file)
@@ -43,9 +43,12 @@ typedef struct
        __u8 family;
        __u8 bytelen;
        __s16 bitlen;
+       __u32 flags;
        __u32 data[4];
 } inet_prefix;
 
+#define PREFIXLEN_SPECIFIED 1
+
 #define DN_MAXADDL 20
 #ifndef AF_DECnet
 #define AF_DECnet 12
index 92f0089e81fd80e11bd8fa0ca14ba7bea84bbcd0..e8405f794cdbe22d766874e4a26c33ed5c2e9c9b 100644 (file)
@@ -744,6 +744,7 @@ int ipaddr_modify(int cmd, int argc, char **argv)
        } req;
        char  *d = NULL;
        char  *l = NULL;
+       char  *lcl_arg = NULL;
        inet_prefix lcl;
        inet_prefix peer;
        int local_len = 0;
@@ -821,6 +822,7 @@ int ipaddr_modify(int cmd, int argc, char **argv)
                                usage();
                        if (local_len)
                                duparg2("local", *argv);
+                       lcl_arg = *argv;
                        get_prefix(&lcl, *argv, req.ifa.ifa_family);
                        if (req.ifa.ifa_family == AF_UNSPEC)
                                req.ifa.ifa_family = lcl.family;
@@ -838,9 +840,17 @@ int ipaddr_modify(int cmd, int argc, char **argv)
                exit(1);
        }
 
-       if (peer_len == 0 && local_len && cmd != RTM_DELADDR) {
-               peer = lcl;
-               addattr_l(&req.n, sizeof(req), IFA_ADDRESS, &lcl.data, lcl.bytelen);
+       if (peer_len == 0 && local_len) {
+               if (cmd == RTM_DELADDR && lcl.family == AF_INET && !(lcl.flags & PREFIXLEN_SPECIFIED)) {
+                       fprintf(stderr,
+                           "Warning: Executing wildcard deletion to stay compatible with old scripts.\n" \
+                           "         Explicitly specify the prefix length (%s/%d) to avoid this warning.\n" \
+                           "         This special behaviour is likely to disappear in further releases,\n" \
+                           "         fix your scripts!\n", lcl_arg, local_len*8);
+               } else {
+                       peer = lcl;
+                       addattr_l(&req.n, sizeof(req), IFA_ADDRESS, &lcl.data, lcl.bytelen);
+               }
        }
        if (req.ifa.ifa_prefixlen == 0)
                req.ifa.ifa_prefixlen = lcl.bitlen;
index 73ce865dfdb1f981a25c20a7d1e813c7226e4a8a..df8795a2845daba2ab21f2cca21ca8ee7ec26cd1 100644 (file)
@@ -241,6 +241,7 @@ int get_prefix_1(inet_prefix *dst, char *arg, int family)
                                err = -1;
                                goto done;
                        }
+                       dst->flags |= PREFIXLEN_SPECIFIED;
                        dst->bitlen = plen;
                }
        }