summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornet[shemminger]!shemminger <net[shemminger]!shemminger>2005-03-30 18:16:10 +0000
committernet[shemminger]!shemminger <net[shemminger]!shemminger>2005-03-30 18:16:10 +0000
commitf082b64fb40b467bc1f9e5d245114aae4e256d5c (patch)
tree3026f4779b181eb78b4c63f64e29289a4ebe264e
parent2cea8f2fb2a5aaad6f685b25d2f533e048c81414 (diff)
Import patch addr-del
(Logical change 1.178)
-rw-r--r--ChangeLog5
-rw-r--r--include/utils.h3
-rw-r--r--ip/ipaddress.c16
-rw-r--r--lib/utils.c1
4 files changed, 22 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 3d854fb3..087bc631 100644
--- 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.
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;
}
}