1d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 2d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger#include <stdio.h> 3d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger#include <stdlib.h> 4d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger#include <unistd.h> 5d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger#include <time.h> 6d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger#include <sys/socket.h> 7d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger#include <sys/time.h> 8d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger#include <netinet/in.h> 9d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger#include <linux/if.h> 10d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger#include <linux/if_bridge.h> 11d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger#include <string.h> 1264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich#include <stdbool.h> 13d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 1464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich#include "libnetlink.h" 15d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger#include "utils.h" 16d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger#include "br_common.h" 17d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 189dca899b2d97163f18b66c21b5e7acec893b0fa4Andreas Henrikssonstatic unsigned int filter_index; 1964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 20d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemmingerstatic const char *port_states[] = { 21d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger [BR_STATE_DISABLED] = "disabled", 22d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger [BR_STATE_LISTENING] = "listening", 23d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger [BR_STATE_LEARNING] = "learning", 24d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger [BR_STATE_FORWARDING] = "forwarding", 25d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger [BR_STATE_BLOCKING] = "blocking", 26d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger}; 27d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 28df4b043f0845eaf3534b32925c5e79970f9a95a0Stephen Hemmingerextern char *if_indextoname(unsigned int __ifindex, char *__ifname); 29d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 30df4b043f0845eaf3534b32925c5e79970f9a95a0Stephen Hemmingerstatic void print_link_flags(FILE *fp, unsigned int flags) 31d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger{ 32d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger fprintf(fp, "<"); 33d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger if (flags & IFF_UP && !(flags & IFF_RUNNING)) 34d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger fprintf(fp, "NO-CARRIER%s", flags ? "," : ""); 35d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger flags &= ~IFF_RUNNING; 36d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger#define _PF(f) if (flags&IFF_##f) { \ 37df4b043f0845eaf3534b32925c5e79970f9a95a0Stephen Hemminger flags &= ~IFF_##f ; \ 38df4b043f0845eaf3534b32925c5e79970f9a95a0Stephen Hemminger fprintf(fp, #f "%s", flags ? "," : ""); } 39d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(LOOPBACK); 40d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(BROADCAST); 41d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(POINTOPOINT); 42d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(MULTICAST); 43d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(NOARP); 44d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(ALLMULTI); 45d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(PROMISC); 46d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(MASTER); 47d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(SLAVE); 48d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(DEBUG); 49d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(DYNAMIC); 50d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(AUTOMEDIA); 51d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(PORTSEL); 52d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(NOTRAILERS); 53d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(UP); 54d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(LOWER_UP); 55d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(DORMANT); 56d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger _PF(ECHO); 57d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger#undef _PF 58df4b043f0845eaf3534b32925c5e79970f9a95a0Stephen Hemminger if (flags) 59d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger fprintf(fp, "%x", flags); 60d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger fprintf(fp, "> "); 61d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger} 62d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 63d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemmingerstatic const char *oper_states[] = { 6438df7ac95d261f63980e2227f7fdd34a371c08b3Stephen Hemminger "UNKNOWN", "NOTPRESENT", "DOWN", "LOWERLAYERDOWN", 65d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger "TESTING", "DORMANT", "UP" 66d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger}; 67d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 68b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevichstatic const char *hw_mode[] = {"VEB", "VEPA"}; 69b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich 70d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemmingerstatic void print_operstate(FILE *f, __u8 state) 71d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger{ 72df4b043f0845eaf3534b32925c5e79970f9a95a0Stephen Hemminger if (state >= ARRAY_SIZE(oper_states)) 73d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger fprintf(f, "state %#x ", state); 74d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger else 75d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger fprintf(f, "state %s ", oper_states[state]); 76d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger} 77d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 78b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevichstatic void print_portstate(FILE *f, __u8 state) 79b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich{ 80b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich if (state <= BR_STATE_BLOCKING) 81b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich fprintf(f, "state %s ", port_states[state]); 82b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich else 83b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich fprintf(f, "state (%d) ", state); 84b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich} 85b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich 86b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevichstatic void print_onoff(FILE *f, char *flag, __u8 val) 87b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich{ 88b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich fprintf(f, "%s %s ", flag, val ? "on" : "off"); 89b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich} 90b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich 91b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevichstatic void print_hwmode(FILE *f, __u16 mode) 92b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich{ 93df4b043f0845eaf3534b32925c5e79970f9a95a0Stephen Hemminger if (mode >= ARRAY_SIZE(hw_mode)) 94b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich fprintf(f, "hwmode %#hx ", mode); 95b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich else 96b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich fprintf(f, "hwmode %s ", hw_mode[mode]); 97b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich} 98b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich 99d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemmingerint print_linkinfo(const struct sockaddr_nl *who, 100d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger struct nlmsghdr *n, void *arg) 101d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger{ 102d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger FILE *fp = arg; 103d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger int len = n->nlmsg_len; 104d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger struct ifinfomsg *ifi = NLMSG_DATA(n); 105df4b043f0845eaf3534b32925c5e79970f9a95a0Stephen Hemminger struct rtattr *tb[IFLA_MAX+1]; 106d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger char b1[IFNAMSIZ]; 107d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 108d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger len -= NLMSG_LENGTH(sizeof(*ifi)); 109d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger if (len < 0) { 110d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger fprintf(stderr, "Message too short!\n"); 111d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger return -1; 112df4b043f0845eaf3534b32925c5e79970f9a95a0Stephen Hemminger } 113d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 114d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger if (!(ifi->ifi_family == AF_BRIDGE || ifi->ifi_family == AF_UNSPEC)) 115d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger return 0; 116d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 11764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (filter_index && filter_index != ifi->ifi_index) 11864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich return 0; 11964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 120b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich parse_rtattr_flags(tb, IFLA_MAX, IFLA_RTA(ifi), len, NLA_F_NESTED); 121d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 122d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger if (tb[IFLA_IFNAME] == NULL) { 123d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger fprintf(stderr, "BUG: nil ifname\n"); 124d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger return -1; 125d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger } 126d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 127d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger if (n->nlmsg_type == RTM_DELLINK) 128d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger fprintf(fp, "Deleted "); 129d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 130d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger fprintf(fp, "%d: %s ", ifi->ifi_index, 1311465db1a14408fae2cdd9c4f5e80e28f9bdb352eStephen Hemminger tb[IFLA_IFNAME] ? rta_getattr_str(tb[IFLA_IFNAME]) : "<nil>"); 132d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 13338df7ac95d261f63980e2227f7fdd34a371c08b3Stephen Hemminger if (tb[IFLA_OPERSTATE]) 1341465db1a14408fae2cdd9c4f5e80e28f9bdb352eStephen Hemminger print_operstate(fp, rta_getattr_u8(tb[IFLA_OPERSTATE])); 13538df7ac95d261f63980e2227f7fdd34a371c08b3Stephen Hemminger 136d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger if (tb[IFLA_LINK]) { 137d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger SPRINT_BUF(b1); 1381465db1a14408fae2cdd9c4f5e80e28f9bdb352eStephen Hemminger int iflink = rta_getattr_u32(tb[IFLA_LINK]); 139df4b043f0845eaf3534b32925c5e79970f9a95a0Stephen Hemminger 140d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger if (iflink == 0) 141d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger fprintf(fp, "@NONE: "); 1421465db1a14408fae2cdd9c4f5e80e28f9bdb352eStephen Hemminger else 14338df7ac95d261f63980e2227f7fdd34a371c08b3Stephen Hemminger fprintf(fp, "@%s: ", 144d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger if_indextoname(iflink, b1)); 1451465db1a14408fae2cdd9c4f5e80e28f9bdb352eStephen Hemminger } else 146d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger fprintf(fp, ": "); 147d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 148d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger print_link_flags(fp, ifi->ifi_flags); 149d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 150d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger if (tb[IFLA_MTU]) 1511465db1a14408fae2cdd9c4f5e80e28f9bdb352eStephen Hemminger fprintf(fp, "mtu %u ", rta_getattr_u32(tb[IFLA_MTU])); 152d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 1531465db1a14408fae2cdd9c4f5e80e28f9bdb352eStephen Hemminger if (tb[IFLA_MASTER]) 15438df7ac95d261f63980e2227f7fdd34a371c08b3Stephen Hemminger fprintf(fp, "master %s ", 1551465db1a14408fae2cdd9c4f5e80e28f9bdb352eStephen Hemminger if_indextoname(rta_getattr_u32(tb[IFLA_MASTER]), b1)); 156d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 157d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger if (tb[IFLA_PROTINFO]) { 158b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich if (tb[IFLA_PROTINFO]->rta_type & NLA_F_NESTED) { 159b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich struct rtattr *prtb[IFLA_BRPORT_MAX+1]; 160b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich 161b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich parse_rtattr_nested(prtb, IFLA_BRPORT_MAX, 162b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich tb[IFLA_PROTINFO]); 163b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich 164b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich if (prtb[IFLA_BRPORT_STATE]) 165b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich print_portstate(fp, 166b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich rta_getattr_u8(prtb[IFLA_BRPORT_STATE])); 167b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich if (prtb[IFLA_BRPORT_PRIORITY]) 168b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich fprintf(fp, "priority %hu ", 169b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich rta_getattr_u16(prtb[IFLA_BRPORT_PRIORITY])); 170b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich if (prtb[IFLA_BRPORT_COST]) 171b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich fprintf(fp, "cost %u ", 172b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich rta_getattr_u32(prtb[IFLA_BRPORT_COST])); 1734cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger 1744cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger if (show_details) { 1754cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger fprintf(fp, "%s ", _SL_); 1764cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger 1774cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger if (prtb[IFLA_BRPORT_MODE]) 1784cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger print_onoff(fp, "hairpin", 1794cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger rta_getattr_u8(prtb[IFLA_BRPORT_MODE])); 1804cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger if (prtb[IFLA_BRPORT_GUARD]) 1814cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger print_onoff(fp, "guard", 1824cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger rta_getattr_u8(prtb[IFLA_BRPORT_GUARD])); 1834cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger if (prtb[IFLA_BRPORT_PROTECT]) 1844cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger print_onoff(fp, "root_block", 1854cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger rta_getattr_u8(prtb[IFLA_BRPORT_PROTECT])); 1864cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger if (prtb[IFLA_BRPORT_FAST_LEAVE]) 1874cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger print_onoff(fp, "fastleave", 1884cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger rta_getattr_u8(prtb[IFLA_BRPORT_FAST_LEAVE])); 189f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich if (prtb[IFLA_BRPORT_LEARNING]) 190f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich print_onoff(fp, "learning", 191f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich rta_getattr_u8(prtb[IFLA_BRPORT_LEARNING])); 192674bb438bc5cc61a9e16f97a236203ea2f50523fScott Feldman if (prtb[IFLA_BRPORT_LEARNING_SYNC]) 193674bb438bc5cc61a9e16f97a236203ea2f50523fScott Feldman print_onoff(fp, "learning_sync", 194674bb438bc5cc61a9e16f97a236203ea2f50523fScott Feldman rta_getattr_u8(prtb[IFLA_BRPORT_LEARNING_SYNC])); 195f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich if (prtb[IFLA_BRPORT_UNICAST_FLOOD]) 196f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich print_onoff(fp, "flood", 197f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich rta_getattr_u8(prtb[IFLA_BRPORT_UNICAST_FLOOD])); 1989208b4e7c983447368c43e4cdc3d2cfce9e19069Nikolay Aleksandrov if (prtb[IFLA_BRPORT_MCAST_FLOOD]) 1999208b4e7c983447368c43e4cdc3d2cfce9e19069Nikolay Aleksandrov print_onoff(fp, "mcast_flood", 2009208b4e7c983447368c43e4cdc3d2cfce9e19069Nikolay Aleksandrov rta_getattr_u8(prtb[IFLA_BRPORT_MCAST_FLOOD])); 2014cd20da16ffa96f3c67ef7b064ad87f6c8547824Stephen Hemminger } 202b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich } else 203b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich print_portstate(fp, rta_getattr_u8(tb[IFLA_PROTINFO])); 204d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger } 205d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 206b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich if (tb[IFLA_AF_SPEC]) { 207b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich /* This is reported by HW devices that have some bridging 208b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich * capabilities. 209b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich */ 210b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich struct rtattr *aftb[IFLA_BRIDGE_MAX+1]; 211b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich 212b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich parse_rtattr_nested(aftb, IFLA_BRIDGE_MAX, tb[IFLA_AF_SPEC]); 213b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich 214a40d0827a58b3de39c8557db13f8a285813abd40John Fastabend if (aftb[IFLA_BRIDGE_MODE]) 215a40d0827a58b3de39c8557db13f8a285813abd40John Fastabend print_hwmode(fp, rta_getattr_u16(aftb[IFLA_BRIDGE_MODE])); 21652fd1fe36c25175f79fc550e666eb0b194c7c1b4Roman Mashak if (show_details) { 21752fd1fe36c25175f79fc550e666eb0b194c7c1b4Roman Mashak if (aftb[IFLA_BRIDGE_VLAN_INFO]) { 21852fd1fe36c25175f79fc550e666eb0b194c7c1b4Roman Mashak fprintf(fp, "\n"); 21952fd1fe36c25175f79fc550e666eb0b194c7c1b4Roman Mashak print_vlan_info(fp, tb[IFLA_AF_SPEC], 22052fd1fe36c25175f79fc550e666eb0b194c7c1b4Roman Mashak ifi->ifi_index); 22152fd1fe36c25175f79fc550e666eb0b194c7c1b4Roman Mashak } 22252fd1fe36c25175f79fc550e666eb0b194c7c1b4Roman Mashak } 223b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich } 224d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger 225d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger fprintf(fp, "\n"); 226d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger fflush(fp); 227d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger return 0; 228d04bc300c3e367702817fed6eea55e997a328c66Stephen Hemminger} 22964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 23064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevichstatic void usage(void) 23164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich{ 23264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich fprintf(stderr, "Usage: bridge link set dev DEV [ cost COST ] [ priority PRIO ] [ state STATE ]\n"); 23364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich fprintf(stderr, " [ guard {on | off} ]\n"); 234df4b043f0845eaf3534b32925c5e79970f9a95a0Stephen Hemminger fprintf(stderr, " [ hairpin {on | off} ]\n"); 23564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich fprintf(stderr, " [ fastleave {on | off} ]\n"); 23664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich fprintf(stderr, " [ root_block {on | off} ]\n"); 237f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich fprintf(stderr, " [ learning {on | off} ]\n"); 238674bb438bc5cc61a9e16f97a236203ea2f50523fScott Feldman fprintf(stderr, " [ learning_sync {on | off} ]\n"); 239f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich fprintf(stderr, " [ flood {on | off} ]\n"); 2409208b4e7c983447368c43e4cdc3d2cfce9e19069Nikolay Aleksandrov fprintf(stderr, " [ mcast_flood {on | off} ]\n"); 24164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich fprintf(stderr, " [ hwmode {vepa | veb} ]\n"); 24222a98f5140373198ea2a5ca721fea937c6f7b509Roopa Prabhu fprintf(stderr, " [ self ] [ master ]\n"); 24364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich fprintf(stderr, " bridge link show [dev DEV]\n"); 24464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich exit(-1); 24564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich} 24664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 24764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevichstatic bool on_off(char *arg, __s8 *attr, char *val) 24864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich{ 24964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (strcmp(val, "on") == 0) 25064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich *attr = 1; 25164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich else if (strcmp(val, "off") == 0) 25264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich *attr = 0; 25364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich else { 25464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich fprintf(stderr, 25564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich "Error: argument of \"%s\" must be \"on\" or \"off\"\n", 25664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich arg); 25764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich return false; 25864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } 25964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 26064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich return true; 26164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich} 26264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 26364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevichstatic int brlink_modify(int argc, char **argv) 26464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich{ 26564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich struct { 26664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich struct nlmsghdr n; 26764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich struct ifinfomsg ifm; 26864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich char buf[512]; 269d17b136f7d7dd6ed7ea518e4f068d3de735e8756Phil Sutter } req = { 270d17b136f7d7dd6ed7ea518e4f068d3de735e8756Phil Sutter .n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)), 271d17b136f7d7dd6ed7ea518e4f068d3de735e8756Phil Sutter .n.nlmsg_flags = NLM_F_REQUEST, 272d17b136f7d7dd6ed7ea518e4f068d3de735e8756Phil Sutter .n.nlmsg_type = RTM_SETLINK, 273d17b136f7d7dd6ed7ea518e4f068d3de735e8756Phil Sutter .ifm.ifi_family = PF_BRIDGE, 274d17b136f7d7dd6ed7ea518e4f068d3de735e8756Phil Sutter }; 27564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich char *d = NULL; 276f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich __s8 learning = -1; 277674bb438bc5cc61a9e16f97a236203ea2f50523fScott Feldman __s8 learning_sync = -1; 278f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich __s8 flood = -1; 2799208b4e7c983447368c43e4cdc3d2cfce9e19069Nikolay Aleksandrov __s8 mcast_flood = -1; 28064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich __s8 hairpin = -1; 28164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich __s8 bpdu_guard = -1; 28264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich __s8 fast_leave = -1; 283b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich __s8 root_block = -1; 28464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich __u32 cost = 0; 28564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich __s16 priority = -1; 28664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich __s8 state = -1; 28764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich __s16 mode = -1; 2886fdb465869ccda91d9cc2e6f8ee3aca448df5d33Roopa Prabhu __u16 flags = 0; 28964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich struct rtattr *nest; 29064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 29164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich while (argc > 0) { 29264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (strcmp(*argv, "dev") == 0) { 29364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich NEXT_ARG(); 29464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich d = *argv; 29564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } else if (strcmp(*argv, "guard") == 0) { 29664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich NEXT_ARG(); 29764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (!on_off("guard", &bpdu_guard, *argv)) 29842ecedd4bae534fc688194a795eb4548c6530cdaRoopa Prabhu return -1; 29964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } else if (strcmp(*argv, "hairpin") == 0) { 30064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich NEXT_ARG(); 30164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (!on_off("hairping", &hairpin, *argv)) 30242ecedd4bae534fc688194a795eb4548c6530cdaRoopa Prabhu return -1; 30364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } else if (strcmp(*argv, "fastleave") == 0) { 30464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich NEXT_ARG(); 30564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (!on_off("fastleave", &fast_leave, *argv)) 30642ecedd4bae534fc688194a795eb4548c6530cdaRoopa Prabhu return -1; 307b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich } else if (strcmp(*argv, "root_block") == 0) { 308b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich NEXT_ARG(); 309b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich if (!on_off("root_block", &root_block, *argv)) 31042ecedd4bae534fc688194a795eb4548c6530cdaRoopa Prabhu return -1; 311f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich } else if (strcmp(*argv, "learning") == 0) { 312f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich NEXT_ARG(); 313f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich if (!on_off("learning", &learning, *argv)) 31442ecedd4bae534fc688194a795eb4548c6530cdaRoopa Prabhu return -1; 315674bb438bc5cc61a9e16f97a236203ea2f50523fScott Feldman } else if (strcmp(*argv, "learning_sync") == 0) { 316674bb438bc5cc61a9e16f97a236203ea2f50523fScott Feldman NEXT_ARG(); 317674bb438bc5cc61a9e16f97a236203ea2f50523fScott Feldman if (!on_off("learning_sync", &learning_sync, *argv)) 31842ecedd4bae534fc688194a795eb4548c6530cdaRoopa Prabhu return -1; 319f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich } else if (strcmp(*argv, "flood") == 0) { 320f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich NEXT_ARG(); 321f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich if (!on_off("flood", &flood, *argv)) 32242ecedd4bae534fc688194a795eb4548c6530cdaRoopa Prabhu return -1; 3239208b4e7c983447368c43e4cdc3d2cfce9e19069Nikolay Aleksandrov } else if (strcmp(*argv, "mcast_flood") == 0) { 3249208b4e7c983447368c43e4cdc3d2cfce9e19069Nikolay Aleksandrov NEXT_ARG(); 3259208b4e7c983447368c43e4cdc3d2cfce9e19069Nikolay Aleksandrov if (!on_off("mcast_flood", &mcast_flood, *argv)) 3269208b4e7c983447368c43e4cdc3d2cfce9e19069Nikolay Aleksandrov return -1; 327a40d0827a58b3de39c8557db13f8a285813abd40John Fastabend } else if (strcmp(*argv, "cost") == 0) { 32864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich NEXT_ARG(); 32964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich cost = atoi(*argv); 330a40d0827a58b3de39c8557db13f8a285813abd40John Fastabend } else if (strcmp(*argv, "priority") == 0) { 33164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich NEXT_ARG(); 33264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich priority = atoi(*argv); 333a40d0827a58b3de39c8557db13f8a285813abd40John Fastabend } else if (strcmp(*argv, "state") == 0) { 33464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich NEXT_ARG(); 3356b8c871dc104576c9f55d87937d6dd445d77f34fAlex Pilon char *endptr; 33662000e51e05d635016bae9891a4e00134ed8aefbPhil Sutter size_t nstates = ARRAY_SIZE(port_states); 337df4b043f0845eaf3534b32925c5e79970f9a95a0Stephen Hemminger 3386b8c871dc104576c9f55d87937d6dd445d77f34fAlex Pilon state = strtol(*argv, &endptr, 10); 3396b8c871dc104576c9f55d87937d6dd445d77f34fAlex Pilon if (!(**argv != '\0' && *endptr == '\0')) { 3406b8c871dc104576c9f55d87937d6dd445d77f34fAlex Pilon for (state = 0; state < nstates; state++) 3416b8c871dc104576c9f55d87937d6dd445d77f34fAlex Pilon if (strcmp(port_states[state], *argv) == 0) 3426b8c871dc104576c9f55d87937d6dd445d77f34fAlex Pilon break; 3436b8c871dc104576c9f55d87937d6dd445d77f34fAlex Pilon if (state == nstates) { 3446b8c871dc104576c9f55d87937d6dd445d77f34fAlex Pilon fprintf(stderr, 3456b8c871dc104576c9f55d87937d6dd445d77f34fAlex Pilon "Error: invalid STP port state\n"); 34642ecedd4bae534fc688194a795eb4548c6530cdaRoopa Prabhu return -1; 3476b8c871dc104576c9f55d87937d6dd445d77f34fAlex Pilon } 3486b8c871dc104576c9f55d87937d6dd445d77f34fAlex Pilon } 349a40d0827a58b3de39c8557db13f8a285813abd40John Fastabend } else if (strcmp(*argv, "hwmode") == 0) { 35064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich NEXT_ARG(); 351a40d0827a58b3de39c8557db13f8a285813abd40John Fastabend flags = BRIDGE_FLAGS_SELF; 35264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (strcmp(*argv, "vepa") == 0) 35364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich mode = BRIDGE_MODE_VEPA; 35464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich else if (strcmp(*argv, "veb") == 0) 35564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich mode = BRIDGE_MODE_VEB; 35664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich else { 35764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich fprintf(stderr, 358df4b043f0845eaf3534b32925c5e79970f9a95a0Stephen Hemminger "Mode argument must be \"vepa\" or \"veb\".\n"); 35942ecedd4bae534fc688194a795eb4548c6530cdaRoopa Prabhu return -1; 36064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } 3616fdb465869ccda91d9cc2e6f8ee3aca448df5d33Roopa Prabhu } else if (strcmp(*argv, "self") == 0) { 36222a98f5140373198ea2a5ca721fea937c6f7b509Roopa Prabhu flags |= BRIDGE_FLAGS_SELF; 36322a98f5140373198ea2a5ca721fea937c6f7b509Roopa Prabhu } else if (strcmp(*argv, "master") == 0) { 36422a98f5140373198ea2a5ca721fea937c6f7b509Roopa Prabhu flags |= BRIDGE_FLAGS_MASTER; 36564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } else { 36664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich usage(); 36764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } 36864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich argc--; argv++; 36964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } 37064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (d == NULL) { 37164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich fprintf(stderr, "Device is a required argument.\n"); 37242ecedd4bae534fc688194a795eb4548c6530cdaRoopa Prabhu return -1; 37364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } 37464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 37564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 37664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich req.ifm.ifi_index = ll_name_to_index(d); 37764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (req.ifm.ifi_index == 0) { 37864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich fprintf(stderr, "Cannot find bridge device \"%s\"\n", d); 37942ecedd4bae534fc688194a795eb4548c6530cdaRoopa Prabhu return -1; 38064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } 38164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 38264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich /* Nested PROTINFO attribute. Contains: port flags, cost, priority and 38364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich * state. 38464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich */ 38564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich nest = addattr_nest(&req.n, sizeof(req), 38664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich IFLA_PROTINFO | NLA_F_NESTED); 38764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich /* Flags first */ 38864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (bpdu_guard >= 0) 38964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich addattr8(&req.n, sizeof(req), IFLA_BRPORT_GUARD, bpdu_guard); 39064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (hairpin >= 0) 39164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich addattr8(&req.n, sizeof(req), IFLA_BRPORT_MODE, hairpin); 39264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (fast_leave >= 0) 39364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich addattr8(&req.n, sizeof(req), IFLA_BRPORT_FAST_LEAVE, 39464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich fast_leave); 395b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich if (root_block >= 0) 396b1b7ce0f0d2c53bf3993ec6b455e4c12ad84dcdeVlad Yasevich addattr8(&req.n, sizeof(req), IFLA_BRPORT_PROTECT, root_block); 397f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich if (flood >= 0) 398f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich addattr8(&req.n, sizeof(req), IFLA_BRPORT_UNICAST_FLOOD, flood); 3999208b4e7c983447368c43e4cdc3d2cfce9e19069Nikolay Aleksandrov if (mcast_flood >= 0) 4009208b4e7c983447368c43e4cdc3d2cfce9e19069Nikolay Aleksandrov addattr8(&req.n, sizeof(req), IFLA_BRPORT_MCAST_FLOOD, 4019208b4e7c983447368c43e4cdc3d2cfce9e19069Nikolay Aleksandrov mcast_flood); 402f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich if (learning >= 0) 403f0f4ab600b5a9d1f718c8812e20dffe61ca95989Vlad Yasevich addattr8(&req.n, sizeof(req), IFLA_BRPORT_LEARNING, learning); 404674bb438bc5cc61a9e16f97a236203ea2f50523fScott Feldman if (learning_sync >= 0) 405674bb438bc5cc61a9e16f97a236203ea2f50523fScott Feldman addattr8(&req.n, sizeof(req), IFLA_BRPORT_LEARNING_SYNC, 406674bb438bc5cc61a9e16f97a236203ea2f50523fScott Feldman learning_sync); 40764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 40864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (cost > 0) 40964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich addattr32(&req.n, sizeof(req), IFLA_BRPORT_COST, cost); 41064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 41164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (priority >= 0) 41264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich addattr16(&req.n, sizeof(req), IFLA_BRPORT_PRIORITY, priority); 41364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 41464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (state >= 0) 41564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich addattr8(&req.n, sizeof(req), IFLA_BRPORT_STATE, state); 41664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 41764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich addattr_nest_end(&req.n, nest); 41864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 4196fdb465869ccda91d9cc2e6f8ee3aca448df5d33Roopa Prabhu /* IFLA_AF_SPEC nested attribute. Contains IFLA_BRIDGE_FLAGS that 4206fdb465869ccda91d9cc2e6f8ee3aca448df5d33Roopa Prabhu * designates master or self operation and IFLA_BRIDGE_MODE 4216fdb465869ccda91d9cc2e6f8ee3aca448df5d33Roopa Prabhu * for hw 'vepa' or 'veb' operation modes. The hwmodes are 4226fdb465869ccda91d9cc2e6f8ee3aca448df5d33Roopa Prabhu * only valid in 'self' mode on some devices so far. 42364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich */ 4246fdb465869ccda91d9cc2e6f8ee3aca448df5d33Roopa Prabhu if (mode >= 0 || flags > 0) { 42564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich nest = addattr_nest(&req.n, sizeof(req), IFLA_AF_SPEC); 42664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 4276fdb465869ccda91d9cc2e6f8ee3aca448df5d33Roopa Prabhu if (flags > 0) 4286fdb465869ccda91d9cc2e6f8ee3aca448df5d33Roopa Prabhu addattr16(&req.n, sizeof(req), IFLA_BRIDGE_FLAGS, flags); 42964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 43064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (mode >= 0) 43164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich addattr16(&req.n, sizeof(req), IFLA_BRIDGE_MODE, mode); 43264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 43364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich addattr_nest_end(&req.n, nest); 43464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } 43564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 436c079e121a73af5eb49e003b13607e8a690331df6Stephen Hemminger if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) 43742ecedd4bae534fc688194a795eb4548c6530cdaRoopa Prabhu return -1; 43864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 43964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich return 0; 44064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich} 44164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 44264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevichstatic int brlink_show(int argc, char **argv) 44364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich{ 44464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich char *filter_dev = NULL; 44564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 44664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich while (argc > 0) { 44764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (strcmp(*argv, "dev") == 0) { 44864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich NEXT_ARG(); 44964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (filter_dev) 45064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich duparg("dev", *argv); 45164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich filter_dev = *argv; 45264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } 45364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich argc--; argv++; 45464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } 45564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 45664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (filter_dev) { 45764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if ((filter_index = ll_name_to_index(filter_dev)) == 0) { 45864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich fprintf(stderr, "Cannot find device \"%s\"\n", 45964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich filter_dev); 46064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich return -1; 46164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } 46264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } 46364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 464fab9a18a2e527c3d35c95abd7e09f6d4bd06754cRoman Mashak if (show_details) { 465fab9a18a2e527c3d35c95abd7e09f6d4bd06754cRoman Mashak if (rtnl_wilddump_req_filter(&rth, PF_BRIDGE, RTM_GETLINK, 466fab9a18a2e527c3d35c95abd7e09f6d4bd06754cRoman Mashak (compress_vlans ? 467fab9a18a2e527c3d35c95abd7e09f6d4bd06754cRoman Mashak RTEXT_FILTER_BRVLAN_COMPRESSED : 468fab9a18a2e527c3d35c95abd7e09f6d4bd06754cRoman Mashak RTEXT_FILTER_BRVLAN)) < 0) { 469fab9a18a2e527c3d35c95abd7e09f6d4bd06754cRoman Mashak perror("Cannon send dump request"); 470fab9a18a2e527c3d35c95abd7e09f6d4bd06754cRoman Mashak exit(1); 471fab9a18a2e527c3d35c95abd7e09f6d4bd06754cRoman Mashak } 472fab9a18a2e527c3d35c95abd7e09f6d4bd06754cRoman Mashak } else { 473fab9a18a2e527c3d35c95abd7e09f6d4bd06754cRoman Mashak if (rtnl_wilddump_request(&rth, PF_BRIDGE, RTM_GETLINK) < 0) { 474fab9a18a2e527c3d35c95abd7e09f6d4bd06754cRoman Mashak perror("Cannon send dump request"); 475fab9a18a2e527c3d35c95abd7e09f6d4bd06754cRoman Mashak exit(1); 476fab9a18a2e527c3d35c95abd7e09f6d4bd06754cRoman Mashak } 47764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } 47864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 47964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (rtnl_dump_filter(&rth, print_linkinfo, stdout) < 0) { 48064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich fprintf(stderr, "Dump terminated\n"); 48164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich exit(1); 48264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } 48364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich return 0; 48464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich} 48564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 48664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevichint do_link(int argc, char **argv) 48764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich{ 48864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich ll_init_map(&rth); 48964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (argc > 0) { 49064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (matches(*argv, "set") == 0 || 49164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich matches(*argv, "change") == 0) 49264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich return brlink_modify(argc-1, argv+1); 49364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (matches(*argv, "show") == 0 || 49464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich matches(*argv, "lst") == 0 || 49564108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich matches(*argv, "list") == 0) 49664108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich return brlink_show(argc-1, argv+1); 49764108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich if (matches(*argv, "help") == 0) 49864108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich usage(); 49964108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich } else 50064108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich return brlink_show(0, NULL); 50164108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich 50264108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich fprintf(stderr, "Command \"%s\" is unknown, try \"bridge link help\".\n", *argv); 50364108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich exit(-1); 50464108901b737b95247b53dec8c1b8217ca8505b7Vlad Yasevich} 505