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