diff options
author | net[shemminger]!shemminger <net[shemminger]!shemminger> | 2005-03-30 18:16:10 +0000 |
---|---|---|
committer | net[shemminger]!shemminger <net[shemminger]!shemminger> | 2005-03-30 18:16:10 +0000 |
commit | f082b64fb40b467bc1f9e5d245114aae4e256d5c (patch) | |
tree | 3026f4779b181eb78b4c63f64e29289a4ebe264e | |
parent | 2cea8f2fb2a5aaad6f685b25d2f533e048c81414 (diff) |
Import patch addr-del
(Logical change 1.178)
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | include/utils.h | 3 | ||||
-rw-r--r-- | ip/ipaddress.c | 16 | ||||
-rw-r--r-- | lib/utils.c | 1 |
4 files changed, 22 insertions, 3 deletions
@@ -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. diff --git a/include/utils.h b/include/utils.h index 906e3941..ddbf97c4 100644 --- a/include/utils.h +++ b/include/utils.h @@ -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 diff --git a/ip/ipaddress.c b/ip/ipaddress.c index 92f0089e..e8405f79 100644 --- a/ip/ipaddress.c +++ b/ip/ipaddress.c @@ -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; diff --git a/lib/utils.c b/lib/utils.c index 73ce865d..df8795a2 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -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; } } |