Annotation of Gnu-Mach/linux/src/include/net/br.h, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.