diff options
Diffstat (limited to 'include/net/udp.h')
-rw-r--r-- | include/net/udp.h | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/include/net/udp.h b/include/net/udp.h index f98abd2ce709..5348d80b25bb 100644 --- a/include/net/udp.h +++ b/include/net/udp.h | |||
@@ -50,16 +50,49 @@ struct udp_skb_cb { | |||
50 | }; | 50 | }; |
51 | #define UDP_SKB_CB(__skb) ((struct udp_skb_cb *)((__skb)->cb)) | 51 | #define UDP_SKB_CB(__skb) ((struct udp_skb_cb *)((__skb)->cb)) |
52 | 52 | ||
53 | /** | ||
54 | * struct udp_hslot - UDP hash slot | ||
55 | * | ||
56 | * @head: head of list of sockets | ||
57 | * @count: number of sockets in 'head' list | ||
58 | * @lock: spinlock protecting changes to head/count | ||
59 | */ | ||
53 | struct udp_hslot { | 60 | struct udp_hslot { |
54 | struct hlist_nulls_head head; | 61 | struct hlist_nulls_head head; |
62 | int count; | ||
55 | spinlock_t lock; | 63 | spinlock_t lock; |
56 | } __attribute__((aligned(2 * sizeof(long)))); | 64 | } __attribute__((aligned(2 * sizeof(long)))); |
65 | |||
66 | /** | ||
67 | * struct udp_table - UDP table | ||
68 | * | ||
69 | * @hash: hash table, sockets are hashed on (local port) | ||
70 | * @hash2: hash table, sockets are hashed on (local port, local address) | ||
71 | * @mask: number of slots in hash tables, minus 1 | ||
72 | * @log: log2(number of slots in hash table) | ||
73 | */ | ||
57 | struct udp_table { | 74 | struct udp_table { |
58 | struct udp_hslot hash[UDP_HTABLE_SIZE]; | 75 | struct udp_hslot *hash; |
76 | struct udp_hslot *hash2; | ||
77 | unsigned int mask; | ||
78 | unsigned int log; | ||
59 | }; | 79 | }; |
60 | extern struct udp_table udp_table; | 80 | extern struct udp_table udp_table; |
61 | extern void udp_table_init(struct udp_table *); | 81 | extern void udp_table_init(struct udp_table *, const char *); |
62 | 82 | static inline struct udp_hslot *udp_hashslot(struct udp_table *table, | |
83 | struct net *net, unsigned num) | ||
84 | { | ||
85 | return &table->hash[udp_hashfn(net, num, table->mask)]; | ||
86 | } | ||
87 | /* | ||
88 | * For secondary hash, net_hash_mix() is performed before calling | ||
89 | * udp_hashslot2(), this explains difference with udp_hashslot() | ||
90 | */ | ||
91 | static inline struct udp_hslot *udp_hashslot2(struct udp_table *table, | ||
92 | unsigned int hash) | ||
93 | { | ||
94 | return &table->hash2[hash & table->mask]; | ||
95 | } | ||
63 | 96 | ||
64 | /* Note: this must match 'valbool' in sock_setsockopt */ | 97 | /* Note: this must match 'valbool' in sock_setsockopt */ |
65 | #define UDP_CSUM_NOXMIT 1 | 98 | #define UDP_CSUM_NOXMIT 1 |
@@ -125,7 +158,8 @@ static inline void udp_lib_close(struct sock *sk, long timeout) | |||
125 | } | 158 | } |
126 | 159 | ||
127 | extern int udp_lib_get_port(struct sock *sk, unsigned short snum, | 160 | extern int udp_lib_get_port(struct sock *sk, unsigned short snum, |
128 | int (*)(const struct sock*,const struct sock*)); | 161 | int (*)(const struct sock *,const struct sock *), |
162 | unsigned int hash2_nulladdr); | ||
129 | 163 | ||
130 | /* net/ipv4/udp.c */ | 164 | /* net/ipv4/udp.c */ |
131 | extern int udp_get_port(struct sock *sk, unsigned short snum, | 165 | extern int udp_get_port(struct sock *sk, unsigned short snum, |