aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/udp.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/net/udp.h')
-rw-r--r--include/net/udp.h97
1 files changed, 93 insertions, 4 deletions
diff --git a/include/net/udp.h b/include/net/udp.h
index db0c05f67546..1b921fa81474 100644
--- a/include/net/udp.h
+++ b/include/net/udp.h
@@ -26,9 +26,29 @@
26#include <net/inet_sock.h> 26#include <net/inet_sock.h>
27#include <net/sock.h> 27#include <net/sock.h>
28#include <net/snmp.h> 28#include <net/snmp.h>
29#include <net/ip.h>
30#include <linux/ipv6.h>
29#include <linux/seq_file.h> 31#include <linux/seq_file.h>
32#include <linux/poll.h>
30 33
31#define UDP_HTABLE_SIZE 128 34/**
35 * struct udp_skb_cb - UDP(-Lite) private variables
36 *
37 * @header: private variables used by IPv4/IPv6
38 * @cscov: checksum coverage length (UDP-Lite only)
39 * @partial_cov: if set indicates partial csum coverage
40 */
41struct udp_skb_cb {
42 union {
43 struct inet_skb_parm h4;
44#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
45 struct inet6_skb_parm h6;
46#endif
47 } header;
48 __u16 cscov;
49 __u8 partial_cov;
50};
51#define UDP_SKB_CB(__skb) ((struct udp_skb_cb *)((__skb)->cb))
32 52
33extern struct hlist_head udp_hash[UDP_HTABLE_SIZE]; 53extern struct hlist_head udp_hash[UDP_HTABLE_SIZE];
34extern rwlock_t udp_hash_lock; 54extern rwlock_t udp_hash_lock;
@@ -47,6 +67,62 @@ extern struct proto udp_prot;
47 67
48struct sk_buff; 68struct sk_buff;
49 69
70/*
71 * Generic checksumming routines for UDP(-Lite) v4 and v6
72 */
73static inline __sum16 __udp_lib_checksum_complete(struct sk_buff *skb)
74{
75 if (! UDP_SKB_CB(skb)->partial_cov)
76 return __skb_checksum_complete(skb);
77 return csum_fold(skb_checksum(skb, 0, UDP_SKB_CB(skb)->cscov,
78 skb->csum));
79}
80
81static inline int udp_lib_checksum_complete(struct sk_buff *skb)
82{
83 return skb->ip_summed != CHECKSUM_UNNECESSARY &&
84 __udp_lib_checksum_complete(skb);
85}
86
87/**
88 * udp_csum_outgoing - compute UDPv4/v6 checksum over fragments
89 * @sk: socket we are writing to
90 * @skb: sk_buff containing the filled-in UDP header
91 * (checksum field must be zeroed out)
92 */
93static inline __wsum udp_csum_outgoing(struct sock *sk, struct sk_buff *skb)
94{
95 __wsum csum = csum_partial(skb->h.raw, sizeof(struct udphdr), 0);
96
97 skb_queue_walk(&sk->sk_write_queue, skb) {
98 csum = csum_add(csum, skb->csum);
99 }
100 return csum;
101}
102
103/* hash routines shared between UDPv4/6 and UDP-Litev4/6 */
104static inline void udp_lib_hash(struct sock *sk)
105{
106 BUG();
107}
108
109static inline void udp_lib_unhash(struct sock *sk)
110{
111 write_lock_bh(&udp_hash_lock);
112 if (sk_del_node_init(sk)) {
113 inet_sk(sk)->num = 0;
114 sock_prot_dec_use(sk->sk_prot);
115 }
116 write_unlock_bh(&udp_hash_lock);
117}
118
119static inline void udp_lib_close(struct sock *sk, long timeout)
120{
121 sk_common_release(sk);
122}
123
124
125/* net/ipv4/udp.c */
50extern int udp_get_port(struct sock *sk, unsigned short snum, 126extern int udp_get_port(struct sock *sk, unsigned short snum,
51 int (*saddr_cmp)(const struct sock *, const struct sock *)); 127 int (*saddr_cmp)(const struct sock *, const struct sock *));
52extern void udp_err(struct sk_buff *, u32); 128extern void udp_err(struct sk_buff *, u32);
@@ -59,23 +135,36 @@ extern int udp_ioctl(struct sock *sk, int cmd, unsigned long arg);
59extern int udp_disconnect(struct sock *sk, int flags); 135extern int udp_disconnect(struct sock *sk, int flags);
60extern unsigned int udp_poll(struct file *file, struct socket *sock, 136extern unsigned int udp_poll(struct file *file, struct socket *sock,
61 poll_table *wait); 137 poll_table *wait);
138extern int udp_lib_getsockopt(struct sock *sk, int level, int optname,
139 char __user *optval, int __user *optlen);
140extern int udp_lib_setsockopt(struct sock *sk, int level, int optname,
141 char __user *optval, int optlen,
142 int (*push_pending_frames)(struct sock *));
62 143
63DECLARE_SNMP_STAT(struct udp_mib, udp_statistics); 144DECLARE_SNMP_STAT(struct udp_mib, udp_statistics);
64#define UDP_INC_STATS(field) SNMP_INC_STATS(udp_statistics, field) 145/*
65#define UDP_INC_STATS_BH(field) SNMP_INC_STATS_BH(udp_statistics, field) 146 * SNMP statistics for UDP and UDP-Lite
66#define UDP_INC_STATS_USER(field) SNMP_INC_STATS_USER(udp_statistics, field) 147 */
148#define UDP_INC_STATS_USER(field, is_udplite) do { \
149 if (is_udplite) SNMP_INC_STATS_USER(udplite_statistics, field); \
150 else SNMP_INC_STATS_USER(udp_statistics, field); } while(0)
151#define UDP_INC_STATS_BH(field, is_udplite) do { \
152 if (is_udplite) SNMP_INC_STATS_BH(udplite_statistics, field); \
153 else SNMP_INC_STATS_BH(udp_statistics, field); } while(0)
67 154
68/* /proc */ 155/* /proc */
69struct udp_seq_afinfo { 156struct udp_seq_afinfo {
70 struct module *owner; 157 struct module *owner;
71 char *name; 158 char *name;
72 sa_family_t family; 159 sa_family_t family;
160 struct hlist_head *hashtable;
73 int (*seq_show) (struct seq_file *m, void *v); 161 int (*seq_show) (struct seq_file *m, void *v);
74 struct file_operations *seq_fops; 162 struct file_operations *seq_fops;
75}; 163};
76 164
77struct udp_iter_state { 165struct udp_iter_state {
78 sa_family_t family; 166 sa_family_t family;
167 struct hlist_head *hashtable;
79 int bucket; 168 int bucket;
80 struct seq_operations seq_ops; 169 struct seq_operations seq_ops;
81}; 170};