diff --git a/bridge/vlan.c b/bridge/vlan.c index 717025ae..a8a2e1d9 100644 --- a/bridge/vlan.c +++ b/bridge/vlan.c @@ -299,6 +299,6 @@ int do_vlan(int argc, char **argv) } else return vlan_show(0, NULL); - fprintf(stderr, "Command \"%s\" is unknown, try \"bridge fdb help\".\n", *argv); + fprintf(stderr, "Command \"%s\" is unknown, try \"bridge vlan help\".\n", *argv); exit(-1); } diff --git a/ip/iplink.c b/ip/iplink.c index 68e5faea..b1f8a379 100644 --- a/ip/iplink.c +++ b/ip/iplink.c @@ -491,7 +491,7 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, } else if (matches(*argv, "address") == 0) { NEXT_ARG(); addr_len = ll_addr_a2n(abuf, sizeof(abuf), *argv); - if (len < 0) + if (addr_len < 0) return -1; addattr_l(&req->n, sizeof(*req), IFLA_ADDRESS, abuf, addr_len); } else if (matches(*argv, "broadcast") == 0 || diff --git a/ip/tcp_metrics.c b/ip/tcp_metrics.c index f82604f4..ac2613a0 100644 --- a/ip/tcp_metrics.c +++ b/ip/tcp_metrics.c @@ -112,47 +112,44 @@ static int process_msg(const struct sockaddr_nl *who, struct nlmsghdr *n, parse_rtattr(attrs, TCP_METRICS_ATTR_MAX, (void *) ghdr + GENL_HDRLEN, len); - a = attrs[TCP_METRICS_ATTR_ADDR_IPV4]; - if (a) { + if (attrs[TCP_METRICS_ATTR_ADDR_IPV4]) { if (f.daddr.family && f.daddr.family != AF_INET) return 0; + a = attrs[TCP_METRICS_ATTR_ADDR_IPV4]; memcpy(&daddr.data, RTA_DATA(a), 4); daddr.bytelen = 4; family = AF_INET; atype = TCP_METRICS_ATTR_ADDR_IPV4; dlen = RTA_PAYLOAD(a); - } else { - a = attrs[TCP_METRICS_ATTR_ADDR_IPV6]; - if (a) { - if (f.daddr.family && f.daddr.family != AF_INET6) - return 0; - memcpy(&daddr.data, RTA_DATA(a), 16); - daddr.bytelen = 16; - family = AF_INET6; - atype = TCP_METRICS_ATTR_ADDR_IPV6; - dlen = RTA_PAYLOAD(a); - } else + } else if (attrs[TCP_METRICS_ATTR_ADDR_IPV6]) { + if (f.daddr.family && f.daddr.family != AF_INET6) return 0; + a = attrs[TCP_METRICS_ATTR_ADDR_IPV6]; + memcpy(&daddr.data, RTA_DATA(a), 16); + daddr.bytelen = 16; + family = AF_INET6; + atype = TCP_METRICS_ATTR_ADDR_IPV6; + dlen = RTA_PAYLOAD(a); + } else { + return 0; } - a = attrs[TCP_METRICS_ATTR_SADDR_IPV4]; - if (a) { + if (attrs[TCP_METRICS_ATTR_SADDR_IPV4]) { if (f.saddr.family && f.saddr.family != AF_INET) return 0; + a = attrs[TCP_METRICS_ATTR_SADDR_IPV4]; memcpy(&saddr.data, RTA_DATA(a), 4); saddr.bytelen = 4; stype = TCP_METRICS_ATTR_SADDR_IPV4; slen = RTA_PAYLOAD(a); - } else { + } else if (attrs[TCP_METRICS_ATTR_SADDR_IPV6]) { + if (f.saddr.family && f.saddr.family != AF_INET6) + return 0; a = attrs[TCP_METRICS_ATTR_SADDR_IPV6]; - if (a) { - if (f.saddr.family && f.saddr.family != AF_INET6) - return 0; - memcpy(&saddr.data, RTA_DATA(a), 16); - saddr.bytelen = 16; - stype = TCP_METRICS_ATTR_SADDR_IPV6; - slen = RTA_PAYLOAD(a); - } + memcpy(&saddr.data, RTA_DATA(a), 16); + saddr.bytelen = 16; + stype = TCP_METRICS_ATTR_SADDR_IPV6; + slen = RTA_PAYLOAD(a); } if (f.daddr.family && f.daddr.bitlen >= 0 && diff --git a/man/man8/bridge.8 b/man/man8/bridge.8 index 08e8a5bf..ac42118e 100644 --- a/man/man8/bridge.8 +++ b/man/man8/bridge.8 @@ -234,7 +234,7 @@ error. .sp .B 1 -- STP LISTENING state. Only valid if STP is enabled on the brige. In this +- STP LISTENING state. Only valid if STP is enabled on the bridge. In this state the port for list for STP BPDUs and drop all other traffic. .sp @@ -551,8 +551,8 @@ device is the bridge device. .BI master the vlan is configured on the software bridge (default). -.SS bridge vlan delete - delete a forwarding database entry -This command removes an existing fdb entry. +.SS bridge vlan delete - delete a vlan filter entry +This command removes an existing vlan filter entry. .PP The arguments are the same as with diff --git a/man/man8/ip-address.8.in b/man/man8/ip-address.8.in index ab0942d7..8d34adb3 100644 --- a/man/man8/ip-address.8.in +++ b/man/man8/ip-address.8.in @@ -280,6 +280,12 @@ only list interfaces enslaved to this master device. .BI type " TYPE" only list interfaces of the given type. +Note that the type name is not checked against the list of supported types - +instead it is sent as-is to the kernel. Later it is used to filter the returned +interface list by comparing it with the relevant attribute in case the kernel +didn't filter already. Therefore any string is accepted, but may lead to empty +output. + .TP .B up only list running interfaces. diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in index d5673639..375b4d08 100644 --- a/man/man8/ip-link.8.in +++ b/man/man8/ip-link.8.in @@ -65,7 +65,8 @@ ip-link \- network device configuration .BR nlmon " |" .BR ipvlan " |" .BR lowpan " |" -.BR geneve " ]" +.BR geneve " |" +.BR vrf " ]" .ti -8 .BR "ip link delete " { @@ -263,6 +264,9 @@ Link types: .sp .BR macsec - Interface for IEEE 802.1AE MAC Security (MACsec) +.sp +.BR vrf +- Interface for L3 VRF domains .in -8 .TP @@ -966,6 +970,20 @@ the following additional arguments are supported: .in -8 +.TP +VRF Type Support +For a link of type +.I VRF +the following additional arguments are supported: + +.BI "ip link add " DEVICE " type vrf table " TABLE + +.in +8 +.sp +.BR table " table id associated with VRF device" + +.in -8 + .SS ip link delete - delete virtual link .TP @@ -1242,6 +1260,12 @@ specifies the master device which enslaves devices to show. .I TYPE specifies the type of devices to show. +Note that the type name is not checked against the list of supported types - +instead it is sent as-is to the kernel. Later it is used to filter the returned +interface list by comparing it with the relevant attribute in case the kernel +didn't filter already. Therefore any string is accepted, but may lead to empty +output. + .SS ip link help - display help .PP