aboutsummaryrefslogtreecommitdiffstats
path: root/ip/iplink_vlan.c
diff options
context:
space:
mode:
authorPatric McHardy <kaber@trash.net>2013-06-21 08:59:24 -0700
committerStephen Hemminger <stephen@networkplumber.org>2013-06-21 08:59:24 -0700
commit8fd8f6ed715aaa6d87e99675e0dfe13ed6c782bd (patch)
treec10b7d1e76a472da32feee4f6cb1a310ec89e919 /ip/iplink_vlan.c
parenta303853e844ce4eb755399f811b0d8a8c71c6b88 (diff)
downloadplatform_external_iproute2-8fd8f6ed715aaa6d87e99675e0dfe13ed6c782bd.tar.gz
platform_external_iproute2-8fd8f6ed715aaa6d87e99675e0dfe13ed6c782bd.tar.bz2
platform_external_iproute2-8fd8f6ed715aaa6d87e99675e0dfe13ed6c782bd.zip
ip: iplink_vlan: add 802.1ad support
The following patch adds support to ip_vlan for configuring VLAN 802.1ad support. Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'ip/iplink_vlan.c')
-rw-r--r--ip/iplink_vlan.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/ip/iplink_vlan.c b/ip/iplink_vlan.c
index ed8984a7..94b52ae5 100644
--- a/ip/iplink_vlan.c
+++ b/ip/iplink_vlan.c
@@ -21,9 +21,11 @@
static void explain(void)
{
fprintf(stderr,
- "Usage: ... vlan id VLANID [ FLAG-LIST ]\n"
- " [ ingress-qos-map QOS-MAP ] [ egress-qos-map QOS-MAP ]\n"
+ "Usage: ... vlan [ protocol VLANPROTO ] id VLANID"
+ " [ FLAG-LIST ]\n"
+ " [ ingress-qos-map QOS-MAP ] [ egress-qos-map QOS-MAP ]\n"
"\n"
+ "VLANPROTO: [ 802.1Q / 802.1ad ]\n"
"VLANID := 0-4095\n"
"FLAG-LIST := [ FLAG-LIST ] FLAG\n"
"FLAG := [ reorder_hdr { on | off } ] [ gvrp { on | off } ] [ mvrp { on | off } ]\n"
@@ -77,10 +79,15 @@ static int vlan_parse_opt(struct link_util *lu, int argc, char **argv,
struct nlmsghdr *n)
{
struct ifla_vlan_flags flags = { 0 };
- __u16 id;
+ __u16 id, proto;
while (argc > 0) {
- if (matches(*argv, "id") == 0) {
+ if (matches(*argv, "protocol") == 0) {
+ NEXT_ARG();
+ if (ll_proto_a2n(&proto, *argv))
+ invarg("protocol is invalid", *argv);
+ addattr_l(n, 1024, IFLA_VLAN_PROTOCOL, &proto, 2);
+ } else if (matches(*argv, "id") == 0) {
NEXT_ARG();
if (get_u16(&id, *argv, 0))
invarg("id is invalid", *argv);
@@ -186,13 +193,25 @@ static void vlan_print_flags(FILE *fp, __u32 flags)
static void vlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[])
{
struct ifla_vlan_flags *flags;
+ SPRINT_BUF(b1);
+
if (!tb)
return;
+ if (tb[IFLA_VLAN_PROTOCOL] &&
+ RTA_PAYLOAD(tb[IFLA_VLAN_PROTOCOL]) < sizeof(__u16))
+ return;
if (!tb[IFLA_VLAN_ID] ||
RTA_PAYLOAD(tb[IFLA_VLAN_ID]) < sizeof(__u16))
return;
+ if (tb[IFLA_VLAN_PROTOCOL])
+ fprintf(f, "protocol %s ",
+ ll_proto_n2a(rta_getattr_u16(tb[IFLA_VLAN_PROTOCOL]),
+ b1, sizeof(b1)));
+ else
+ fprintf(f, "protocol 802.1q ");
+
fprintf(f, "id %u ", rta_getattr_u16(tb[IFLA_VLAN_ID]));
if (tb[IFLA_VLAN_FLAGS]) {