From 38837a8e19540690c80f5a3b0971e0e1495a4a3e Mon Sep 17 00:00:00 2001 From: buytenh Date: Fri, 22 Jun 2001 19:59:02 +0000 Subject: Initial revision --- libbridge/libbridge.h | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 libbridge/libbridge.h (limited to 'libbridge/libbridge.h') diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h new file mode 100644 index 0000000..a3f96d4 --- /dev/null +++ b/libbridge/libbridge.h @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2000 Lennert Buytenhek + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef _LIBBRIDGE_H +#define _LIBBRIDGE_H + +#include +#include + +struct bridge; +struct bridge_info; +struct fdb_entry; +struct port; +struct port_info; + +struct bridge_id +{ + unsigned char prio[2]; + unsigned char addr[6]; +}; + +struct bridge_info +{ + struct bridge_id designated_root; + struct bridge_id bridge_id; + int root_path_cost; + struct timeval max_age; + struct timeval hello_time; + struct timeval forward_delay; + struct timeval bridge_max_age; + struct timeval bridge_hello_time; + struct timeval bridge_forward_delay; + unsigned topology_change:1; + unsigned topology_change_detected:1; + int root_port; + unsigned stp_enabled:1; + struct timeval ageing_time; + struct timeval gc_interval; + struct timeval hello_timer_value; + struct timeval tcn_timer_value; + struct timeval topology_change_timer_value; + struct timeval gc_timer_value; +}; + +struct bridge +{ + struct bridge *next; + + int ifindex; + char ifname[IFNAMSIZ]; + struct port *firstport; + struct port *ports[256]; + struct bridge_info info; +}; + +struct fdb_entry +{ + u_int8_t mac_addr[6]; + int port_no; + unsigned is_local:1; + struct timeval ageing_timer_value; +}; + +struct port_info +{ + struct bridge_id designated_root; + struct bridge_id designated_bridge; + u_int16_t port_id; + u_int16_t designated_port; + int path_cost; + int designated_cost; + int state; + unsigned top_change_ack:1; + unsigned config_pending:1; + struct timeval message_age_timer_value; + struct timeval forward_delay_timer_value; + struct timeval hold_timer_value; +}; + +struct port +{ + struct port *next; + + int index; + int ifindex; + struct bridge *parent; + struct port_info info; +}; + +extern struct bridge *bridge_list; + +int br_init(void); +int br_refresh(void); +struct bridge *br_find_bridge(char *brname); +struct port *br_find_port(struct bridge *br, char *portname); +char *br_get_state_name(int state); + +int br_add_bridge(char *brname); +int br_del_bridge(char *brname); +int br_add_interface(struct bridge *br, int ifindex); +int br_del_interface(struct bridge *br, int ifindex); +int br_set_bridge_forward_delay(struct bridge *br, struct timeval *tv); +int br_set_bridge_hello_time(struct bridge *br, struct timeval *tv); +int br_set_bridge_max_age(struct bridge *br, struct timeval *tv); +int br_set_ageing_time(struct bridge *br, struct timeval *tv); +int br_set_gc_interval(struct bridge *br, struct timeval *tv); +int br_set_stp_state(struct bridge *br, int stp_state); +int br_set_bridge_priority(struct bridge *br, int bridge_priority); +int br_set_port_priority(struct port *p, int port_priority); +int br_set_path_cost(struct port *p, int path_cost); +int br_read_fdb(struct bridge *br, struct fdb_entry *fdbs, int offset, int num); + +/* libc5 combatability */ +char *if_indextoname(unsigned int __ifindex, char *__ifname); +unsigned int if_nametoindex(const char *__ifname); + +#endif -- cgit v1.2.3 From bff20cb0b625ab56a748928fe4c0ad4e69ae46ca Mon Sep 17 00:00:00 2001 From: shemminger Date: Fri, 25 Apr 2003 00:11:01 +0000 Subject: add and del bridge functions can take 'const char *' --- libbridge/libbridge.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'libbridge/libbridge.h') diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h index a3f96d4..c704449 100644 --- a/libbridge/libbridge.h +++ b/libbridge/libbridge.h @@ -110,8 +110,8 @@ struct bridge *br_find_bridge(char *brname); struct port *br_find_port(struct bridge *br, char *portname); char *br_get_state_name(int state); -int br_add_bridge(char *brname); -int br_del_bridge(char *brname); +int br_add_bridge(const char *brname); +int br_del_bridge(const char *brname); int br_add_interface(struct bridge *br, int ifindex); int br_del_interface(struct bridge *br, int ifindex); int br_set_bridge_forward_delay(struct bridge *br, struct timeval *tv); -- cgit v1.2.3 From d7d9d2f105ea6e8ccca2ac163582eb7a4e0bd2ae Mon Sep 17 00:00:00 2001 From: shemminger Date: Thu, 1 Apr 2004 22:01:19 +0000 Subject: Fixes for 0.9.7 - error checking - handle upto 1000's of bridges - -V version - don't initialize bridge till have to. --- libbridge/libbridge.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'libbridge/libbridge.h') diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h index c704449..2074d80 100644 --- a/libbridge/libbridge.h +++ b/libbridge/libbridge.h @@ -64,7 +64,6 @@ struct bridge int ifindex; char ifname[IFNAMSIZ]; struct port *firstport; - struct port *ports[256]; struct bridge_info info; }; @@ -95,7 +94,6 @@ struct port_info struct port { struct port *next; - int index; int ifindex; struct bridge *parent; @@ -106,10 +104,11 @@ extern struct bridge *bridge_list; int br_init(void); int br_refresh(void); -struct bridge *br_find_bridge(char *brname); -struct port *br_find_port(struct bridge *br, char *portname); -char *br_get_state_name(int state); +struct bridge *br_find_bridge(const char *brname); +struct port *br_find_port(struct bridge *br, const char *portname); +const char *br_get_state_name(int state); +int br_get_version(void); int br_add_bridge(const char *brname); int br_del_bridge(const char *brname); int br_add_interface(struct bridge *br, int ifindex); -- cgit v1.2.3 From 99274cbbd7c2fc8ed0791119fbba2765da29c0c5 Mon Sep 17 00:00:00 2001 From: shemminger Date: Wed, 7 Apr 2004 23:18:04 +0000 Subject: Changes for 0.9.8 - cleanup dependicies - allow 4k ports - don't fetch info till needed. --- libbridge/libbridge.h | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) (limited to 'libbridge/libbridge.h') diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h index 2074d80..503effc 100644 --- a/libbridge/libbridge.h +++ b/libbridge/libbridge.h @@ -38,19 +38,18 @@ struct bridge_info { struct bridge_id designated_root; struct bridge_id bridge_id; - int root_path_cost; + unsigned root_path_cost; struct timeval max_age; struct timeval hello_time; struct timeval forward_delay; struct timeval bridge_max_age; struct timeval bridge_hello_time; struct timeval bridge_forward_delay; - unsigned topology_change:1; - unsigned topology_change_detected:1; - int root_port; - unsigned stp_enabled:1; + u_int16_t root_port; + unsigned char stp_enabled; + unsigned char topology_change; + unsigned char topology_change_detected; struct timeval ageing_time; - struct timeval gc_interval; struct timeval hello_timer_value; struct timeval tcn_timer_value; struct timeval topology_change_timer_value; @@ -64,14 +63,13 @@ struct bridge int ifindex; char ifname[IFNAMSIZ]; struct port *firstport; - struct bridge_info info; }; struct fdb_entry { u_int8_t mac_addr[6]; - int port_no; - unsigned is_local:1; + u_int16_t port_no; + unsigned char is_local; struct timeval ageing_timer_value; }; @@ -81,11 +79,12 @@ struct port_info struct bridge_id designated_bridge; u_int16_t port_id; u_int16_t designated_port; - int path_cost; - int designated_cost; - int state; - unsigned top_change_ack:1; - unsigned config_pending:1; + u_int8_t priority; + unsigned char top_change_ack; + unsigned char config_pending; + unsigned char state; + unsigned path_cost; + unsigned designated_cost; struct timeval message_age_timer_value; struct timeval forward_delay_timer_value; struct timeval hold_timer_value; @@ -97,7 +96,6 @@ struct port int index; int ifindex; struct bridge *parent; - struct port_info info; }; extern struct bridge *bridge_list; @@ -108,6 +106,8 @@ struct bridge *br_find_bridge(const char *brname); struct port *br_find_port(struct bridge *br, const char *portname); const char *br_get_state_name(int state); +int br_get_bridge_info(const struct bridge *br, struct bridge_info *); +int br_get_port_info(const struct port *port, struct port_info *); int br_get_version(void); int br_add_bridge(const char *brname); int br_del_bridge(const char *brname); @@ -123,9 +123,4 @@ int br_set_bridge_priority(struct bridge *br, int bridge_priority); int br_set_port_priority(struct port *p, int port_priority); int br_set_path_cost(struct port *p, int path_cost); int br_read_fdb(struct bridge *br, struct fdb_entry *fdbs, int offset, int num); - -/* libc5 combatability */ -char *if_indextoname(unsigned int __ifindex, char *__ifname); -unsigned int if_nametoindex(const char *__ifname); - #endif -- cgit v1.2.3 From 328f4711bbc369dcccf8f8cfba2adf5dd0f74479 Mon Sep 17 00:00:00 2001 From: shemminger Date: Fri, 21 May 2004 17:41:48 +0000 Subject: New version of command and library that use sysfs. Update make system to build with or without sysfs. --- libbridge/libbridge.h | 75 ++++++++++++++++++++------------------------------- 1 file changed, 29 insertions(+), 46 deletions(-) (limited to 'libbridge/libbridge.h') diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h index 503effc..b1e1fb5 100644 --- a/libbridge/libbridge.h +++ b/libbridge/libbridge.h @@ -22,12 +22,6 @@ #include #include -struct bridge; -struct bridge_info; -struct fdb_entry; -struct port; -struct port_info; - struct bridge_id { unsigned char prio[2]; @@ -56,15 +50,6 @@ struct bridge_info struct timeval gc_timer_value; }; -struct bridge -{ - struct bridge *next; - - int ifindex; - char ifname[IFNAMSIZ]; - struct port *firstport; -}; - struct fdb_entry { u_int8_t mac_addr[6]; @@ -90,37 +75,35 @@ struct port_info struct timeval hold_timer_value; }; -struct port -{ - struct port *next; - int index; - int ifindex; - struct bridge *parent; -}; - -extern struct bridge *bridge_list; +extern int br_init(void); +extern int br_refresh(void); +extern void br_shutdown(void); -int br_init(void); -int br_refresh(void); -struct bridge *br_find_bridge(const char *brname); -struct port *br_find_port(struct bridge *br, const char *portname); -const char *br_get_state_name(int state); +extern int br_foreach_bridge(int (*iterator)(const char *brname, void *), + void *arg); +extern int br_foreach_port(const char *brname, + int (*iterator)(const char *brname, + const char *port, int ifindex, + void *), + void *arg); +extern const char *br_get_state_name(int state); -int br_get_bridge_info(const struct bridge *br, struct bridge_info *); -int br_get_port_info(const struct port *port, struct port_info *); -int br_get_version(void); -int br_add_bridge(const char *brname); -int br_del_bridge(const char *brname); -int br_add_interface(struct bridge *br, int ifindex); -int br_del_interface(struct bridge *br, int ifindex); -int br_set_bridge_forward_delay(struct bridge *br, struct timeval *tv); -int br_set_bridge_hello_time(struct bridge *br, struct timeval *tv); -int br_set_bridge_max_age(struct bridge *br, struct timeval *tv); -int br_set_ageing_time(struct bridge *br, struct timeval *tv); -int br_set_gc_interval(struct bridge *br, struct timeval *tv); -int br_set_stp_state(struct bridge *br, int stp_state); -int br_set_bridge_priority(struct bridge *br, int bridge_priority); -int br_set_port_priority(struct port *p, int port_priority); -int br_set_path_cost(struct port *p, int path_cost); -int br_read_fdb(struct bridge *br, struct fdb_entry *fdbs, int offset, int num); +extern int br_get_bridge_info(const char *br, struct bridge_info *); +extern int br_get_port_info(const char *port, int ifindex, struct port_info *); +extern int br_add_bridge(const char *brname); +extern int br_del_bridge(const char *brname); +extern int br_add_interface(const char *br, int ifindex); +extern int br_del_interface(const char *br, int ifindex); +extern int br_set_bridge_forward_delay(const char *br, struct timeval *tv); +extern int br_set_bridge_hello_time(const char *br, struct timeval *tv); +extern int br_set_bridge_max_age(const char *br, struct timeval *tv); +extern int br_set_ageing_time(const char *br, struct timeval *tv); +extern int br_set_stp_state(const char *br, int stp_state); +extern int br_set_bridge_priority(const char *br, int bridge_priority); +extern int br_set_port_priority(const char *br, const char *p, + int port_priority); +extern int br_set_path_cost(const char *br, const char *p, + int path_cost); +extern int br_read_fdb(const char *br, struct fdb_entry *fdbs, + unsigned long skip, int num); #endif -- cgit v1.2.3 From 9cbb894faa55ec0c6e98215151004d350270812e Mon Sep 17 00:00:00 2001 From: shemminger Date: Thu, 27 May 2004 18:15:12 +0000 Subject: 1.0.2 - fix get_port_info, confusion about bridge name vs port name. --- libbridge/libbridge.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'libbridge/libbridge.h') diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h index b1e1fb5..4fae0f2 100644 --- a/libbridge/libbridge.h +++ b/libbridge/libbridge.h @@ -88,8 +88,9 @@ extern int br_foreach_port(const char *brname, void *arg); extern const char *br_get_state_name(int state); -extern int br_get_bridge_info(const char *br, struct bridge_info *); -extern int br_get_port_info(const char *port, int ifindex, struct port_info *); +extern int br_get_bridge_info(const char *br, struct bridge_info *info); +extern int br_get_port_info(const char *brname, int ifindex, + struct port_info *info); extern int br_add_bridge(const char *brname); extern int br_del_bridge(const char *brname); extern int br_add_interface(const char *br, int ifindex); -- cgit v1.2.3 From f8eed52bc9ca6b3fc9281b16877abd5178a246bf Mon Sep 17 00:00:00 2001 From: shemminger Date: Fri, 28 May 2004 18:00:28 +0000 Subject: Fix problems relating to ifindex vs. index in the get port info arguments. --- libbridge/libbridge.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libbridge/libbridge.h') diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h index 4fae0f2..1be50b0 100644 --- a/libbridge/libbridge.h +++ b/libbridge/libbridge.h @@ -89,7 +89,7 @@ extern int br_foreach_port(const char *brname, extern const char *br_get_state_name(int state); extern int br_get_bridge_info(const char *br, struct bridge_info *info); -extern int br_get_port_info(const char *brname, int ifindex, +extern int br_get_port_info(const char *brname, const char *port, int count, struct port_info *info); extern int br_add_bridge(const char *brname); extern int br_del_bridge(const char *brname); -- cgit v1.2.3 From a7a262260da372c42850f7ce01a070275711c60d Mon Sep 17 00:00:00 2001 From: shemminger Date: Fri, 4 Jun 2004 18:03:40 +0000 Subject: Get rid of all visible signs of port number and ifindex from API, and display output. Fix foreach_port for case when /sys is missing (but compiled for sysfs). --- libbridge/libbridge.h | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'libbridge/libbridge.h') diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h index 1be50b0..a8ff2c2 100644 --- a/libbridge/libbridge.h +++ b/libbridge/libbridge.h @@ -82,19 +82,18 @@ extern void br_shutdown(void); extern int br_foreach_bridge(int (*iterator)(const char *brname, void *), void *arg); extern int br_foreach_port(const char *brname, - int (*iterator)(const char *brname, - const char *port, int ifindex, - void *), + int (*iterator)(const char *brname, const char *port, + void *arg ), void *arg); extern const char *br_get_state_name(int state); extern int br_get_bridge_info(const char *br, struct bridge_info *info); -extern int br_get_port_info(const char *brname, const char *port, int count, +extern int br_get_port_info(const char *brname, const char *port, struct port_info *info); extern int br_add_bridge(const char *brname); extern int br_del_bridge(const char *brname); -extern int br_add_interface(const char *br, int ifindex); -extern int br_del_interface(const char *br, int ifindex); +extern int br_add_interface(const char *br, const char *dev); +extern int br_del_interface(const char *br, const char *dev); extern int br_set_bridge_forward_delay(const char *br, struct timeval *tv); extern int br_set_bridge_hello_time(const char *br, struct timeval *tv); extern int br_set_bridge_max_age(const char *br, struct timeval *tv); -- cgit v1.2.3 From 722fb5b06f1634e587d4e2605ea17e855f7f6e35 Mon Sep 17 00:00:00 2001 From: shemminger Date: Tue, 8 Jun 2004 15:57:46 +0000 Subject: Add port_no back to port_info --- libbridge/libbridge.h | 1 + 1 file changed, 1 insertion(+) (limited to 'libbridge/libbridge.h') diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h index a8ff2c2..20d5bb5 100644 --- a/libbridge/libbridge.h +++ b/libbridge/libbridge.h @@ -60,6 +60,7 @@ struct fdb_entry struct port_info { + unsigned port_no; struct bridge_id designated_root; struct bridge_id designated_bridge; u_int16_t port_id; -- cgit v1.2.3 From 39af7c8f2855c3d9cb44e3069cbfeddd8979acae Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Thu, 20 Jul 2006 13:59:42 -0400 Subject: Add support for bridge port forwarding. --- libbridge/libbridge.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'libbridge/libbridge.h') diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h index 20d5bb5..8ee94cf 100644 --- a/libbridge/libbridge.h +++ b/libbridge/libbridge.h @@ -95,6 +95,9 @@ extern int br_add_bridge(const char *brname); extern int br_del_bridge(const char *brname); extern int br_add_interface(const char *br, const char *dev); extern int br_del_interface(const char *br, const char *dev); +extern int br_set_mirror(const char *bridge, const char *dev); +extern int br_remove_mirror(const char *bridge, const char *dev); + extern int br_set_bridge_forward_delay(const char *br, struct timeval *tv); extern int br_set_bridge_hello_time(const char *br, struct timeval *tv); extern int br_set_bridge_max_age(const char *br, struct timeval *tv); -- cgit v1.2.3 From cd38c7590d3cd1d1d068b394558e6070cb926e12 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Fri, 4 Aug 2006 10:23:17 -0700 Subject: Revert "Add support for bridge port forwarding." This reverts 39af7c8f2855c3d9cb44e3069cbfeddd8979acae commit. Better to add this functionality via ebtables rather than into bridging code. --- libbridge/libbridge.h | 3 --- 1 file changed, 3 deletions(-) (limited to 'libbridge/libbridge.h') diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h index 8ee94cf..20d5bb5 100644 --- a/libbridge/libbridge.h +++ b/libbridge/libbridge.h @@ -95,9 +95,6 @@ extern int br_add_bridge(const char *brname); extern int br_del_bridge(const char *brname); extern int br_add_interface(const char *br, const char *dev); extern int br_del_interface(const char *br, const char *dev); -extern int br_set_mirror(const char *bridge, const char *dev); -extern int br_remove_mirror(const char *bridge, const char *dev); - extern int br_set_bridge_forward_delay(const char *br, struct timeval *tv); extern int br_set_bridge_hello_time(const char *br, struct timeval *tv); extern int br_set_bridge_max_age(const char *br, struct timeval *tv); -- cgit v1.2.3 From 6907ae6731516f3fcc508ba8d6dc187604383eb5 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Mon, 26 Nov 2007 08:59:11 -0800 Subject: Use linux/if.h rather than net/if.h for compatiablity with other headers. Signed-off-by: Stephen Hemminger --- libbridge/libbridge.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'libbridge/libbridge.h') diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h index 20d5bb5..016acea 100644 --- a/libbridge/libbridge.h +++ b/libbridge/libbridge.h @@ -19,9 +19,15 @@ #ifndef _LIBBRIDGE_H #define _LIBBRIDGE_H -#include +#include +#include #include +/* defined in net/if.h but that conflicts with linux/if.h... */ +extern unsigned int if_nametoindex (const char *__ifname); +extern char *if_indextoname (unsigned int __ifindex, char *__ifname); + + struct bridge_id { unsigned char prio[2]; -- cgit v1.2.3 From e83709515598a97e4c6c306ab2952ace13e8a398 Mon Sep 17 00:00:00 2001 From: "Fischer, Anna" Date: Fri, 15 Jan 2010 12:45:08 -0800 Subject: bridge-utils: Add 'hairpin' port forwarding mode This patch adds a 'hairpin' (also called 'reflective relay') mode port configuration to the Linux Ethernet bridge utilities. A bridge supporting hairpin forwarding mode can send frames back out through the port the frame was received on. Hairpin mode is required to support basic VEPA (Virtual Ethernet Port Aggregator) capabilities. You can find additional information on VEPA here: http://tech.groups.yahoo.com/group/evb/ http://www.ieee802.org/1/files/public/docs2009/new-hudson-vepa_seminar-20090514d.pdf http://www.internet2.edu/presentations/jt2009jul/20090719-congdon.pdf (I simplified the code by handling option compatiablity in earlier patch -- Stephen) Signed-off-by: Paul Congdon Signed-off-by: Anna Fischer --- libbridge/libbridge.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'libbridge/libbridge.h') diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h index 016acea..39964f2 100644 --- a/libbridge/libbridge.h +++ b/libbridge/libbridge.h @@ -80,6 +80,7 @@ struct port_info struct timeval message_age_timer_value; struct timeval forward_delay_timer_value; struct timeval hold_timer_value; + unsigned char hairpin_mode; }; extern int br_init(void); @@ -113,4 +114,6 @@ extern int br_set_path_cost(const char *br, const char *p, int path_cost); extern int br_read_fdb(const char *br, struct fdb_entry *fdbs, unsigned long skip, int num); +extern int br_set_hairpin_mode(const char *bridge, const char *dev, + int hairpin_mode); #endif -- cgit v1.2.3