]> git.proxmox.com Git - mirror_iproute2.git/blame - bridge/bridge.c
bridge: Add support for setting bridge port attributes
[mirror_iproute2.git] / bridge / bridge.c
CommitLineData
d04bc300
SH
1/*
2 * Get/set/delete bridge with netlink
3 *
4 * Authors: Stephen Hemminger <shemminger@vyatta.com>
5 */
6
7#include <stdio.h>
8#include <stdlib.h>
9#include <unistd.h>
10#include <sys/socket.h>
11#include <string.h>
12
13#include "SNAPSHOT.h"
14#include "utils.h"
15#include "br_common.h"
16
17struct rtnl_handle rth = { .fd = -1 };
0849e60a 18int preferred_family = AF_UNSPEC;
d04bc300
SH
19int resolve_hosts;
20int show_stats;
21int show_details;
22int timestamp;
23
24static void usage(void) __attribute__((noreturn));
25
26static void usage(void)
27{
28 fprintf(stderr,
90698170 29"Usage: bridge [ OPTIONS ] OBJECT { COMMAND | help }\n"
64108901 30"where OBJECT := { link | fdb | mdb | vlan | monitor }\n"
d04bc300
SH
31" OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails]\n" );
32 exit(-1);
33}
34
35static int do_help(int argc, char **argv)
36{
37 usage();
38}
39
40
41static const struct cmd {
42 const char *cmd;
43 int (*func)(int argc, char **argv);
44} cmds[] = {
64108901 45 { "link", do_link },
d04bc300 46 { "fdb", do_fdb },
e06c7f7e 47 { "mdb", do_mdb },
9eff0e5c 48 { "vlan", do_vlan },
d04bc300
SH
49 { "monitor", do_monitor },
50 { "help", do_help },
51 { 0 }
52};
53
54static int do_cmd(const char *argv0, int argc, char **argv)
55{
56 const struct cmd *c;
57
58 for (c = cmds; c->cmd; ++c) {
59 if (matches(argv0, c->cmd) == 0)
60 return c->func(argc-1, argv+1);
61 }
62
90698170 63 fprintf(stderr, "Object \"%s\" is unknown, try \"bridge help\".\n", argv0);
d04bc300
SH
64 return -1;
65}
66
67int
68main(int argc, char **argv)
69{
70 while (argc > 1) {
71 char *opt = argv[1];
72 if (strcmp(opt,"--") == 0) {
73 argc--; argv++;
74 break;
75 }
76 if (opt[0] != '-')
77 break;
78 if (opt[1] == '-')
79 opt++;
80
81 if (matches(opt, "-help") == 0) {
82 usage();
83 } else if (matches(opt, "-Version") == 0) {
90698170 84 printf("bridge utility, 0.0\n");
d04bc300
SH
85 exit(0);
86 } else if (matches(opt, "-stats") == 0 ||
87 matches(opt, "-statistics") == 0) {
88 ++show_stats;
89 } else if (matches(opt, "-details") == 0) {
90 ++show_details;
91 } else if (matches(opt, "-timestamp") == 0) {
92 ++timestamp;
0849e60a
SH
93 } else if (matches(opt, "-family") == 0) {
94 argc--;
95 argv++;
96 if (argc <= 1)
97 usage();
98 if (strcmp(argv[1], "inet") == 0)
99 preferred_family = AF_INET;
100 else if (strcmp(argv[1], "inet6") == 0)
101 preferred_family = AF_INET6;
102 else if (strcmp(argv[1], "help") == 0)
103 usage();
104 else
105 invarg("invalid protocol family", argv[1]);
106 } else if (strcmp(opt, "-4") == 0) {
107 preferred_family = AF_INET;
108 } else if (strcmp(opt, "-6") == 0) {
109 preferred_family = AF_INET6;
d04bc300 110 } else {
90698170 111 fprintf(stderr, "Option \"%s\" is unknown, try \"bridge help\".\n", opt);
d04bc300
SH
112 exit(-1);
113 }
114 argc--; argv++;
115 }
116
117 if (rtnl_open(&rth, 0) < 0)
118 exit(1);
119
120 if (argc > 1)
121 return do_cmd(argv[1], argc-1, argv+1);
122
123 rtnl_close(&rth);
124 usage();
125}