1/* 2 * Linux ethernet bridge 3 * 4 * Authors: 5 * Lennert Buytenhek <buytenh@gnu.org> 6 * 7 * $Id: br_private.h,v 1.1.1.1 2008/10/15 03:27:33 james26_jang Exp $ 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License 11 * as published by the Free Software Foundation; either version 12 * 2 of the License, or (at your option) any later version. 13 */ 14 15#ifndef _BR_PRIVATE_H 16#define _BR_PRIVATE_H 17 18#include <linux/netdevice.h> 19#include <linux/miscdevice.h> 20#include <linux/if_bridge.h> 21#include "br_private_timer.h" 22 23#define BR_HASH_BITS 8 24#define BR_HASH_SIZE (1 << BR_HASH_BITS) 25 26#define BR_HOLD_TIME (1*HZ) 27 28typedef struct bridge_id bridge_id; 29typedef struct mac_addr mac_addr; 30typedef __u16 port_id; 31 32struct bridge_id 33{ 34 unsigned char prio[2]; 35 unsigned char addr[6]; 36}; 37 38struct mac_addr 39{ 40 unsigned char addr[6]; 41 unsigned char pad[2]; 42}; 43 44struct net_bridge_fdb_entry 45{ 46 struct net_bridge_fdb_entry *next_hash; 47 struct net_bridge_fdb_entry **pprev_hash; 48 atomic_t use_count; 49 mac_addr addr; 50 struct net_bridge_port *dst; 51 unsigned long ageing_timer; 52 unsigned is_local:1; 53 unsigned is_static:1; 54}; 55 56struct net_bridge_port 57{ 58 struct net_bridge_port *next; 59 struct net_bridge *br; 60 struct net_device *dev; 61 int port_no; 62 63 /* STP */ 64 port_id port_id; 65 int state; 66 int path_cost; 67 bridge_id designated_root; 68 int designated_cost; 69 bridge_id designated_bridge; 70 port_id designated_port; 71 unsigned topology_change_ack:1; 72 unsigned config_pending:1; 73 int priority; 74 75 struct br_timer forward_delay_timer; 76 struct br_timer hold_timer; 77 struct br_timer message_age_timer; 78}; 79 80struct net_bridge 81{ 82 struct net_bridge *next; 83 rwlock_t lock; 84 struct net_bridge_port *port_list; 85 struct net_device dev; 86 struct net_device_stats statistics; 87 rwlock_t hash_lock; 88 struct net_bridge_fdb_entry *hash[BR_HASH_SIZE]; 89 struct timer_list tick; 90 91 /* STP */ 92 bridge_id designated_root; 93 int root_path_cost; 94 int root_port; 95 int max_age; 96 int hello_time; 97 int forward_delay; 98 bridge_id bridge_id; 99 bridge_id preferred_id; 100 int bridge_max_age; 101 int bridge_hello_time; 102 int bridge_forward_delay; 103 unsigned stp_enabled:1; 104 unsigned topology_change:1; 105 unsigned topology_change_detected:1; 106 107 struct br_timer hello_timer; 108 struct br_timer tcn_timer; 109 struct br_timer topology_change_timer; 110 struct br_timer gc_timer; 111 112 int ageing_time; 113 int gc_interval; 114}; 115 116extern struct notifier_block br_device_notifier; 117extern unsigned char bridge_ula[6]; 118 119/* br.c */ 120extern void br_dec_use_count(void); 121extern void br_inc_use_count(void); 122 123/* br_device.c */ 124extern void br_dev_setup(struct net_device *dev); 125extern int br_dev_xmit(struct sk_buff *skb, struct net_device *dev); 126 127/* br_fdb.c */ 128extern void br_fdb_changeaddr(struct net_bridge_port *p, 129 unsigned char *newaddr); 130extern void br_fdb_cleanup(struct net_bridge *br); 131extern void br_fdb_delete_by_port(struct net_bridge *br, 132 struct net_bridge_port *p); 133extern struct net_bridge_fdb_entry *br_fdb_get(struct net_bridge *br, 134 unsigned char *addr); 135extern void br_fdb_put(struct net_bridge_fdb_entry *ent); 136extern int br_fdb_get_entries(struct net_bridge *br, 137 unsigned char *_buf, 138 int maxnum, 139 int offset); 140extern void br_fdb_insert(struct net_bridge *br, 141 struct net_bridge_port *source, 142 unsigned char *addr, 143 int is_local); 144 145/* br_forward.c */ 146extern void br_deliver(struct net_bridge_port *to, 147 struct sk_buff *skb); 148extern void br_forward(struct net_bridge_port *to, 149 struct sk_buff *skb); 150extern void br_flood_deliver(struct net_bridge *br, 151 struct sk_buff *skb, 152 int clone); 153extern void br_flood_forward(struct net_bridge *br, 154 struct sk_buff *skb, 155 int clone); 156 157/* br_if.c */ 158extern int br_add_bridge(char *name); 159extern int br_del_bridge(char *name); 160extern int br_add_if(struct net_bridge *br, 161 struct net_device *dev); 162extern int br_del_if(struct net_bridge *br, 163 struct net_device *dev); 164extern int br_get_bridge_ifindices(int *indices, 165 int num); 166extern void br_get_port_ifindices(struct net_bridge *br, 167 int *ifindices); 168 169/* br_input.c */ 170extern void br_handle_frame(struct sk_buff *skb); 171 172/* br_ioctl.c */ 173extern void br_call_ioctl_atomic(void (*fn)(void)); 174extern int br_ioctl(struct net_bridge *br, 175 unsigned int cmd, 176 unsigned long arg0, 177 unsigned long arg1, 178 unsigned long arg2); 179extern int br_ioctl_deviceless_stub(unsigned long arg); 180 181/* br_stp.c */ 182extern int br_is_root_bridge(struct net_bridge *br); 183extern struct net_bridge_port *br_get_port(struct net_bridge *br, 184 int port_no); 185extern void br_init_port(struct net_bridge_port *p); 186extern port_id br_make_port_id(struct net_bridge_port *p); 187extern void br_become_designated_port(struct net_bridge_port *p); 188 189/* br_stp_if.c */ 190extern void br_stp_enable_bridge(struct net_bridge *br); 191extern void br_stp_disable_bridge(struct net_bridge *br); 192extern void br_stp_enable_port(struct net_bridge_port *p); 193extern void br_stp_disable_port(struct net_bridge_port *p); 194extern void br_stp_recalculate_bridge_id(struct net_bridge *br); 195extern void br_stp_set_bridge_priority(struct net_bridge *br, 196 int newprio); 197extern void br_stp_set_port_priority(struct net_bridge_port *p, 198 int newprio); 199extern void br_stp_set_path_cost(struct net_bridge_port *p, 200 int path_cost); 201 202/* br_stp_bpdu.c */ 203extern void br_stp_handle_bpdu(struct sk_buff *skb); 204 205#endif 206