|
|
1.1 ! root 1: /* ! 2: * Constants and structure definitions for the bridging code ! 3: */ ! 4: ! 5: #if !defined(One) ! 6: #define Zero 0 ! 7: #define One 1 ! 8: #endif /* !defined(One) */ ! 9: ! 10: #if !defined(TRUE) ! 11: #define FALSE 0 ! 12: #define TRUE 1 ! 13: #endif /* !defined(TRUE) */ ! 14: ! 15: /** port states. **/ ! 16: #define Disabled 0 /* (4.4 5) */ ! 17: #define Listening 1 /* (4.4.2) */ ! 18: #define Learning 2 /* (4.4.3) */ ! 19: #define Forwarding 3 /* (4 4 4) */ ! 20: #define Blocking 4 /* (4.4.1) */ ! 21: ! 22: #define No_of_ports 8 ! 23: /* arbitrary choice, to allow the code below to compile */ ! 24: ! 25: #define All_ports (No_of_ports + 1) ! 26: ! 27: /* ! 28: * We time out our entries in the FDB after this many seconds. ! 29: */ ! 30: #define FDB_TIMEOUT 300 ! 31: ! 32: /* ! 33: * the following defines are the initial values used when the ! 34: * bridge is booted. These may be overridden when this bridge is ! 35: * not the root bridge. These are the recommended default values ! 36: * from the 802.1d specification. ! 37: */ ! 38: #define BRIDGE_MAX_AGE 20 ! 39: #define BRIDGE_HELLO_TIME 2 ! 40: #define BRIDGE_FORWARD_DELAY 15 ! 41: #define HOLD_TIME 1 ! 42: ! 43: #define Default_path_cost 10 ! 44: ! 45: /* ! 46: * minimum increment possible to avoid underestimating age, allows for BPDU ! 47: * transmission time ! 48: */ ! 49: #define Message_age_increment 1 ! 50: ! 51: #define No_port 0 ! 52: /* ! 53: * reserved value for Bridge's root port parameter indicating no root port, ! 54: * used when Bridge is the root - also used to indicate the source when ! 55: * a frame is being generated by a higher layer protocol on this host ! 56: */ ! 57: ! 58: /** Configuration BPDU Parameters (4.5.1) **/ ! 59: ! 60: typedef struct { ! 61: union { ! 62: struct { ! 63: unsigned short priority; ! 64: unsigned char ula[6]; ! 65: } p_u; ! 66: unsigned int id[2]; ! 67: } bi; ! 68: } bridge_id_t; ! 69: ! 70: #define BRIDGE_PRIORITY bi.p_u.priority ! 71: #define BRIDGE_ID_ULA bi.p_u.ula ! 72: #define BRIDGE_ID bi.id ! 73: ! 74: typedef struct { ! 75: unsigned short protocol_id; ! 76: unsigned char protocol_version_id; ! 77: unsigned char type; ! 78: unsigned char flags; ! 79: #define TOPOLOGY_CHANGE 0x01 ! 80: #define TOPOLOGY_CHANGE_ACK 0x80 ! 81: bridge_id_t root_id; /* (4.5.1.1) */ ! 82: unsigned int root_path_cost; /* (4.5.1.2) */ ! 83: bridge_id_t bridge_id; /* (4.5.1.3) */ ! 84: unsigned short port_id; /* (4.5.1.4) */ ! 85: unsigned short message_age; /* (4.5.1.5) */ ! 86: unsigned short max_age; /* (4.5.1.6) */ ! 87: unsigned short hello_time; /* (4.5.1.7) */ ! 88: unsigned short forward_delay; /* (4.5.1.8) */ ! 89: } Config_bpdu; ! 90: ! 91: ! 92: /** Topology Change Notification BPDU Parameters (4.5.2) **/ ! 93: ! 94: typedef struct { ! 95: unsigned short protocol_id; ! 96: unsigned char protocol_version_id; ! 97: unsigned char type; ! 98: } Tcn_bpdu; ! 99: ! 100: #define BPDU_TYPE_CONFIG 0 ! 101: #define BPDU_TYPE_TOPO_CHANGE 128 ! 102: ! 103: /** Bridge Parameters (4.5.3) **/ ! 104: typedef struct { ! 105: bridge_id_t designated_root; /* (4.5.3.1) */ ! 106: unsigned int root_path_cost; /* (4.5.3.2) */ ! 107: unsigned int root_port; /* (4.5.3.3) */ ! 108: unsigned short max_age; /* (4.5.3.4) */ ! 109: unsigned short hello_time; /* (4.5.3.5) */ ! 110: unsigned short forward_delay; /* (4.5.3.6) */ ! 111: bridge_id_t bridge_id; /* (4.5.3.7) */ ! 112: unsigned short bridge_max_age; /* (4.5.3.8) */ ! 113: unsigned short bridge_hello_time; /* (4.5.3.9) */ ! 114: unsigned short bridge_forward_delay; /* (4.5.3.10) */ ! 115: unsigned int topology_change_detected; /* (4.5.3.11) */ ! 116: unsigned int topology_change; /* (4.5.3.12) */ ! 117: unsigned short topology_change_time; /* (4.5.3.13) */ ! 118: unsigned short hold_time; /* (4.5.3.14) */ ! 119: unsigned int top_change; ! 120: unsigned int top_change_detected; ! 121: } Bridge_data; ! 122: ! 123: /** Port Parameters (4.5.5) **/ ! 124: typedef struct { ! 125: unsigned short port_id; /* (4.5.5.1) */ ! 126: unsigned int state; /* (4.5.5.2) */ ! 127: unsigned int path_cost; /* (4.5.5.3) */ ! 128: bridge_id_t designated_root; /* (4.5.5.4) */ ! 129: unsigned int designated_cost; /* (4.5.5.5) */ ! 130: bridge_id_t designated_bridge; /* (4.5.5.6) */ ! 131: unsigned short designated_port; /* (4.5.5.7) */ ! 132: unsigned int top_change_ack; /* (4.5.5.8) */ ! 133: unsigned int config_pending; /* (4.5.5.9) */ ! 134: struct device *dev; ! 135: struct fdb *fdb; /* head of per port fdb chain */ ! 136: } Port_data; ! 137: ! 138: ! 139: ! 140: /** types to support timers for this pseudo-implementation. **/ ! 141: typedef struct { ! 142: unsigned int active; /* timer in use. */ ! 143: unsigned int value; /* current value of timer, ! 144: * counting up. */ ! 145: } Timer; ! 146: ! 147: struct fdb { ! 148: unsigned char ula[6]; ! 149: unsigned char pad[2]; ! 150: unsigned short port; ! 151: unsigned int timer; ! 152: unsigned int flags; ! 153: #define FDB_ENT_VALID 0x01 ! 154: /* AVL tree of all addresses, sorted by address */ ! 155: short fdb_avl_height; ! 156: struct fdb *fdb_avl_left; ! 157: struct fdb *fdb_avl_right; ! 158: /* linked list of addresses for each port */ ! 159: struct fdb *fdb_next; ! 160: }; ! 161: ! 162: #define IS_BRIDGED 0x2e ! 163: ! 164: struct br_stat { ! 165: unsigned int flags; ! 166: Bridge_data bridge_data; ! 167: Port_data port_data[No_of_ports]; ! 168: }; ! 169: ! 170: /* defined flags for br_stat.flags */ ! 171: #define BR_UP 0x0001 /* bridging enabled */ ! 172: #define BR_DEBUG 0x0002 /* debugging enabled */ ! 173: ! 174: struct br_cf { ! 175: unsigned int cmd; ! 176: unsigned int arg1; ! 177: unsigned int arg2; ! 178: }; ! 179: ! 180: /* defined cmds */ ! 181: #define BRCMD_BRIDGE_ENABLE 1 ! 182: #define BRCMD_BRIDGE_DISABLE 2 ! 183: #define BRCMD_PORT_ENABLE 3 /* arg1 = port */ ! 184: #define BRCMD_PORT_DISABLE 4 /* arg1 = port */ ! 185: #define BRCMD_SET_BRIDGE_PRIORITY 5 /* arg1 = priority */ ! 186: #define BRCMD_SET_PORT_PRIORITY 6 /* arg1 = port, arg2 = priority */ ! 187: #define BRCMD_SET_PATH_COST 7 /* arg1 = port, arg2 = cost */ ! 188: #define BRCMD_DISPLAY_FDB 8 /* arg1 = port */ ! 189: #define BRCMD_ENABLE_DEBUG 9 ! 190: #define BRCMD_DISABLE_DEBUG 10 ! 191: ! 192: /* prototypes of all bridging functions... */ ! 193: ! 194: void transmit_config(int port_no); ! 195: int root_bridge(void); ! 196: int supersedes_port_info(int port_no, Config_bpdu *config); ! 197: void record_config_information(int port_no, Config_bpdu *config); ! 198: void record_config_timeout_values(Config_bpdu *config); ! 199: void config_bpdu_generation(void); ! 200: int designated_port(int port_no); ! 201: void reply(int port_no); ! 202: void transmit_tcn(void); ! 203: void configuration_update(void); ! 204: void root_selection(void); ! 205: void designated_port_selection(void); ! 206: void become_designated_port(int port_no); ! 207: void port_state_selection(void); ! 208: void make_forwarding(int port_no); ! 209: void topology_change_detection(void); ! 210: void topology_change_acknowledged(void); ! 211: void acknowledge_topology_change(int port_no); ! 212: void make_blocking(int port_no); ! 213: void set_port_state(int port_no, int state); ! 214: void received_config_bpdu(int port_no, Config_bpdu *config); ! 215: void received_tcn_bpdu(int port_no, Tcn_bpdu *tcn); ! 216: void hello_timer_expiry(void); ! 217: void message_age_timer_expiry(int port_no); ! 218: void forward_delay_timer_expiry(int port_no); ! 219: int designated_for_some_port(void); ! 220: void tcn_timer_expiry(void); ! 221: void topology_change_timer_expiry(void); ! 222: void hold_timer_expiry(int port_no); ! 223: void br_init(void); ! 224: void br_init_port(int port_no); ! 225: void enable_port(int port_no); ! 226: void disable_port(int port_no); ! 227: void set_bridge_priority(bridge_id_t *new_bridge_id); ! 228: void set_port_priority(int port_no, unsigned short new_port_id); ! 229: void set_path_cost(int port_no, unsigned short path_cost); ! 230: void start_hello_timer(void); ! 231: void stop_hello_timer(void); ! 232: int hello_timer_expired(void); ! 233: void start_tcn_timer(void); ! 234: void stop_tcn_timer(void); ! 235: int tcn_timer_expired(void); ! 236: void start_topology_change_timer(void); ! 237: void stop_topology_change_timer(void); ! 238: int topology_change_timer_expired(void); ! 239: void start_message_age_timer(int port_no, unsigned short message_age); ! 240: void stop_message_age_timer(int port_no); ! 241: int message_age_timer_expired(int port_no); ! 242: void start_forward_delay_timer(int port_no); ! 243: void stop_forward_delay_timer(int port_no); ! 244: int forward_delay_timer_expired(int port_no); ! 245: void start_hold_timer(int port_no); ! 246: void stop_hold_timer(int port_no); ! 247: int hold_timer_expired(int port_no); ! 248: ! 249: struct fdb *br_avl_find_addr(unsigned char addr[6]); ! 250: int br_avl_insert (struct fdb * new_node); ! 251: int br_avl_remove (struct fdb * node_to_delete); ! 252: ! 253: int send_tcn_bpdu(int port_no, Tcn_bpdu *bpdu); ! 254: int send_config_bpdu(int port_no, Config_bpdu *config_bpdu); ! 255: int find_port(struct device *dev); ! 256: int br_flood(struct sk_buff *skb, int port); ! 257: int br_drop(struct sk_buff *skb); ! 258: int br_learn(struct sk_buff *skb, int port); /* 3.8 */ ! 259: ! 260: int br_receive_frame(struct sk_buff *skb); /* 3.5 */ ! 261: int br_tx_frame(struct sk_buff *skb); ! 262: int br_ioctl(unsigned int cmd, void *arg); ! 263: ! 264: void free_fdb(struct fdb *); ! 265: struct fdb *get_fdb(void); ! 266: ! 267: /* externs */ ! 268: ! 269: extern struct br_stat br_stats; ! 270:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.