2 * iplink_ipoib.c IPoIB device support
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
9 * Authors: Or Gerlitz <ogerlitz@mellanox.com>
10 * copied iflink_vlan.c authored by Patrick McHardy <kaber@trash.net>
16 #include <linux/if_link.h>
20 #include "ip_common.h"
22 static void print_explain(FILE *f
)
25 "Usage: ... ipoib [pkey PKEY] [mode {datagram | connected}][umcast {0|1}]\n"
27 "PKEY := 0x8001-0xffff\n"
31 static void explain(void)
33 print_explain(stderr
);
36 static int mode_arg(void)
38 fprintf(stderr
, "Error: argument of \"mode\" must be \"datagram\"or \"connected\"\n");
42 static int ipoib_parse_opt(struct link_util
*lu
, int argc
, char **argv
,
45 __u16 pkey
, mode
, umcast
;
48 if (matches(*argv
, "pkey") == 0) {
50 if (get_u16(&pkey
, *argv
, 0))
51 invarg("pkey is invalid", *argv
);
52 addattr_l(n
, 1024, IFLA_IPOIB_PKEY
, &pkey
, 2);
53 } else if (matches(*argv
, "mode") == 0) {
55 if (strcmp(*argv
, "datagram") == 0)
56 mode
= IPOIB_MODE_DATAGRAM
;
57 else if (strcmp(*argv
, "connected") == 0)
58 mode
= IPOIB_MODE_CONNECTED
;
61 addattr_l(n
, 1024, IFLA_IPOIB_MODE
, &mode
, 2);
62 } else if (matches(*argv
, "umcast") == 0) {
64 if (get_u16(&umcast
, *argv
, 0))
65 invarg("umcast is invalid", *argv
);
66 addattr_l(n
, 1024, IFLA_IPOIB_UMCAST
, &umcast
, 2);
67 } else if (matches(*argv
, "help") == 0) {
71 fprintf(stderr
, "ipoib: unknown option \"%s\"?\n", *argv
);
81 static void ipoib_print_opt(struct link_util
*lu
, FILE *f
, struct rtattr
*tb
[])
88 if (!tb
[IFLA_IPOIB_PKEY
] ||
89 RTA_PAYLOAD(tb
[IFLA_IPOIB_PKEY
]) < sizeof(__u16
))
92 fprintf(f
, "pkey %#.4x ", rta_getattr_u16(tb
[IFLA_IPOIB_PKEY
]));
94 if (!tb
[IFLA_IPOIB_MODE
] ||
95 RTA_PAYLOAD(tb
[IFLA_IPOIB_MODE
]) < sizeof(__u16
))
98 mode
= rta_getattr_u16(tb
[IFLA_IPOIB_MODE
]);
99 fprintf(f
, "mode %s ",
100 mode
== IPOIB_MODE_DATAGRAM
? "datagram" :
101 mode
== IPOIB_MODE_CONNECTED
? "connected" :
104 if (!tb
[IFLA_IPOIB_UMCAST
] ||
105 RTA_PAYLOAD(tb
[IFLA_IPOIB_UMCAST
]) < sizeof(__u16
))
108 fprintf(f
, "umcast %.4x ", rta_getattr_u16(tb
[IFLA_IPOIB_UMCAST
]));
111 static void ipoib_print_help(struct link_util
*lu
, int argc
, char **argv
,
117 struct link_util ipoib_link_util
= {
119 .maxattr
= IFLA_IPOIB_MAX
,
120 .parse_opt
= ipoib_parse_opt
,
121 .print_opt
= ipoib_print_opt
,
122 .print_help
= ipoib_print_help
,