Branch data Line data Source code
1 : : #ifndef LLC_H 2 : : #define LLC_H 3 : : /* 4 : : * Copyright (c) 1997 by Procom Technology, Inc. 5 : : * 2001-2003 by Arnaldo Carvalho de Melo <acme@conectiva.com.br> 6 : : * 7 : : * This program can be redistributed or modified under the terms of the 8 : : * GNU General Public License as published by the Free Software Foundation. 9 : : * This program is distributed without any warranty or implied warranty 10 : : * of merchantability or fitness for a particular purpose. 11 : : * 12 : : * See the GNU General Public License for more details. 13 : : */ 14 : : 15 : : #include <linux/if.h> 16 : : #include <linux/if_ether.h> 17 : : #include <linux/list.h> 18 : : #include <linux/spinlock.h> 19 : : #include <linux/rculist_nulls.h> 20 : : #include <linux/hash.h> 21 : : #include <linux/jhash.h> 22 : : 23 : : #include <linux/atomic.h> 24 : : 25 : : struct net_device; 26 : : struct packet_type; 27 : : struct sk_buff; 28 : : 29 : : struct llc_addr { 30 : : unsigned char lsap; 31 : : unsigned char mac[IFHWADDRLEN]; 32 : : }; 33 : : 34 : : #define LLC_SAP_STATE_INACTIVE 1 35 : : #define LLC_SAP_STATE_ACTIVE 2 36 : : 37 : : #define LLC_SK_DEV_HASH_BITS 6 38 : : #define LLC_SK_DEV_HASH_ENTRIES (1<<LLC_SK_DEV_HASH_BITS) 39 : : 40 : : #define LLC_SK_LADDR_HASH_BITS 6 41 : : #define LLC_SK_LADDR_HASH_ENTRIES (1<<LLC_SK_LADDR_HASH_BITS) 42 : : 43 : : /** 44 : : * struct llc_sap - Defines the SAP component 45 : : * 46 : : * @station - station this sap belongs to 47 : : * @state - sap state 48 : : * @p_bit - only lowest-order bit used 49 : : * @f_bit - only lowest-order bit used 50 : : * @laddr - SAP value in this 'lsap' 51 : : * @node - entry in station sap_list 52 : : * @sk_list - LLC sockets this one manages 53 : : */ 54 : : struct llc_sap { 55 : : unsigned char state; 56 : : unsigned char p_bit; 57 : : unsigned char f_bit; 58 : : refcount_t refcnt; 59 : : int (*rcv_func)(struct sk_buff *skb, 60 : : struct net_device *dev, 61 : : struct packet_type *pt, 62 : : struct net_device *orig_dev); 63 : : struct llc_addr laddr; 64 : : struct list_head node; 65 : : spinlock_t sk_lock; 66 : : int sk_count; 67 : : struct hlist_nulls_head sk_laddr_hash[LLC_SK_LADDR_HASH_ENTRIES]; 68 : : struct hlist_head sk_dev_hash[LLC_SK_DEV_HASH_ENTRIES]; 69 : : struct rcu_head rcu; 70 : : }; 71 : : 72 : : static inline 73 : : struct hlist_head *llc_sk_dev_hash(struct llc_sap *sap, int ifindex) 74 : : { 75 : : return &sap->sk_dev_hash[ifindex % LLC_SK_DEV_HASH_ENTRIES]; 76 : : } 77 : : 78 : : static inline 79 : : u32 llc_sk_laddr_hashfn(struct llc_sap *sap, const struct llc_addr *laddr) 80 : : { 81 : : return hash_32(jhash(laddr->mac, sizeof(laddr->mac), 0), 82 : : LLC_SK_LADDR_HASH_BITS); 83 : : } 84 : : 85 : : static inline 86 : : struct hlist_nulls_head *llc_sk_laddr_hash(struct llc_sap *sap, 87 : : const struct llc_addr *laddr) 88 : : { 89 : : return &sap->sk_laddr_hash[llc_sk_laddr_hashfn(sap, laddr)]; 90 : : } 91 : : 92 : : #define LLC_DEST_INVALID 0 /* Invalid LLC PDU type */ 93 : : #define LLC_DEST_SAP 1 /* Type 1 goes here */ 94 : : #define LLC_DEST_CONN 2 /* Type 2 goes here */ 95 : : 96 : : extern struct list_head llc_sap_list; 97 : : 98 : : int llc_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, 99 : : struct net_device *orig_dev); 100 : : 101 : : int llc_mac_hdr_init(struct sk_buff *skb, const unsigned char *sa, 102 : : const unsigned char *da); 103 : : 104 : : void llc_add_pack(int type, 105 : : void (*handler)(struct llc_sap *sap, struct sk_buff *skb)); 106 : : void llc_remove_pack(int type); 107 : : 108 : : void llc_set_station_handler(void (*handler)(struct sk_buff *skb)); 109 : : 110 : : struct llc_sap *llc_sap_open(unsigned char lsap, 111 : : int (*rcv)(struct sk_buff *skb, 112 : : struct net_device *dev, 113 : : struct packet_type *pt, 114 : : struct net_device *orig_dev)); 115 : : static inline void llc_sap_hold(struct llc_sap *sap) 116 : : { 117 : : refcount_inc(&sap->refcnt); 118 : : } 119 : : 120 : : static inline bool llc_sap_hold_safe(struct llc_sap *sap) 121 : : { 122 : 0 : return refcount_inc_not_zero(&sap->refcnt); 123 : : } 124 : : 125 : : void llc_sap_close(struct llc_sap *sap); 126 : : 127 : 0 : static inline void llc_sap_put(struct llc_sap *sap) 128 : : { 129 : 0 : if (refcount_dec_and_test(&sap->refcnt)) 130 : 0 : llc_sap_close(sap); 131 : 0 : } 132 : : 133 : : struct llc_sap *llc_sap_find(unsigned char sap_value); 134 : : 135 : : int llc_build_and_send_ui_pkt(struct llc_sap *sap, struct sk_buff *skb, 136 : : unsigned char *dmac, unsigned char dsap); 137 : : 138 : : void llc_sap_handler(struct llc_sap *sap, struct sk_buff *skb); 139 : : void llc_conn_handler(struct llc_sap *sap, struct sk_buff *skb); 140 : : 141 : : void llc_station_init(void); 142 : : void llc_station_exit(void); 143 : : 144 : : #ifdef CONFIG_PROC_FS 145 : : int llc_proc_init(void); 146 : : void llc_proc_exit(void); 147 : : #else 148 : : #define llc_proc_init() (0) 149 : : #define llc_proc_exit() do { } while(0) 150 : : #endif /* CONFIG_PROC_FS */ 151 : : #ifdef CONFIG_SYSCTL 152 : : int llc_sysctl_init(void); 153 : : void llc_sysctl_exit(void); 154 : : 155 : : extern int sysctl_llc2_ack_timeout; 156 : : extern int sysctl_llc2_busy_timeout; 157 : : extern int sysctl_llc2_p_timeout; 158 : : extern int sysctl_llc2_rej_timeout; 159 : : #else 160 : : #define llc_sysctl_init() (0) 161 : : #define llc_sysctl_exit() do { } while(0) 162 : : #endif /* CONFIG_SYSCTL */ 163 : : #endif /* LLC_H */