]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
Merge branch 'master' into net-next
authorStephen Hemminger <stephen@networkplumber.org>
Fri, 13 Jan 2017 01:44:44 +0000 (17:44 -0800)
committerStephen Hemminger <stephen@networkplumber.org>
Fri, 13 Jan 2017 01:44:44 +0000 (17:44 -0800)
16 files changed:
bridge/Makefile
bridge/fdb.c
etc/iproute2/nl_protos
etc/iproute2/rt_protos.d/README [new file with mode: 0644]
etc/iproute2/rt_tables.d/README
ip/ip6tunnel.c
ip/ipvrf.c
lib/Makefile
lib/fs.c
lib/rt_names.c
man/man3/libnetlink.3
man/man8/.gitignore
man/man8/bridge.8
man/man8/tc-ife.8
netem/Makefile
tc/m_xt.c

index 7203f70bc51013eed37ea38090241fe99a35bc76..634c370a3c0129a93cbf55b8b8908b0bdb9ee23a 100644 (file)
@@ -8,7 +8,7 @@ endif
 
 all: bridge
 
-bridge: $(BROBJ) $(LIBNETLINK) 
+bridge: $(BROBJ) $(LIBNETLINK)
        $(QUIET_LINK)$(CC) $^ $(LDFLAGS) $(LDLIBS) -o $@
 
 install: all
@@ -16,4 +16,3 @@ install: all
 
 clean:
        rm -f $(BROBJ) bridge
-
index a91521776e99043d32cb723986f298f702f1c6a4..a71a78f23b202e8e3fd8742345a6c8c3ecefca4e 100644 (file)
@@ -29,7 +29,7 @@
 #include "rt_names.h"
 #include "utils.h"
 
-static unsigned int filter_index, filter_vlan;
+static unsigned int filter_index, filter_vlan, filter_state;
 
 json_writer_t *jw_global;
 
@@ -39,7 +39,7 @@ static void usage(void)
                        "              [ self ] [ master ] [ use ] [ router ]\n"
                        "              [ local | static | dynamic ] [ dst IPADDR ] [ vlan VID ]\n"
                        "              [ port PORT] [ vni VNI ] [ via DEV ]\n");
-       fprintf(stderr, "       bridge fdb [ show [ br BRDEV ] [ brport DEV ] [ vlan VID ] ]\n");
+       fprintf(stderr, "       bridge fdb [ show [ br BRDEV ] [ brport DEV ] [ vlan VID ] [ state STATE ] ]\n");
        exit(-1);
 }
 
@@ -63,6 +63,24 @@ static const char *state_n2a(unsigned int s)
        return buf;
 }
 
