2005-04-17 02:20:36 +04:00
# ifndef LLC_H
# define LLC_H
/*
* Copyright ( c ) 1997 by Procom Technology , Inc .
* 2001 - 2003 by Arnaldo Carvalho de Melo < acme @ conectiva . com . br >
*
* This program can be redistributed or modified under the terms of the
* GNU General Public License as published by the Free Software Foundation .
* This program is distributed without any warranty or implied warranty
* of merchantability or fitness for a particular purpose .
*
* See the GNU General Public License for more details .
*/
# include <linux/if.h>
# include <linux/if_ether.h>
# include <linux/list.h>
# include <linux/spinlock.h>
2005-09-22 11:43:05 +04:00
# include <asm/atomic.h>
2005-04-17 02:20:36 +04:00
struct net_device ;
struct packet_type ;
struct sk_buff ;
struct llc_addr {
unsigned char lsap ;
unsigned char mac [ IFHWADDRLEN ] ;
} ;
# define LLC_SAP_STATE_INACTIVE 1
# define LLC_SAP_STATE_ACTIVE 2
/**
* struct llc_sap - Defines the SAP component
*
* @ station - station this sap belongs to
* @ state - sap state
* @ p_bit - only lowest - order bit used
* @ f_bit - only lowest - order bit used
* @ laddr - SAP value in this ' lsap '
* @ node - entry in station sap_list
* @ sk_list - LLC sockets this one manages
*/
struct llc_sap {
unsigned char state ;
unsigned char p_bit ;
unsigned char f_bit ;
2005-09-22 11:43:05 +04:00
atomic_t refcnt ;
2005-04-17 02:20:36 +04:00
int ( * rcv_func ) ( struct sk_buff * skb ,
struct net_device * dev ,
2005-08-10 06:34:12 +04:00
struct packet_type * pt ,
struct net_device * orig_dev ) ;
2005-04-17 02:20:36 +04:00
struct llc_addr laddr ;
struct list_head node ;
struct {
rwlock_t lock ;
struct hlist_head list ;
} sk_list ;
} ;
# define LLC_DEST_INVALID 0 /* Invalid LLC PDU type */
# define LLC_DEST_SAP 1 /* Type 1 goes here */
# define LLC_DEST_CONN 2 /* Type 2 goes here */
extern struct list_head llc_sap_list ;
extern rwlock_t llc_sap_list_lock ;
extern unsigned char llc_station_mac_sa [ ETH_ALEN ] ;
extern int llc_rcv ( struct sk_buff * skb , struct net_device * dev ,
2005-08-10 06:34:12 +04:00
struct packet_type * pt , struct net_device * orig_dev ) ;
2005-04-17 02:20:36 +04:00
extern int llc_mac_hdr_init ( struct sk_buff * skb ,
unsigned char * sa , unsigned char * da ) ;
extern void llc_add_pack ( int type , void ( * handler ) ( struct llc_sap * sap ,
struct sk_buff * skb ) ) ;
extern void llc_remove_pack ( int type ) ;
extern void llc_set_station_handler ( void ( * handler ) ( struct sk_buff * skb ) ) ;
extern struct llc_sap * llc_sap_open ( unsigned char lsap ,
int ( * rcv ) ( struct sk_buff * skb ,
struct net_device * dev ,
2005-08-10 06:34:12 +04:00
struct packet_type * pt ,
struct net_device * orig_dev ) ) ;
2005-09-22 11:43:05 +04:00
static inline void llc_sap_hold ( struct llc_sap * sap )
{
atomic_inc ( & sap - > refcnt ) ;
}
2005-09-22 12:14:33 +04:00
extern void llc_sap_close ( struct llc_sap * sap ) ;
2005-09-22 11:43:05 +04:00
static inline void llc_sap_put ( struct llc_sap * sap )
{
if ( atomic_dec_and_test ( & sap - > refcnt ) )
llc_sap_close ( sap ) ;
}
2005-04-17 02:20:36 +04:00
extern struct llc_sap * llc_sap_find ( unsigned char sap_value ) ;
extern int llc_build_and_send_ui_pkt ( struct llc_sap * sap , struct sk_buff * skb ,
unsigned char * dmac , unsigned char dsap ) ;
2005-09-22 12:14:33 +04:00
extern void llc_sap_handler ( struct llc_sap * sap , struct sk_buff * skb ) ;
extern void llc_conn_handler ( struct llc_sap * sap , struct sk_buff * skb ) ;
2005-04-17 02:20:36 +04:00
extern int llc_station_init ( void ) ;
extern void llc_station_exit ( void ) ;
# ifdef CONFIG_PROC_FS
extern int llc_proc_init ( void ) ;
extern void llc_proc_exit ( void ) ;
# else
# define llc_proc_init() (0)
# define llc_proc_exit() do { } while(0)
# endif /* CONFIG_PROC_FS */
2005-09-22 11:30:44 +04:00
# ifdef CONFIG_SYSCTL
extern int llc_sysctl_init ( void ) ;
extern void llc_sysctl_exit ( void ) ;
2005-09-22 12:14:33 +04:00
extern int sysctl_llc2_ack_timeout ;
extern int sysctl_llc2_busy_timeout ;
extern int sysctl_llc2_p_timeout ;
extern int sysctl_llc2_rej_timeout ;
extern int sysctl_llc_station_ack_timeout ;
2005-09-22 11:30:44 +04:00
# else
# define llc_sysctl_init() (0)
# define llc_sysctl_exit() do { } while(0)
# endif /* CONFIG_SYSCTL */
2005-04-17 02:20:36 +04:00
# endif /* LLC_H */