diff options
Diffstat (limited to 'include/net/llc.h')
| -rw-r--r-- | include/net/llc.h | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/include/net/llc.h b/include/net/llc.h index 7940da1606e7..5503b74ab170 100644 --- a/include/net/llc.h +++ b/include/net/llc.h | |||
| @@ -16,6 +16,9 @@ | |||
| 16 | #include <linux/if_ether.h> | 16 | #include <linux/if_ether.h> |
| 17 | #include <linux/list.h> | 17 | #include <linux/list.h> |
| 18 | #include <linux/spinlock.h> | 18 | #include <linux/spinlock.h> |
| 19 | #include <linux/rculist_nulls.h> | ||
| 20 | #include <linux/hash.h> | ||
| 21 | #include <linux/jhash.h> | ||
| 19 | 22 | ||
| 20 | #include <asm/atomic.h> | 23 | #include <asm/atomic.h> |
| 21 | 24 | ||
| @@ -31,6 +34,12 @@ struct llc_addr { | |||
| 31 | #define LLC_SAP_STATE_INACTIVE 1 | 34 | #define LLC_SAP_STATE_INACTIVE 1 |
| 32 | #define LLC_SAP_STATE_ACTIVE 2 | 35 | #define LLC_SAP_STATE_ACTIVE 2 |
| 33 | 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 | |||
| 34 | /** | 43 | /** |
| 35 | * struct llc_sap - Defines the SAP component | 44 | * struct llc_sap - Defines the SAP component |
| 36 | * | 45 | * |
| @@ -53,18 +62,38 @@ struct llc_sap { | |||
| 53 | struct net_device *orig_dev); | 62 | struct net_device *orig_dev); |
| 54 | struct llc_addr laddr; | 63 | struct llc_addr laddr; |
| 55 | struct list_head node; | 64 | struct list_head node; |
| 56 | struct { | 65 | spinlock_t sk_lock; |
| 57 | rwlock_t lock; | 66 | int sk_count; |
| 58 | struct hlist_head list; | 67 | struct hlist_nulls_head sk_laddr_hash[LLC_SK_LADDR_HASH_ENTRIES]; |
| 59 | } sk_list; | 68 | struct hlist_head sk_dev_hash[LLC_SK_DEV_HASH_ENTRIES]; |
| 60 | }; | 69 | }; |
| 61 | 70 | ||
| 71 | static inline | ||
| 72 | struct hlist_head *llc_sk_dev_hash(struct llc_sap *sap, int ifindex) | ||
| 73 | { | ||
| 74 | return &sap->sk_dev_hash[ifindex % LLC_SK_DEV_HASH_ENTRIES]; | ||
| 75 | } | ||
| 76 | |||
| 77 | static inline | ||
| 78 | u32 llc_sk_laddr_hashfn(struct llc_sap *sap, const struct llc_addr *laddr) | ||
| 79 | { | ||
| 80 | return hash_32(jhash(laddr->mac, sizeof(laddr->mac), 0), | ||
| 81 | LLC_SK_LADDR_HASH_BITS); | ||
| 82 | } | ||
| 83 | |||
| 84 | static inline | ||
| 85 | struct hlist_nulls_head *llc_sk_laddr_hash(struct llc_sap *sap, | ||
| 86 | const struct llc_addr *laddr) | ||
| 87 | { | ||
| 88 | return &sap->sk_laddr_hash[llc_sk_laddr_hashfn(sap, laddr)]; | ||
| 89 | } | ||
| 90 | |||
| 62 | #define LLC_DEST_INVALID 0 /* Invalid LLC PDU type */ | 91 | #define LLC_DEST_INVALID 0 /* Invalid LLC PDU type */ |
| 63 | #define LLC_DEST_SAP 1 /* Type 1 goes here */ | 92 | #define LLC_DEST_SAP 1 /* Type 1 goes here */ |
| 64 | #define LLC_DEST_CONN 2 /* Type 2 goes here */ | 93 | #define LLC_DEST_CONN 2 /* Type 2 goes here */ |
| 65 | 94 | ||
| 66 | extern struct list_head llc_sap_list; | 95 | extern struct list_head llc_sap_list; |
| 67 | extern rwlock_t llc_sap_list_lock; | 96 | extern spinlock_t llc_sap_list_lock; |
| 68 | 97 | ||
| 69 | extern int llc_rcv(struct sk_buff *skb, struct net_device *dev, | 98 | extern int llc_rcv(struct sk_buff *skb, struct net_device *dev, |
| 70 | struct packet_type *pt, struct net_device *orig_dev); | 99 | struct packet_type *pt, struct net_device *orig_dev); |