+static int state_a2n(unsigned int *s, const char *arg)
+{
+       if (matches(arg, "permanent") == 0)
+               *s = NUD_PERMANENT;
+       else if (matches(arg, "static") == 0 || matches(arg, "temp") == 0)
+               *s = NUD_NOARP;
+       else if (matches(arg, "stale") == 0)
+               *s = NUD_STALE;
+       else if (matches(arg, "reachable") == 0 || matches(arg, "dynamic") == 0)
+               *s = NUD_REACHABLE;
+       else if (strcmp(arg, "all") == 0)
+               *s = ~0;
+       else if (get_unsigned(s, arg, 0))
+               return -1;
+
+       return 0;
+}
+
 static void start_json_fdb_flags_array(bool *fdb_flags)
 {
        if (*fdb_flags)
@@ -100,6 +118,9 @@ int print_fdb(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
        if (filter_index && filter_index != r->ndm_ifindex)
                return 0;
 
+       if (filter_state && !(r->ndm_state & filter_state))
+               return 0;
+
        parse_rtattr(tb, NDA_MAX, NDA_RTA(r),
                     n->nlmsg_len - NLMSG_LENGTH(sizeof(*r)));
 
@@ -310,6 +331,13 @@ static int fdb_show(int argc, char **argv)
                        if (filter_vlan)
                                duparg("vlan", *argv);
                        filter_vlan = atoi(*argv);
+               } else if (strcmp(*argv, "state") == 0) {
+                       unsigned int state;
+
+                       NEXT_ARG();
+                       if (state_a2n(&state, *argv))
+                               invarg("invalid state", *argv);
+                       filter_state |= state;
                } else {
                        if (matches(*argv, "help") == 0)
                                usage();
index 43418f36f6f12c3b3db7f37351537bc3b6aee13e..7c17cf0f9b237f3f5809499a3c079d7f7f846a77 100644 (file)
@@ -12,7 +12,7 @@
 9   audit
 10  fiblookup
 11  connector
-12  nft 
+12  nft
 13  ip6fw
 14  dec-rt
 15  uevent
@@ -20,4 +20,4 @@
 18  scsi-trans
 19  ecryptfs
 20  rdma
-21  crypto 
+21  crypto
diff --git a/etc/iproute2/rt_protos.d/README b/etc/iproute2/rt_protos.d/README
new file mode 100644 (file)
index 0000000..f9c599c
--- /dev/null
@@ -0,0 +1,2 @@
+Each file in this directory is an rt_protos configuration file. iproute2
+commands scan this directory processing all files that end in '.conf'.
index 79386f89cc14724a2e5b2a76cdb6ce23429bb83b..0920cb1699acf2d7a804e43c53f61d483a930b32 100644 (file)
@@ -1,3 +1,2 @@
 Each file in this directory is an rt_tables configuration file. iproute2
 commands scan this directory processing all files that end in '.conf'.
-
index b1c0ae62944c1a0f4022d0a105d107d4f51c2beb..b4a7def144226ef00065fd3a05fffb11dd97c727 100644 (file)
@@ -111,16 +111,17 @@ static void print_tunnel(struct ip6_tnl_parm2 *p)
        if (p->flags & IP6_TNL_F_RCV_DSCP_COPY)
                printf(" dscp inherit");
 
-       if (p->proto == IPPROTO_GRE) {
-               if ((p->i_flags & GRE_KEY) && (p->o_flags & GRE_KEY) && p->o_key == p->i_key)
-                       printf(" key %u", ntohl(p->i_key));
-               else if ((p->i_flags | p->o_flags) & GRE_KEY) {
-                       if (p->i_flags & GRE_KEY)
-                               printf(" ikey %u", ntohl(p->i_key));
-                       if (p->o_flags & GRE_KEY)
-                               printf(" okey %u", ntohl(p->o_key));
-               }
+       if ((p->i_flags & GRE_KEY) && (p->o_flags & GRE_KEY) &&
+           p->o_key == p->i_key)
+               printf(" key %u", ntohl(p->i_key));
+       else {
+               if (p->i_flags & GRE_KEY)
+                       printf(" ikey %u", ntohl(p->i_key));
+               if (p->o_flags & GRE_KEY)
+                       printf(" okey %u", ntohl(p->o_key));
+       }
 
+       if (p->proto == IPPROTO_GRE) {
                if (p->i_flags & GRE_SEQ)
                        printf("%s  Drop packets out of sequence.", _SL_);
                if (p->i_flags & GRE_CSUM)
index dc8364a43a57d51d6d9a6f88fb8c65964f50e98d..8bd99d6251f26b3cbdb0b33fb64301dc9b4b7ac6 100644 (file)
@@ -181,7 +181,11 @@ static int vrf_configure_cgroup(const char *path, int ifindex)
        if (prog_fd < 0) {
                fprintf(stderr, "Failed to load BPF prog: '%s'\n",
                        strerror(errno));
-               fprintf(stderr, "Kernel compiled with CGROUP_BPF enabled?\n");
+
+               if (errno != EPERM) {
+                       fprintf(stderr,
+                               "Kernel compiled with CGROUP_BPF enabled?\n");
+               }
                goto out;
        }
 
index 0c57662b4f8f172d3ca9b140b8cbd696a17d0b4b..1d24ca24b9a39fcd5705273f6cf72e482a23796d 100644 (file)
@@ -24,4 +24,3 @@ install:
 
 clean:
        rm -f $(NLOBJ) $(UTILOBJ) $(ADDLIB) libnetlink.a libutil.a
-
index 39cc96dccca975cadabba43965b90ac3bcc7ec46..12a4657a0bc96baaa1f5982048a648183692c433 100644 (file)
--- a/lib/fs.c
+++ b/lib/fs.c
@@ -80,13 +80,21 @@ char *find_cgroup2_mount(void)
 
        if (mount("none", mnt, CGROUP2_FS_NAME, 0, NULL)) {
                /* EBUSY means already mounted */
-               if (errno != EBUSY) {
+               if (errno == EBUSY)
+                       goto out;
+
+               if (errno == ENODEV) {
                        fprintf(stderr,
                                "Failed to mount cgroup2. Are CGROUPS enabled in your kernel?\n");
-                       free(mnt);
-                       return NULL;
+               } else {
+                       fprintf(stderr,
+                               "Failed to mount cgroup2: %s\n",
+                               strerror(errno));
                }
+               free(mnt);
+               return NULL;
        }
+out:
        return mnt;
 }
 
@@ -121,7 +129,7 @@ int make_path(const char *path, mode_t mode)
 
                        if (mkdir(dir, mode) != 0) {
                                fprintf(stderr,
-                                       "mkdir failed for %s: %s",
+                                       "mkdir failed for %s: %s\n",
                                        dir, strerror(errno));
                                goto out;
                        }
index c66cb1e439e3ca46ca854143b648f1eb0209ec66..3a16d5cf9bb573eb3b207c2917c84500c916f5fd 100644 (file)
@@ -142,9 +142,36 @@ static int rtnl_rtprot_init;
 
 static void rtnl_rtprot_initialize(void)
 {
+       struct dirent *de;
+       DIR *d;
+
        rtnl_rtprot_init = 1;
        rtnl_tab_initialize(CONFDIR "/rt_protos",
                            rtnl_rtprot_tab, 256);
+
+       d = opendir(CONFDIR "/rt_protos.d");
+       if (!d)
+               return;
+
+       while ((de = readdir(d)) != NULL) {
+               char path[PATH_MAX];
+               size_t len;
+
+               if (*de->d_name == '.')
+                       continue;
+
+               /* only consider filenames ending in '.conf' */
+               len = strlen(de->d_name);
+               if (len <= 5)
+                       continue;
+               if (strcmp(de->d_name + len - 5, ".conf"))
+                       continue;
+
+               snprintf(path, sizeof(path), CONFDIR "/rt_protos.d/%s",
+                        de->d_name);
+               rtnl_tab_initialize(path, rtnl_rtprot_tab, 256);
+       }
+       closedir(d);
 }
 
 const char *rtnl_rtprot_n2a(int id, char *buf, int len)
@@ -404,7 +431,7 @@ int rtnl_rttable_a2n(__u32 *id, const char *arg)
        static unsigned long res;
        struct rtnl_hash_entry *entry;
        char *end;
-       __u32 i;
+       unsigned long i;
 
        if (cache && strcmp(cache, arg) == 0) {
                *id = res;
index 99be9cc9f533fac13e3ce953d28d17aec328ae16..8e3dc62026574f9d170676ceec180a9365aed937 100644 (file)
@@ -32,12 +32,12 @@ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer,
 .br
              void *jarg)
 .sp
-int rtnl_listen(struct rtnl_handle *rtnl, 
+int rtnl_listen(struct rtnl_handle *rtnl,
              int (*handler)(struct sockaddr_nl *, struct rtnl_ctrl_data *,
                             struct nlmsghdr *n, void *),
              void *jarg)
 .sp
-int rtnl_from_file(FILE *rtnl, 
+int rtnl_from_file(FILE *rtnl,
              int (*handler)(struct sockaddr_nl *,struct nlmsghdr *n, void *),
              void *jarg)
 .sp
@@ -49,35 +49,35 @@ int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data)
 .sp
 int rta_addattr_l(struct rtattr *rta, int maxlen, int type, void *data, int alen)
 .SH DESCRIPTION
-libnetlink provides a higher level interface to 
-.BR rtnetlink(7). 
+libnetlink provides a higher level interface to
+.BR rtnetlink(7).
 The read functions return 0 on success and a negative errno on failure.
 The send functions return the amount of data sent, or -1 on error.
-.TP 
+.TP
 rtnl_open
 Open a rtnetlink socket and save the state into the
 .B rth
-handle. This handle is passed to all subsequent calls. 
+handle. This handle is passed to all subsequent calls.
 .B subscriptions
 is a bitmap of the rtnetlink multicast groups the socket will be
 a member of.
 
 .TP
 rtnl_wilddump_request
-Request a full dump of the 
+Request a full dump of the
 .B type
 database for
 .B family
 addresses.
 .B type
-is a rtnetlink message type. 
+is a rtnetlink message type.
 .\" XXX
 
 .TP
 rtnl_dump_request
-Request a full dump of the 
-.B type 
-data buffer into 
+Request a full dump of the
+.B type
+data buffer into
 .B buf
 with maximum length of
 .B len.
@@ -91,12 +91,12 @@ The
 .B filter
 callback checks if the received message is wanted. It gets the source
 address of the message, the message itself and
-.B arg1 
+.B arg1
 as arguments. 0 as return means that the filter passed, a negative
 value is returned
 by
-.I rtnl_dump_filter 
-in case of error. NULL for 
+.I rtnl_dump_filter
+in case of error. NULL for
 .I filter
 means to not use a filter.
 .B junk
@@ -106,7 +106,7 @@ pending, this function does not block.
 
 .TP
 rtnl_listen
-Receive netlink data after a request and pass it to 
+Receive netlink data after a request and pass it to
 .I handler.
 .B handler
 is a callback that gets the message source address, anscillary data, the message
@@ -118,8 +118,8 @@ pending this function does not block.
 
 .TP
 rtnl_from_file
-Works like 
-.I rtnl_listen, 
+Works like
+.I rtnl_listen,
 but reads a netlink message bundle from the file
 .B file
 and passes the messages to
@@ -134,7 +134,7 @@ and
 .BR netlink(3)
 on how to generate a rtnetlink message. The following utility functions
 require a continuous buffer that already contains a netlink message header
-and a rtnetlink request. 
+and a rtnetlink request.
 
 .TP
 rtnl_send
@@ -168,7 +168,7 @@ length to netlink message
 .B n,
 which is part of a buffer of length
 .B maxlen.
-.B data 
+.B data
 is copied.
 
 .TP
index 4f1a476d43a82d44e058e4fc5b25c3408519b4de..0c3d15047fde2b32cdb45cecc7fbe4075e913fa2 100644 (file)
@@ -2,4 +2,3 @@
 ip-address.8
 ip-link.8
 ip-route.8
-
index 6617e188a384716b80a13eb4b0906bcbb0c0e846..9c5f855df72e1e86188a46cedf9f8b0d7de953f1 100644 (file)
@@ -70,7 +70,15 @@ bridge \- show / manipulate bridge addresses and devices
 .ti -8
 .BR "bridge fdb" " [ " show " ] [ "
 .B dev
-.IR DEV " ]"
+.IR DEV " ] [ "
+.B br
+.IR BRDEV " ] [ "
+.B brport
+.IR DEV " ] [ "
+.B vlan
+.IR VID " ] [ "
+.B state
+.IR STATE " ]"
 
 .ti -8
 .BR "bridge mdb" " { " add " | " del " } "
index aaf0f97d5c8d8ca432b19001f17e24ccd5911ed7..dae8b9be9bcbfd3f08f06d426db2e3e3f68dc8eb 100644 (file)
@@ -99,7 +99,7 @@ classification so that it will match ICMP on the next rule, at prio 3:
 # tc filter add dev eth0 parent ffff: prio 2 protocol 0xdead \\
        u32 match u32 0 0 flowid 1:1 \\
        action ife decode reclassify
-# tc filter add dev eth0 parent ffff: priod 3 protocol ip \\
+# tc filter add dev eth0 parent ffff: prio 3 protocol ip \\
        u32 match ip protocol 0xff flowid 1:1 \\
        action continue
 .EE
index e52e125e3bef3d42f352fe962808f618b631541f..a68e2fdb30376a294df8a1897c060e7bd143ef94 100644 (file)
@@ -3,7 +3,7 @@ DISTDATA = normal.dist pareto.dist paretonormal.dist experimental.dist
 
 HOSTCC ?= $(CC)
 CCOPTS  = $(CBUILD_CFLAGS)
-LDLIBS += -lm 
+LDLIBS += -lm
 
 all: $(DISTGEN) $(DISTDATA)
 
index dbb54981462ee5211574044a23387b1fac4ccd63..57ed40d7aa3a8d9a6f221629da31adc25244e66c 100644 (file)
--- a/tc/m_xt.c
+++ b/tc/m_xt.c
@@ -77,6 +77,9 @@ static struct xtables_globals tcipt_globals = {
        .orig_opts = original_opts,
        .opts = original_opts,
        .exit_err = NULL,
+#if (XTABLES_VERSION_CODE >= 11)
+       .compat_rev = xtables_compatible_revision,
+#endif
 };
 
 /*