[PATCH 2/3] ip: Add support for "noprefixroute" option
Denys Vlasenko
vda.linux at googlemail.com
Fri Jul 31 16:48:22 UTC 2020
Applied, thanks
On Mon, Jun 29, 2020 at 6:32 PM Christian Eggers <ceggers at arri.de> wrote:
>
> The "noprefixroute" option suppresses automatic generation of a routing
> table entry based on the interface's ip address.
>
> The ifa_flags field has only 8 bit. If higher bits are set,
> rta_tb[IFA_FLAGS] has to be used instead.
>
> Signed-off-by: Christian Eggers <ceggers at arri.de>
> ---
> networking/ip.c | 4 ++-
> networking/libiproute/ipaddress.c | 45 ++++++++++++++++++++-----------
> 2 files changed, 33 insertions(+), 16 deletions(-)
>
> diff --git a/networking/ip.c b/networking/ip.c
> index 034ee4fc8..45bf1dc0a 100644
> --- a/networking/ip.c
> +++ b/networking/ip.c
> @@ -146,11 +146,13 @@
> //usage:#define ipaddr_trivial_usage
> //usage: "add|del IFADDR dev IFACE | show|flush [dev IFACE] [to PREFIX]"
> //usage:#define ipaddr_full_usage "\n\n"
> -//usage: "ipaddr add|change|replace|delete dev IFACE IFADDR\n"
> +//usage: "ipaddr add|change|replace|delete dev IFACE [CONFFLAG-LIST] IFADDR\n"
> //usage: " IFADDR := PREFIX | ADDR peer PREFIX [broadcast ADDR|+|-]\n"
> //usage: " [anycast ADDR] [label STRING] [scope SCOPE]\n"
> //usage: " PREFIX := ADDR[/MASK]\n"
> //usage: " SCOPE := [host|link|global|NUMBER]\n"
> +//usage: " CONFFLAG-LIST := [CONFFLAG-LIST] CONFFLAG\n"
> +//usage: " CONFFLAG := [noprefixroute]\n"
> //usage: "ipaddr show|flush [dev IFACE] [scope SCOPE] [to PREFIX] [label PATTERN]"
> //usage:
> //--------------123456789.123456789.123456789.123456789.123456789.123456789.123456789.123....79
> diff --git a/networking/libiproute/ipaddress.c b/networking/libiproute/ipaddress.c
> index 86cf3beea..6cfd3c398 100644
> --- a/networking/libiproute/ipaddress.c
> +++ b/networking/libiproute/ipaddress.c
> @@ -217,6 +217,7 @@ static int FAST_FUNC print_addrinfo(const struct sockaddr_nl *who UNUSED_PARAM,
> {
> struct ifaddrmsg *ifa = NLMSG_DATA(n);
> int len = n->nlmsg_len;
> + unsigned int ifa_flags;
> struct rtattr *rta_tb[IFA_MAX+1];
>
> if (n->nlmsg_type != RTM_NEWADDR && n->nlmsg_type != RTM_DELADDR)
> @@ -233,6 +234,8 @@ static int FAST_FUNC print_addrinfo(const struct sockaddr_nl *who UNUSED_PARAM,
> //memset(rta_tb, 0, sizeof(rta_tb)); - parse_rtattr does this
> parse_rtattr(rta_tb, IFA_MAX, IFA_RTA(ifa), n->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa)));
>
> + ifa_flags = rta_tb[IFA_FLAGS] ? *(__u32*)RTA_DATA(rta_tb[IFA_FLAGS]) : ifa->ifa_flags;
> +
> if (!rta_tb[IFA_LOCAL])
> rta_tb[IFA_LOCAL] = rta_tb[IFA_ADDRESS];
> if (!rta_tb[IFA_ADDRESS])
> @@ -242,7 +245,7 @@ static int FAST_FUNC print_addrinfo(const struct sockaddr_nl *who UNUSED_PARAM,
> return 0;
> if ((G_filter.scope ^ ifa->ifa_scope) & G_filter.scopemask)
> return 0;
> - if ((G_filter.flags ^ ifa->ifa_flags) & G_filter.flagmask)
> + if ((G_filter.flags ^ ifa_flags) & G_filter.flagmask)
> return 0;
> if (G_filter.label) {
> const char *label;
> @@ -322,28 +325,32 @@ static int FAST_FUNC print_addrinfo(const struct sockaddr_nl *who UNUSED_PARAM,
> );
> }
> printf("scope %s ", rtnl_rtscope_n2a(ifa->ifa_scope));
> - if (ifa->ifa_flags & IFA_F_SECONDARY) {
> - ifa->ifa_flags &= ~IFA_F_SECONDARY;
> + if (ifa_flags & IFA_F_SECONDARY) {
> + ifa_flags &= ~IFA_F_SECONDARY;
> printf("secondary ");
> }
> - if (ifa->ifa_flags & IFA_F_TENTATIVE) {
> - ifa->ifa_flags &= ~IFA_F_TENTATIVE;
> + if (ifa_flags & IFA_F_TENTATIVE) {
> + ifa_flags &= ~IFA_F_TENTATIVE;
> printf("tentative ");
> }
> - if (ifa->ifa_flags & IFA_F_DADFAILED) {
> - ifa->ifa_flags &= ~IFA_F_DADFAILED;
> + if (ifa_flags & IFA_F_DADFAILED) {
> + ifa_flags &= ~IFA_F_DADFAILED;
> printf("dadfailed ");
> }
> - if (ifa->ifa_flags & IFA_F_DEPRECATED) {
> - ifa->ifa_flags &= ~IFA_F_DEPRECATED;
> + if (ifa_flags & IFA_F_DEPRECATED) {
> + ifa_flags &= ~IFA_F_DEPRECATED;
> printf("deprecated ");
> }
> - if (!(ifa->ifa_flags & IFA_F_PERMANENT)) {
> + if (!(ifa_flags & IFA_F_PERMANENT)) {
> printf("dynamic ");
> } else
> - ifa->ifa_flags &= ~IFA_F_PERMANENT;
> - if (ifa->ifa_flags)
> - printf("flags %02x ", ifa->ifa_flags);
> + ifa_flags &= ~IFA_F_PERMANENT;
> + if (ifa_flags & IFA_F_NOPREFIXROUTE) {
> + ifa_flags &= ~IFA_F_NOPREFIXROUTE;
> + printf("noprefixroute ");
> + }
> + if (ifa_flags)
> + printf("flags %02x ", ifa_flags);
> if (rta_tb[IFA_LABEL])
> fputs((char*)RTA_DATA(rta_tb[IFA_LABEL]), stdout);
> if (rta_tb[IFA_CACHEINFO]) {
> @@ -600,7 +607,7 @@ static int ipaddr_modify(int cmd, int flags, char **argv)
> /* If you add stuff here, update ipaddr_full_usage */
> static const char option[] ALIGN1 =
> "peer\0""remote\0""broadcast\0""brd\0"
> - "anycast\0""scope\0""dev\0""label\0""local\0";
> + "anycast\0""scope\0""dev\0""label\0""noprefixroute\0""local\0";
> #define option_peer option
> #define option_broadcast (option + sizeof("peer") + sizeof("remote"))
> #define option_anycast (option_broadcast + sizeof("broadcast") + sizeof("brd"))
> @@ -619,6 +626,7 @@ static int ipaddr_modify(int cmd, int flags, char **argv)
> int brd_len = 0;
> int any_len = 0;
> bool scoped = 0;
> + unsigned int ifa_flags = 0;
>
> memset(&req, 0, sizeof(req));
>
> @@ -630,7 +638,7 @@ static int ipaddr_modify(int cmd, int flags, char **argv)
> while (*argv) {
> unsigned arg = index_in_strings(option, *argv);
> /* if search fails, "local" is assumed */
> - if ((int)arg >= 0)
> + if ((int)arg >= 0 && arg != 8)
> NEXT_ARG();
>
> if (arg <= 1) { /* peer, remote */
> @@ -683,6 +691,8 @@ static int ipaddr_modify(int cmd, int flags, char **argv)
> } else if (arg == 7) { /* label */
> l = *argv;
> addattr_l(&req.n, sizeof(req), IFA_LABEL, l, strlen(l) + 1);
> + } else if (arg == 8) { /* noprefixroute */
> + ifa_flags |= IFA_F_NOPREFIXROUTE;
> } else {
> /* local (specified or assumed) */
> if (local_len) {
> @@ -698,6 +708,11 @@ static int ipaddr_modify(int cmd, int flags, char **argv)
> argv++;
> }
>
> + if (ifa_flags <= 0xff)
> + req.ifa.ifa_flags = ifa_flags;
> + else
> + addattr32(&req.n, sizeof(req), IFA_FLAGS, ifa_flags);
> +
> if (!d) {
> /* There was no "dev IFACE", but we need that */
> bb_simple_error_msg_and_die("need \"dev IFACE\"");
> --
> Christian Eggers
> Embedded software developer
>
> Arnold & Richter Cine Technik GmbH & Co. Betriebs KG
> Sitz: Muenchen - Registergericht: Amtsgericht Muenchen - Handelsregisternummer: HRA 57918
> Persoenlich haftender Gesellschafter: Arnold & Richter Cine Technik GmbH
> Sitz: Muenchen - Registergericht: Amtsgericht Muenchen - Handelsregisternummer: HRB 54477
> Geschaeftsfuehrer: Dr. Michael Neuhaeuser; Stephan Schenk; Walter Trauninger; Markus Zeiler
>
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
More information about the busybox
mailing list