X-Git-Url: http://git.rot13.org/?p=bcm963xx.git;a=blobdiff_plain;f=userapps%2Fopensource%2Fbridge-utils%2Flibbridge%2Flibbridge_devif.c;h=7c476e6a750ff82331e7b40b468c15b7e4e7beb2;hp=09ce27cbf503faf18549ac25953349e5df14f3fc;hb=57a096f051259ceaefd5977f30d269884e1dd248;hpb=a69849c98808437716b821267cd97529c56f45b0 diff --git a/userapps/opensource/bridge-utils/libbridge/libbridge_devif.c b/userapps/opensource/bridge-utils/libbridge/libbridge_devif.c index 09ce27cb..7c476e6a 100755 --- a/userapps/opensource/bridge-utils/libbridge/libbridge_devif.c +++ b/userapps/opensource/bridge-utils/libbridge/libbridge_devif.c @@ -441,6 +441,74 @@ int br_set_port_priority(const char *bridge, const char *port, int priority) return port_set(bridge, port, "priority", priority, BRCTL_SET_PORT_PRIORITY); } +// brcm begin +#define BRCTL_SET_PORT_SNOOPING 21 +#define BRCTL_CLEAR_PORT_SNOOPING 22 +#define BRCTL_ENABLE_SNOOPING 23 +#define BRCTL_SHOW_SNOOPING 24 + +int br_set_port_snooping(const char *br, const char *port, const char *addr) +{ + unsigned int iaddr[6]; + unsigned char dest[6]; + int i = 0; + + sscanf(addr, "%02x%02x%02x%02x%02x%02x", iaddr, iaddr+1, iaddr+2, iaddr+3, iaddr+4, iaddr+5); + for (i=0; i < 6; i++) + dest[i] = iaddr[i]; + sscanf(addr+13, "%02x%02x%02x%02x%02x%02x", iaddr, iaddr+1, iaddr+2, iaddr+3, iaddr+4, iaddr+5); + for (i=0; i < 6; i++) + dest[i+6] = iaddr[i]; + return port_set(br, port, "port_snooping", dest, BRCTL_SET_PORT_SNOOPING); +} + +int br_clear_port_snooping(const char *br, const char *port, const char *addr) +{ + unsigned int iaddr[6]; + unsigned char dest[6]; + int i = 0; + + sscanf(addr, "%02x%02x%02x%02x%02x%02x", iaddr, iaddr+1, iaddr+2, iaddr+3, iaddr+4, iaddr+5); + for (i=0; i < 6; i++) + dest[i] = iaddr[i]; + sscanf(addr+13, "%02x%02x%02x%02x%02x%02x", iaddr, iaddr+1, iaddr+2, iaddr+3, iaddr+4, iaddr+5); + for (i=0; i < 6; i++) + dest[i+6] = iaddr[i]; + return port_set(br, port, "port_snooping", dest, BRCTL_CLEAR_PORT_SNOOPING); +} + +int br_show_port_snooping(const char *brname) +{ + int ret; + + { + char _br[IFNAMSIZ]; + unsigned long arg[3] + = { BRCTL_SHOW_SNOOPING, (unsigned long) _br }; + + strncpy(_br, brname, IFNAMSIZ); + ret = ioctl(br_socket_fd, SIOCSIFBR, arg); + } + + return ret < 0 ? errno : 0; +} + +int br_enable_port_snooping(int enable) +{ + int ret; + + { + unsigned long arg[3] + = { BRCTL_ENABLE_SNOOPING, 0, 0}; + + arg[1] = enable; + ret = ioctl(br_socket_fd, SIOCSIFBR, arg); + } + + return ret < 0 ? errno : 0; +} +// brcm end + int br_set_path_cost(const char *bridge, const char *port, int cost) { return port_set(bridge, port, "path_cost", cost, BRCTL_SET_PATH_COST);