1 /*****************************************************************************
2 * wanpipe.h	WANPIPE(tm) Multiprotocol WAN Link Driver.
3 *		User-level API definitions.
4 *
5 * Author: 	Nenad Corbic <ncorbic@sangoma.com>
6 *		Gideon Hack
7 *
8 * Copyright:	(c) 1995-2000 Sangoma Technologies Inc.
9 *
10 *		This program is free software; you can redistribute it and/or
11 *		modify it under the terms of the GNU General Public License
12 *		as published by the Free Software Foundation; either version
13 *		2 of the License, or (at your option) any later version.
14 * ============================================================================
15 * Nov 3,  2000  Nenad Corbic    Added config_id to sdla_t structure.
16 *                               Used to determine the protocol running.
17 * Jul 13, 2000  Nenad Corbic	Added SyncPPP Support
18 * Feb 24, 2000  Nenad Corbic    Added support for x25api driver
19 * Oct 04, 1999  Nenad Corbic    New CHDLC and FRAME RELAY code, SMP support
20 * Jun 02, 1999  Gideon Hack	Added 'update_call_count' for Cisco HDLC
21 *				support
22 * Jun 26, 1998	David Fong	Added 'ip_mode' in sdla_t.u.p for dynamic IP
23 *				routing mode configuration
24 * Jun 12, 1998	David Fong	Added Cisco HDLC union member in sdla_t
25 * Dec 08, 1997	Jaspreet Singh  Added 'authenticator' in union of 'sdla_t'
26 * Nov 26, 1997	Jaspreet Singh	Added 'load_sharing' structure.  Also added
27 *				'devs_struct','dev_to_devtint_next' to 'sdla_t'
28 * Nov 24, 1997	Jaspreet Singh	Added 'irq_dis_if_send_count',
29 *				'irq_dis_poll_count' to 'sdla_t'.
30 * Nov 06, 1997	Jaspreet Singh	Added a define called 'INTR_TEST_MODE'
31 * Oct 20, 1997	Jaspreet Singh	Added 'buff_intr_mode_unbusy' and
32 *				'dlci_intr_mode_unbusy' to 'sdla_t'
33 * Oct 18, 1997	Jaspreet Singh	Added structure to maintain global driver
34 *				statistics.
35 * Jan 15, 1997	Gene Kozin	Version 3.1.0
36 *				 o added UDP management stuff
37 * Jan 02, 1997	Gene Kozin	Version 3.0.0
38 *****************************************************************************/
39 #ifndef	_WANPIPE_H
40 #define	_WANPIPE_H
41 
42 #include <linux/version.h>
43 
44 #ifndef KERNEL_VERSION
45   #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
46 #endif
47 
48 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
49 
50  #define LINUX_2_4
51  #define netdevice_t struct net_device
52 
53  #define FREE_READ 1
54  #define FREE_WRITE 0
55 
56  #define stop_net_queue(a) 	netif_stop_queue(a)
57  #define start_net_queue(a) 	netif_start_queue(a)
58  #define is_queue_stopped(a)	netif_queue_stopped(a)
59  #define wake_net_dev(a)	netif_wake_queue(a)
60  #define is_dev_running(a)	netif_running(a)
61  #define wan_dev_kfree_skb(a,b)	dev_kfree_skb_any(a)
62 
63 
64 #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)
65 
66  #define LINUX_2_1
67  #define netdevice_t struct device
68  #define FREE_READ 1
69  #define FREE_WRITE 0
70 
71  #define stop_net_queue(a) 	(set_bit(0, &##a->tbusy))
72  #define start_net_queue(a) 	(clear_bit(0,&##a->tbusy))
73  #define is_queue_stopped(a)	(##a->tbusy)
74  #define wake_net_dev(a)	{clear_bit(0,&##a->tbusy);mark_bh(NET_BH);}
75  #define is_dev_running(a)	(test_bit(0,&##a->start))
76  #define wan_dev_kfree_skb(a,b)	dev_kfree_skb(a)
77 
78 #else
79  #define LINUX_2_0
80  #define netdevice_t struct device
81 
82  #define test_and_set_bit set_bit
83  #define net_ratelimit() 1
84 
85  #define stop_net_queue(a) 	(set_bit(0, &##a->tbusy))
86  #define start_net_queue(a) 	(clear_bit(0,&##a->tbusy))
87  #define is_queue_stopped(a)	(##a->tbusy)
88  #define wake_net_dev(a)	{clear_bit(0,&##a->tbusy);mark_bh(NET_BH);}
89  #define is_dev_running(a)	(test_bit(0,(void*)&##a->start))
90  #define wan_dev_kfree_skb(a,b) dev_kfree_skb(a,b)
91  #define spin_lock_init(a)
92  #define spin_lock(a)
93  #define spin_unlock(a)
94 #endif
95 
96 #include <linux/wanrouter.h>
97 
98 /* Defines */
99 
100 #ifndef	PACKED
101 #define	PACKED	__attribute__((packed))
102 #endif
103 
104 #define	WANPIPE_MAGIC	0x414C4453L	/* signature: 'SDLA' reversed */
105 
106 /* IOCTL numbers (up to 16) */
107 #define	WANPIPE_DUMP	(ROUTER_USER+0)	/* dump adapter's memory */
108 #define	WANPIPE_EXEC	(ROUTER_USER+1)	/* execute firmware command */
109 
110 #define TRACE_ALL                       0x00
111 #define TRACE_PROT			0x01
112 #define TRACE_DATA			0x02
113 
114 /* values for request/reply byte */
115 #define UDPMGMT_REQUEST	0x01
116 #define UDPMGMT_REPLY	0x02
117 #define UDP_OFFSET	12
118 
119 #define MAX_CMD_BUFF 	10
120 #define MAX_X25_LCN 	255	/* Maximum number of x25 channels */
121 #define MAX_LCN_NUM	4095	/* Maximum lcn number */
122 #define MAX_FT1_RETRY 	100
123 
124 #ifdef LINUX_2_4
125   #ifndef AF_WANPIPE
126 	#define AF_WANPIPE 25
127 	#ifndef PF_WANPIPE
128 		#define PF_WANPIPE AF_WANPIPE
129 	#endif
130   #endif
131 
132 #else
133   #ifndef AF_WANPIPE
134 	#define AF_WANPIPE 24
135 	#ifndef PF_WANPIPE
136 		#define PF_WANPIPE AF_WANPIPE
137 	#endif
138   #endif
139 #endif
140 
141 
142 #define TX_TIMEOUT 5*HZ
143 
144 /* General Critical Flags */
145 #define SEND_CRIT	0x00
146 #define PERI_CRIT	0x01
147 
148 /* Chdlc and PPP polling critical flag */
149 #define POLL_CRIT	0x03
150 
151 /* Frame Relay Tx IRQ send critical flag */
152 #define SEND_TXIRQ_CRIT 0x02
153 
154 /* Frame Relay ARP critical flag */
155 #define ARP_CRIT	0x03
156 
157 /* Bit maps for dynamic interface configuration
158  * DYN_OPT_ON : turns this option on/off
159  * DEV_DOWN   : device was shutdown by the driver not
160  *              by user
161  */
162 #define DYN_OPT_ON	0x00
163 #define DEV_DOWN	0x01
164 
165 /*
166  * Data structures for IOCTL calls.
167  */
168 
169 typedef struct sdla_dump	/* WANPIPE_DUMP */
170 {
171 	unsigned long magic;	/* for verification */
172 	unsigned long offset;	/* absolute adapter memory address */
173 	unsigned long length;	/* block length */
174 	void* ptr;		/* -> buffer */
175 } sdla_dump_t;
176 
177 typedef struct sdla_exec	/* WANPIPE_EXEC */
178 {
179 	unsigned long magic;	/* for verification */
180 	void* cmd;		/* -> command structure */
181 	void* data;		/* -> data buffer */
182 } sdla_exec_t;
183 
184 /* UDP management stuff */
185 
186 typedef struct wum_header
187 {
188 	unsigned char signature[8];	/* 00h: signature */
189 	unsigned char type;		/* 08h: request/reply */
190 	unsigned char command;		/* 09h: commnand */
191 	unsigned char reserved[6];	/* 0Ah: reserved */
192 } wum_header_t;
193 
194 /*************************************************************************
195  Data Structure for global statistics
196 *************************************************************************/
197 
198 typedef struct global_stats
199 {
200 	unsigned long isr_entry;
201 	unsigned long isr_already_critical;
202 	unsigned long isr_rx;
203 	unsigned long isr_tx;
204 	unsigned long isr_intr_test;
205 	unsigned long isr_spurious;
206 	unsigned long isr_enable_tx_int;
207 	unsigned long rx_intr_corrupt_rx_bfr;
208 	unsigned long rx_intr_on_orphaned_DLCI;
209 	unsigned long rx_intr_dev_not_started;
210 	unsigned long tx_intr_dev_not_started;
211 	unsigned long poll_entry;
212 	unsigned long poll_already_critical;
213 	unsigned long poll_processed;
214 	unsigned long poll_tbusy_bad_status;
215 	unsigned long poll_host_disable_irq;
216 	unsigned long poll_host_enable_irq;
217 
218 } global_stats_t;
219 
220 
221 typedef struct{
222 	unsigned short	udp_src_port		PACKED;
223 	unsigned short	udp_dst_port		PACKED;
224 	unsigned short	udp_length		PACKED;
225 	unsigned short	udp_checksum		PACKED;
226 } udp_pkt_t;
227 
228 
229 typedef struct {
230 	unsigned char	ver_inet_hdr_length;
231 	unsigned char	service_type;
232 	unsigned short	total_length		PACKED;
233 	unsigned short	identifier		PACKED;
234 	unsigned short	flags_frag_offset	PACKED;
235 	unsigned char	ttl;
236 	unsigned char	protocol;
237 	unsigned short	hdr_checksum		PACKED;
238 	unsigned long	ip_src_address		PACKED;
239 	unsigned long	ip_dst_address		PACKED;
240 } ip_pkt_t;
241 
242 
243 typedef struct {
244         unsigned char           signature[8];
245         unsigned char           request_reply;
246         unsigned char           id;
247         unsigned char           reserved[6];
248 } wp_mgmt_t;
249 
250 /*************************************************************************
251  Data Structure for if_send  statistics
252 *************************************************************************/
253 typedef struct if_send_stat{
254 	unsigned long if_send_entry;
255 	unsigned long if_send_skb_null;
256 	unsigned long if_send_broadcast;
257 	unsigned long if_send_multicast;
258 	unsigned long if_send_critical_ISR;
259 	unsigned long if_send_critical_non_ISR;
260 	unsigned long if_send_tbusy;
261 	unsigned long if_send_tbusy_timeout;
262 	unsigned long if_send_PIPE_request;
263 	unsigned long if_send_wan_disconnected;
264 	unsigned long if_send_dlci_disconnected;
265 	unsigned long if_send_no_bfrs;
266 	unsigned long if_send_adptr_bfrs_full;
267 	unsigned long if_send_bfr_passed_to_adptr;
268 	unsigned long if_send_protocol_error;
269        	unsigned long if_send_bfr_not_passed_to_adptr;
270        	unsigned long if_send_tx_int_enabled;
271         unsigned long if_send_consec_send_fail;
272 } if_send_stat_t;
273 
274 typedef struct rx_intr_stat{
275 	unsigned long rx_intr_no_socket;
276 	unsigned long rx_intr_dev_not_started;
277 	unsigned long rx_intr_PIPE_request;
278 	unsigned long rx_intr_bfr_not_passed_to_stack;
279 	unsigned long rx_intr_bfr_passed_to_stack;
280 } rx_intr_stat_t;
281 
282 typedef struct pipe_mgmt_stat{
283 	unsigned long UDP_PIPE_mgmt_kmalloc_err;
284 	unsigned long UDP_PIPE_mgmt_direction_err;
285 	unsigned long UDP_PIPE_mgmt_adptr_type_err;
286 	unsigned long UDP_PIPE_mgmt_adptr_cmnd_OK;
287 	unsigned long UDP_PIPE_mgmt_adptr_cmnd_timeout;
288 	unsigned long UDP_PIPE_mgmt_adptr_send_passed;
289 	unsigned long UDP_PIPE_mgmt_adptr_send_failed;
290 	unsigned long UDP_PIPE_mgmt_not_passed_to_stack;
291 	unsigned long UDP_PIPE_mgmt_passed_to_stack;
292 	unsigned long UDP_PIPE_mgmt_no_socket;
293         unsigned long UDP_PIPE_mgmt_passed_to_adptr;
294 } pipe_mgmt_stat_t;
295 
296 
297 typedef struct {
298 	struct sk_buff *skb;
299 } bh_data_t, cmd_data_t;
300 
301 #define MAX_LGTH_UDP_MGNT_PKT 2000
302 
303 
304 /* This is used for interrupt testing */
305 #define INTR_TEST_MODE	0x02
306 
307 #define	WUM_SIGNATURE_L	0x50495046
308 #define	WUM_SIGNATURE_H	0x444E3845
309 
310 #define	WUM_KILL	0x50
311 #define	WUM_EXEC	0x51
312 
313 #define WANPIPE		0x00
314 #define API		0x01
315 #define BRIDGE		0x02
316 #define BRIDGE_NODE	0x03
317 
318 #ifdef	__KERNEL__
319 /****** Kernel Interface ****************************************************/
320 
321 #include <linux/sdladrv.h>	/* SDLA support module API definitions */
322 #include <linux/sdlasfm.h>	/* SDLA firmware module definitions */
323 #include <linux/tqueue.h>
324 #ifdef LINUX_2_4
325   #include <linux/serial.h>
326   #include <linux/serialP.h>
327   #include <linux/serial_reg.h>
328   #include <asm/serial.h>
329 #endif
330 #include <linux/tty.h>
331 #include <linux/tty_driver.h>
332 #include <linux/tty_flip.h>
333 
334 
335 #define	is_digit(ch) (((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')?1:0)
336 #define	is_alpha(ch) ((((ch)>=(unsigned)'a'&&(ch)<=(unsigned)'z')||\
337 	 	  ((ch)>=(unsigned)'A'&&(ch)<=(unsigned)'Z'))?1:0)
338 #define	is_hex_digit(ch) ((((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')||\
339 	 	  ((ch)>=(unsigned)'a'&&(ch)<=(unsigned)'f')||\
340 	 	  ((ch)>=(unsigned)'A'&&(ch)<=(unsigned)'F'))?1:0)
341 
342 
343 /****** Data Structures *****************************************************/
344 
345 /* Adapter Data Space.
346  * This structure is needed because we handle multiple cards, otherwise
347  * static data would do it.
348  */
349 typedef struct sdla
350 {
351 	char devname[WAN_DRVNAME_SZ+1];	/* card name */
352 	sdlahw_t hw;			/* hardware configuration */
353 	wan_device_t wandev;		/* WAN device data space */
354 
355 	unsigned open_cnt;		/* number of open interfaces */
356 	unsigned long state_tick;	/* link state timestamp */
357 	unsigned intr_mode;		/* Type of Interrupt Mode */
358 	char in_isr;			/* interrupt-in-service flag */
359 	char buff_int_mode_unbusy;	/* flag for carrying out dev_tint */
360 	char dlci_int_mode_unbusy;	/* flag for carrying out dev_tint */
361 	char configured;		/* flag for previous configurations */
362 
363 	unsigned short irq_dis_if_send_count; /* Disabling irqs in if_send*/
364 	unsigned short irq_dis_poll_count;   /* Disabling irqs in poll routine*/
365 	unsigned short force_enable_irq;
366 	char TracingEnabled;		/* flag for enabling trace */
367 	global_stats_t statistics;	/* global statistics */
368 	void* mbox;			/* -> mailbox */
369 	void* rxmb;			/* -> receive mailbox */
370 	void* flags;			/* -> adapter status flags */
371 	void (*isr)(struct sdla* card);	/* interrupt service routine */
372 	void (*poll)(struct sdla* card); /* polling routine */
373 	int (*exec)(struct sdla* card, void* u_cmd, void* u_data);
374 					/* Used by the listen() system call */
375 	/* Wanpipe Socket Interface */
376 	int   (*func) (struct sk_buff *, struct sock *);
377 	struct sock *sk;
378 
379 	/* Shutdown function */
380 	void (*disable_comm) (struct sdla *card);
381 
382 	/* Secondary Port Device: Piggibacking */
383 	struct sdla *next;
384 
385 	/* TTY driver variables */
386 	unsigned char tty_opt;
387 	struct tty_struct *tty;
388 	unsigned int tty_minor;
389 	unsigned int tty_open;
390 	unsigned char *tty_buf;
391 	unsigned char *tty_rx;
392 	struct tq_struct tty_task_queue;
393 
394 	union
395 	{
396 		struct
397 		{			/****** X.25 specific data **********/
398 			u32 lo_pvc;
399 			u32 hi_pvc;
400 			u32 lo_svc;
401 			u32 hi_svc;
402 			netdevice_t *svc_to_dev_map[MAX_X25_LCN];
403 			netdevice_t *pvc_to_dev_map[MAX_X25_LCN];
404 			netdevice_t *tx_dev;
405 			netdevice_t *cmd_dev;
406 			u32 no_dev;
407 			volatile u8 *hdlc_buf_status;
408 			u32 tx_interrupts_pending;
409                         u16 timer_int_enabled;
410 			netdevice_t *poll_device;
411 			atomic_t command_busy;
412 
413 			u16 udp_pkt_lgth;
414                         u32 udp_type;
415                         u8  udp_pkt_src;
416 			u32 udp_lcn;
417                         netdevice_t * udp_dev;
418                         s8 udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT];
419 
420 		 	u8 LAPB_hdlc;		/* Option to turn off X25 and run only LAPB */
421 			u8 logging;		/* Option to log call messages */
422 			u8 oob_on_modem;	/* Option to send modem status to the api */
423 			u16 num_of_ch;		/* Number of channels configured by the user */
424 
425 			struct tq_struct x25_poll_task;
426 			struct timer_list x25_timer;
427 		} x;
428 		struct
429 		{			/****** frame relay specific data ***/
430 			void* rxmb_base;	/* -> first Rx buffer */
431 			void* rxmb_last;	/* -> last Rx buffer */
432 			unsigned rx_base;	/* S508 receive buffer base */
433 			unsigned rx_top;	/* S508 receive buffer end */
434 			unsigned short node_dlci[100];
435 			unsigned short dlci_num;
436                         netdevice_t *dlci_to_dev_map[991 + 1];
437                         unsigned tx_interrupts_pending;
438                         unsigned short timer_int_enabled;
439                         unsigned short udp_pkt_lgth;
440                         int udp_type;
441                         char udp_pkt_src;
442                         unsigned udp_dlci;
443                         char udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT];
444                         void* trc_el_base;      		/* first trace element */
445                         void* trc_el_last;      		/* last trace element */
446                         void *curr_trc_el;      		/* current trace element */
447                         unsigned short trc_bfr_space; 		/* trace buffer space */
448 			unsigned char  update_comms_stats;
449 			netdevice_t *arp_dev;
450 			spinlock_t if_send_lock;
451 		} f;
452 		struct			/****** PPP-specific data ***********/
453 		{
454 			char if_name[WAN_IFNAME_SZ+1];	/* interface name */
455 			void* txbuf;		/* -> current Tx buffer */
456 			void* txbuf_base;	/* -> first Tx buffer */
457 			void* txbuf_last;	/* -> last Tx buffer */
458 			void* rxbuf_base;	/* -> first Rx buffer */
459 			void* rxbuf_last;	/* -> last Rx buffer */
460 			unsigned rx_base;	/* S508 receive buffer base */
461 			unsigned rx_top;	/* S508 receive buffer end */
462 			char ip_mode;		/* STATIC/HOST/PEER IP Mode */
463 			char authenticator;	/* Authenticator for PAP/CHAP */
464 			unsigned char comm_enabled; /* Is comm enabled or not */
465 			unsigned char peer_route;   /* Process Peer Route */
466 			unsigned long *txbuf_next;  /* Next Tx buffer to use */
467 			unsigned long *rxbuf_next;  /* Next Rx buffer to use */
468 		} p;
469 		struct			/* Cisco HDLC-specific data */
470 		{
471 			char if_name[WAN_IFNAME_SZ+1];	/* interface name */
472 			unsigned char comm_port;/* Communication Port O or 1 */
473 			unsigned char usedby;  /* Used by WANPIPE or API */
474 			void* rxmb;		/* Receive mail box */
475 			void* flags;		/* flags */
476 			void* tx_status;	/* Tx status element */
477 			void* rx_status;	/* Rx status element */
478 			void* txbuf;		/* -> current Tx buffer */
479 			void* txbuf_base;	/* -> first Tx buffer */
480 			void* txbuf_last;	/* -> last Tx buffer */
481 			void* rxbuf_base;	/* -> first Rx buffer */
482 			void* rxbuf_last;	/* -> last Rx buffer */
483 			unsigned rx_base;	/* S508 receive buffer base */
484 			unsigned rx_top;	/* S508 receive buffer end */
485 			unsigned char receive_only; /* high speed receivers */
486 			unsigned short protocol_options;
487 			unsigned short kpalv_tx;	/* Tx kpalv timer */
488 			unsigned short kpalv_rx;	/* Rx kpalv timer */
489 			unsigned short kpalv_err;	/* Error tolerance */
490 			unsigned short slarp_timer;	/* SLARP req timer */
491 			unsigned state;			/* state of the link */
492 			unsigned char api_status;
493 			unsigned char update_call_count;
494 			unsigned short api_options;	/* for async config */
495 			unsigned char  async_mode;
496 		        unsigned short tx_bits_per_char;
497 		        unsigned short rx_bits_per_char;
498 		        unsigned short stop_bits;
499 		        unsigned short parity;
500 			unsigned short break_timer;
501 		        unsigned short inter_char_timer;
502 		        unsigned short rx_complete_length;
503 		        unsigned short xon_char;
504 		        unsigned short xoff_char;
505 			unsigned char comm_enabled; /* Is comm enabled or not */
506 			unsigned char backup;
507 		} c;
508 		struct
509 		{
510 			void* tx_status;	/* Tx status element */
511 			void* rx_status;	/* Rx status element */
512 			void* trace_status;	/* Trace status element */
513 			void* txbuf;		/* -> current Tx buffer */
514 			void* txbuf_base;	/* -> first Tx buffer */
515 			void* txbuf_last;	/* -> last Tx buffer */
516 			void* rxbuf_base;	/* -> first Rx buffer */
517 			void* rxbuf_last;	/* -> last Rx buffer */
518 			void* tracebuf;		/* -> current Trace buffer */
519 			void* tracebuf_base;	/* -> current Trace buffer */
520 			void* tracebuf_last;	/* -> current Trace buffer */
521 			unsigned rx_base;	/* receive buffer base */
522 			unsigned rx_end;	/* receive buffer end */
523 			unsigned trace_base;	/* trace buffer base */
524 			unsigned trace_end;	/* trace buffer end */
525 
526 		} h;
527 	} u;
528 } sdla_t;
529 
530 /****** Public Functions ****************************************************/
531 
532 void wanpipe_open      (sdla_t* card);			/* wpmain.c */
533 void wanpipe_close     (sdla_t* card);			/* wpmain.c */
534 void wanpipe_set_state (sdla_t* card, int state);	/* wpmain.c */
535 
536 int wpx_init (sdla_t* card, wandev_conf_t* conf);	/* wpx.c */
537 int wpf_init (sdla_t* card, wandev_conf_t* conf);	/* wpf.c */
538 int wpp_init (sdla_t* card, wandev_conf_t* conf);	/* wpp.c */
539 int wpc_init (sdla_t* card, wandev_conf_t* conf); /* Cisco HDLC */
540 int bsc_init (sdla_t* card, wandev_conf_t* conf);	/* BSC streaming */
541 int hdlc_init(sdla_t* card, wandev_conf_t* conf);	/* HDLC support */
542 int wpft1_init (sdla_t* card, wandev_conf_t* conf);     /* FT1 Config support */
543 int wsppp_init (sdla_t* card, wandev_conf_t* conf);	/* Sync PPP on top of RAW CHDLC */
544 
545 extern sdla_t * wanpipe_find_card(char *);
546 extern sdla_t * wanpipe_find_card_num (int);
547 
548 extern void wanpipe_queue_tq (struct tq_struct *);
549 extern void wanpipe_mark_bh (void);
550 extern void wakeup_sk_bh (netdevice_t *);
551 extern int change_dev_flags (netdevice_t *, unsigned);
552 extern unsigned long get_ip_address (netdevice_t *dev, int option);
553 extern void add_gateway(sdla_t *, netdevice_t *);
554 
555 
556 #endif	/* __KERNEL__ */
557 #endif	/* _WANPIPE_H */
558 
559