Import patch addr-del

(Logical change 1.178)
parent 2cea8f2f
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> 2005-03-30 Masahide NAKAMURA <nakam@linux-ipv6.org>
* ipv6 xfrm allocspi and monitor support. * ipv6 xfrm allocspi and monitor support.
......
...@@ -43,9 +43,12 @@ typedef struct ...@@ -43,9 +43,12 @@ typedef struct
__u8 family; __u8 family;
__u8 bytelen; __u8 bytelen;
__s16 bitlen; __s16 bitlen;
__u32 flags;
__u32 data[4]; __u32 data[4];
} inet_prefix; } inet_prefix;
#define PREFIXLEN_SPECIFIED 1
#define DN_MAXADDL 20 #define DN_MAXADDL 20
#ifndef AF_DECnet #ifndef AF_DECnet
#define AF_DECnet 12 #define AF_DECnet 12
......
...@@ -744,6 +744,7 @@ int ipaddr_modify(int cmd, int argc, char **argv) ...@@ -744,6 +744,7 @@ int ipaddr_modify(int cmd, int argc, char **argv)
} req; } req;
char *d = NULL; char *d = NULL;
char *l = NULL; char *l = NULL;
char *lcl_arg = NULL;
inet_prefix lcl; inet_prefix lcl;
inet_prefix peer; inet_prefix peer;
int local_len = 0; int local_len = 0;
...@@ -821,6 +822,7 @@ int ipaddr_modify(int cmd, int argc, char **argv) ...@@ -821,6 +822,7 @@ int ipaddr_modify(int cmd, int argc, char **argv)
usage(); usage();
if (local_len) if (local_len)
duparg2("local", *argv); duparg2("local", *argv);
lcl_arg = *argv;
get_prefix(&lcl, *argv, req.ifa.ifa_family); get_prefix(&lcl, *argv, req.ifa.ifa_family);
if (req.ifa.ifa_family == AF_UNSPEC) if (req.ifa.ifa_family == AF_UNSPEC)
req.ifa.ifa_family = lcl.family; req.ifa.ifa_family = lcl.family;
...@@ -838,9 +840,17 @@ int ipaddr_modify(int cmd, int argc, char **argv) ...@@ -838,9 +840,17 @@ int ipaddr_modify(int cmd, int argc, char **argv)
exit(1); exit(1);
} }
if (peer_len == 0 && local_len && cmd != RTM_DELADDR) { if (peer_len == 0 && local_len) {
peer = lcl; if (cmd == RTM_DELADDR && lcl.family == AF_INET && !(lcl.flags & PREFIXLEN_SPECIFIED)) {
addattr_l(&req.n, sizeof(req), IFA_ADDRESS, &lcl.data, lcl.bytelen); 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) if (req.ifa.ifa_prefixlen == 0)
req.ifa.ifa_prefixlen = lcl.bitlen; req.ifa.ifa_prefixlen = lcl.bitlen;
......
...@@ -241,6 +241,7 @@ int get_prefix_1(inet_prefix *dst, char *arg, int family) ...@@ -241,6 +241,7 @@ int get_prefix_1(inet_prefix *dst, char *arg, int family)
err = -1; err = -1;
goto done; goto done;
} }
dst->flags |= PREFIXLEN_SPECIFIED;
dst->bitlen = plen; dst->bitlen = plen;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment