📄 br.h
字号:
/* * Constants and structure definitions for the bridging code */#if !defined(One)#define Zero 0#define One 1#endif /* !defined(One) */#if !defined(TRUE)#define FALSE 0#define TRUE 1#endif /* !defined(TRUE) *//** port states. **/#define Disabled 0 /* (4.4 5) */#define Listening 1 /* (4.4.2) */#define Learning 2 /* (4.4.3) */#define Forwarding 3 /* (4 4 4) */#define Blocking 4 /* (4.4.1) *//* MAG Yich! Easiest way of giving a configurable number of ports * If you want more than 32, change BR_MAX_PORTS and recompile brcfg! */#define BR_MAX_PORTS (4)#define CONFIG_BRIDGE_NUM_PORTS BR_MAX_PORTS#define No_of_ports CONFIG_BRIDGE_NUM_PORTS/* arbitrary choice, to allow the code below to compile */#define All_ports (No_of_ports + 1)/* * We time out our entries in the FDB after this many seconds. */#define FDB_TIMEOUT 20 /* JRP: 20s as NSC bridge code, was 300 for Linux *//* * the following defines are the initial values used when the * bridge is booted. These may be overridden when this bridge is * not the root bridge. These are the recommended default values * from the 802.1d specification. */#define BRIDGE_MAX_AGE 20#define BRIDGE_HELLO_TIME 2#define BRIDGE_FORWARD_DELAY 15#define HOLD_TIME 1/* broacast/multicast storm limitation. This per source. */#define MAX_MCAST_PER_PERIOD 4#define MCAST_HOLD_TIME (10*HZ/100)#define Default_path_cost 10/* * minimum increment possible to avoid underestimating age, allows for BPDU * transmission time */#define Message_age_increment 1#define No_port 0/* * reserved value for Bridge's root port parameter indicating no root port, * used when Bridge is the root - also used to indicate the source when * a frame is being generated by a higher layer protocol on this host *//** Configuration BPDU Parameters (4.5.1) **/typedef struct { union { struct { unsigned short priority; unsigned char ula[6]; } p_u; unsigned int id[2]; } bi;} bridge_id_t;#define BRIDGE_PRIORITY bi.p_u.priority#define BRIDGE_ID_ULA bi.p_u.ula#define BRIDGE_ID bi.id/* JRP: on the network the flags field is between "type" and "root_id" * this is unfortunated! To make the code portable to a RISC machine * the pdus are now massaged a little bit for processing */ #define TOPOLOGY_CHANGE 0x01#define TOPOLOGY_CHANGE_ACK 0x80#define BRIDGE_BPDU_8021_CONFIG_SIZE 35 /* real size */#define BRIDGE_BPDU_8021_CONFIG_FLAG_OFFSET 4#define BRIDGE_BPDU_8021_PROTOCOL_ID 0#define BRIDGE_BPDU_8021_PROTOCOL_VERSION_ID 0#define BRIDGE_LLC1_HS 3#define BRIDGE_LLC1_DSAP 0x42#define BRIDGE_LLC1_SSAP 0x42#define BRIDGE_LLC1_CTRL 0x03typedef struct { unsigned short protocol_id; unsigned char protocol_version_id; unsigned char type; bridge_id_t root_id; /* (4.5.1.1) */ unsigned int root_path_cost; /* (4.5.1.2) */ bridge_id_t bridge_id; /* (4.5.1.3) */ unsigned short port_id; /* (4.5.1.4) */ unsigned short message_age; /* (4.5.1.5) */ unsigned short max_age; /* (4.5.1.6) */ unsigned short hello_time; /* (4.5.1.7) */ unsigned short forward_delay; /* (4.5.1.8) */ unsigned char top_change_ack; unsigned char top_change;} Config_bpdu;#ifdef __LITTLE_ENDIAN#define config_bpdu_hton(config_bpdu) \ (config_bpdu)->root_path_cost = htonl((config_bpdu)->root_path_cost); \ (config_bpdu)->port_id = htons((config_bpdu)->port_id); \ (config_bpdu)->message_age = htons((config_bpdu)->message_age); \ (config_bpdu)->max_age = htons((config_bpdu)->max_age); \ (config_bpdu)->hello_time = htons((config_bpdu)->hello_time); \ (config_bpdu)->forward_delay = htons((config_bpdu)->forward_delay);#else#define config_bpdu_hton(config_bpdu)#endif#define config_bpdu_ntoh config_bpdu_hton/** Topology Change Notification BPDU Parameters (4.5.2) **/typedef struct { unsigned short protocol_id; unsigned char protocol_version_id; unsigned char type;} Tcn_bpdu;#define BPDU_TYPE_CONFIG 0#define BPDU_TYPE_TOPO_CHANGE 128/** Bridge Parameters (4.5.3) **/typedef struct { bridge_id_t designated_root; /* (4.5.3.1) */ unsigned int root_path_cost; /* (4.5.3.2) */ unsigned int root_port; /* (4.5.3.3) */ unsigned short max_age; /* (4.5.3.4) */ unsigned short hello_time; /* (4.5.3.5) */ unsigned short forward_delay; /* (4.5.3.6) */ bridge_id_t bridge_id; /* (4.5.3.7) */ unsigned short bridge_max_age; /* (4.5.3.8) */ unsigned short bridge_hello_time; /* (4.5.3.9) */ unsigned short bridge_forward_delay; /* (4.5.3.10) */ unsigned int top_change_detected; /* (4.5.3.11) */ unsigned int top_change; /* (4.5.3.12) */ unsigned short topology_change_time; /* (4.5.3.13) */ unsigned short hold_time; /* (4.5.3.14) */ unsigned int instance;} Bridge_data;
struct fdb {
unsigned char ula[6];
unsigned char pad[2];
unsigned short port;
unsigned int timer;
unsigned short flags;
#define FDB_ENT_VALID 0x01
unsigned short mcast_count;
unsigned int mcast_timer; /* oldest xxxxxcast */
/* the flag of have free */
int have_free;
};
/** Port Parameters (4.5.5) **/typedef struct { unsigned short port_id; /* (4.5.5.1) */ unsigned int state; /* (4.5.5.2) */ unsigned int path_cost; /* (4.5.5.3) */ bridge_id_t designated_root; /* (4.5.5.4) */ unsigned int designated_cost; /* (4.5.5.5) */ bridge_id_t designated_bridge; /* (4.5.5.6) */ unsigned short designated_port; /* (4.5.5.7) */ unsigned int top_change_ack; /* (4.5.5.8) */ unsigned int config_pending; /* (4.5.5.9) */ bridge_id_t ifmac; unsigned int admin_state; char ifname[64]; /* Make life easier for brcfg */ struct nic *dev;
/* Because we dont use malloc */
struct fdb fdb[256]; /* head of per port fdb chain */
} Port_data;/** types to support timers for this pseudo-implementation. **/typedef struct { unsigned int active; /* timer in use. */ unsigned int value; /* current value of timer, * counting up. */} Timer;/* data returned on BRCMD_DISPLAY_FDB */struct fdb_info { unsigned char ula[6]; unsigned char port; unsigned char flags; unsigned int timer;};struct fdb_info_hdr { int copied; /* nb of entries copied to user */ int not_copied; /* when user buffer is too small */ int cmd_time;}; #define IS_BRIDGED 0x2e#define BR_MAX_PROTOCOLS 32#define BR_MAX_PROT_STATS BR_MAX_PROTOCOLS/* policy values for policy field */#define BR_ACCEPT 1#define BR_REJECT 0/* JRP: extra statistics for debug */typedef struct { /* br_receive_frame counters */ int port_disable_up_stack; int rcv_bpdu; int notForwarding; int forwarding_up_stack; int unknown_state; /* br_tx_frame counters */ int port_disable; int port_not_disable; /* br_forward counters */ int local_multicast; int forwarded_multicast; /* up stack as well */ int flood_unicast; int aged_flood_unicast; int forwarded_unicast; int forwarded_unicast_up_stack; int forwarded_ip_up_stack; int forwarded_ip_up_stack_lie; /* received on alternate device */ int arp_for_local_mac; int drop_same_port; int drop_same_port_aged; int drop_multicast;} br_stats_counter;struct br_stat { unsigned int flags; Bridge_data bridge_data; unsigned int policy; unsigned int exempt_protocols; unsigned short protocols[BR_MAX_PROTOCOLS]; unsigned short prot_id[BR_MAX_PROT_STATS]; /* Protocol encountered */ unsigned int prot_counter[BR_MAX_PROT_STATS]; /* How many packets ? */ br_stats_counter packet_cnts; unsigned int num_ports; Port_data port_data[BR_MAX_PORTS + 1];};/* defined flags for br_stat.flags */#define BR_UP 0x0001 /* bridging enabled *///#define BR_DEBUG 0x0002 /* debugging enabled */#define BR_PROT_STATS 0x0004 /* protocol statistics enabled */#define BR_STP_DISABLED 0x0008 /* Spanning tree protocol disabled */struct br_cf { unsigned int cmd; unsigned int arg1; unsigned int arg2;};/* defined cmds */#define BRCMD_BRIDGE_ENABLE 1#define BRCMD_BRIDGE_DISABLE 2#define BRCMD_PORT_ENABLE 3 /* arg1 = port */#define BRCMD_PORT_DISABLE 4 /* arg1 = port */#define BRCMD_SET_BRIDGE_PRIORITY 5 /* arg1 = priority */#define BRCMD_SET_PORT_PRIORITY 6 /* arg1 = port, arg2 = priority */#define BRCMD_SET_PATH_COST 7 /* arg1 = port, arg2 = cost */#define BRCMD_DISPLAY_FDB 8#define BRCMD_ENABLE_DEBUG 9#define BRCMD_DISABLE_DEBUG 10#define BRCMD_SET_POLICY 11 /* arg1 = default policy (1==bridge all) */#define BRCMD_EXEMPT_PROTOCOL 12 /* arg1 = protocol (see net/if_ether.h) */#define BRCMD_ENABLE_PROT_STATS 13#define BRCMD_DISABLE_PROT_STATS 14#define BRCMD_ZERO_PROT_STATS 15#define BRCMD_TOGGLE_STP 16#define BRCMD_IF_ENABLE 17 /* arg1 = if_index */#define BRCMD_IF_DISABLE 18 /* arg1 = if_index */#define BRCMD_SET_IF_PRIORITY 19 /* arg1 = if_index, arg2 = priority */#define BRCMD_SET_IF_PATH_COST 20 /* arg1 = if_index, arg2 = cost *//* prototypes of exported bridging functions... */extern void br_init(void);extern int br_recv(struct nic *d, void *pkt, int len);/* externs */extern void br_register_port(struct nic *dev);extern struct br_stat br_stats;extern Port_data port_info[];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -