aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/dccp/dccp.h22
-rw-r--r--net/dccp/input.c4
-rw-r--r--net/dccp/ipv4.c73
-rw-r--r--net/dccp/minisocks.c8
-rw-r--r--net/dccp/output.c27
-rw-r--r--net/dccp/proto.c32
6 files changed, 114 insertions, 52 deletions
diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h
index e711f850053b..93f26dd6e6cb 100644
--- a/net/dccp/dccp.h
+++ b/net/dccp/dccp.h
@@ -228,6 +228,9 @@ extern int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
228extern int dccp_rcv_established(struct sock *sk, struct sk_buff *skb, 228extern int dccp_rcv_established(struct sock *sk, struct sk_buff *skb,
229 const struct dccp_hdr *dh, const unsigned len); 229 const struct dccp_hdr *dh, const unsigned len);
230 230
231extern int dccp_v4_init_sock(struct sock *sk);
232extern int dccp_v4_destroy_sock(struct sock *sk);
233
231extern void dccp_close(struct sock *sk, long timeout); 234extern void dccp_close(struct sock *sk, long timeout);
232extern struct sk_buff *dccp_make_response(struct sock *sk, 235extern struct sk_buff *dccp_make_response(struct sock *sk,
233 struct dst_entry *dst, 236 struct dst_entry *dst,
@@ -238,6 +241,7 @@ extern struct sk_buff *dccp_make_reset(struct sock *sk,
238 241
239extern int dccp_connect(struct sock *sk); 242extern int dccp_connect(struct sock *sk);
240extern int dccp_disconnect(struct sock *sk, int flags); 243extern int dccp_disconnect(struct sock *sk, int flags);
244extern void dccp_unhash(struct sock *sk);
241extern int dccp_getsockopt(struct sock *sk, int level, int optname, 245extern int dccp_getsockopt(struct sock *sk, int level, int optname,
242 char __user *optval, int __user *optlen); 246 char __user *optval, int __user *optlen);
243extern int dccp_setsockopt(struct sock *sk, int level, int optname, 247extern int dccp_setsockopt(struct sock *sk, int level, int optname,
@@ -249,6 +253,13 @@ extern int dccp_recvmsg(struct kiocb *iocb, struct sock *sk,
249 struct msghdr *msg, size_t len, int nonblock, 253 struct msghdr *msg, size_t len, int nonblock,
250 int flags, int *addr_len); 254 int flags, int *addr_len);
251extern void dccp_shutdown(struct sock *sk, int how); 255extern void dccp_shutdown(struct sock *sk, int how);
256extern int inet_dccp_listen(struct socket *sock, int backlog);
257extern unsigned int dccp_poll(struct file *file, struct socket *sock,
258 poll_table *wait);
259extern void dccp_v4_send_check(struct sock *sk, int len,
260 struct sk_buff *skb);
261extern int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr,
262 int addr_len);
252 263
253extern int dccp_v4_checksum(const struct sk_buff *skb, 264extern int dccp_v4_checksum(const struct sk_buff *skb,
254 const u32 saddr, const u32 daddr); 265 const u32 saddr, const u32 daddr);
@@ -256,6 +267,17 @@ extern int dccp_v4_checksum(const struct sk_buff *skb,
256extern int dccp_v4_send_reset(struct sock *sk, 267extern int dccp_v4_send_reset(struct sock *sk,
257 enum dccp_reset_codes code); 268 enum dccp_reset_codes code);
258extern void dccp_send_close(struct sock *sk, const int active); 269extern void dccp_send_close(struct sock *sk, const int active);
270extern int dccp_invalid_packet(struct sk_buff *skb);
271
272static inline int dccp_bad_service_code(const struct sock *sk,
273 const __u32 service)
274{
275 const struct dccp_sock *dp = dccp_sk(sk);
276
277 if (dp->dccps_service == service)
278 return 0;
279 return !dccp_list_has_service(dp->dccps_service_list, service);
280}
259 281
260struct dccp_skb_cb { 282struct dccp_skb_cb {
261 __u8 dccpd_type:4; 283 __u8 dccpd_type:4;
diff --git a/net/dccp/input.c b/net/dccp/input.c
index c81488fa293e..9a724ff2a622 100644
--- a/net/dccp/input.c
+++ b/net/dccp/input.c
@@ -250,6 +250,8 @@ discard:
250 return 0; 250 return 0;
251} 251}
252 252
253EXPORT_SYMBOL_GPL(dccp_rcv_established);
254
253static int dccp_rcv_request_sent_state_process(struct sock *sk, 255static int dccp_rcv_request_sent_state_process(struct sock *sk,
254 struct sk_buff *skb, 256 struct sk_buff *skb,
255 const struct dccp_hdr *dh, 257 const struct dccp_hdr *dh,
@@ -567,3 +569,5 @@ discard:
567 } 569 }
568 return 0; 570 return 0;
569} 571}
572
573EXPORT_SYMBOL_GPL(dccp_rcv_state_process);
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c
index 9f69a67a4b01..3108c9d464f7 100644
--- a/net/dccp/ipv4.c
+++ b/net/dccp/ipv4.c
@@ -46,11 +46,13 @@ static void dccp_v4_hash(struct sock *sk)
46 inet_hash(&dccp_hashinfo, sk); 46 inet_hash(&dccp_hashinfo, sk);
47} 47}
48 48
49static void dccp_v4_unhash(struct sock *sk) 49void dccp_unhash(struct sock *sk)
50{ 50{
51 inet_unhash(&dccp_hashinfo, sk); 51 inet_unhash(&dccp_hashinfo, sk);
52} 52}
53 53
54EXPORT_SYMBOL_GPL(dccp_unhash);
55
54/* called with local bh disabled */ 56/* called with local bh disabled */
55static int __dccp_v4_check_established(struct sock *sk, const __u16 lport, 57static int __dccp_v4_check_established(struct sock *sk, const __u16 lport,
56 struct inet_timewait_sock **twp) 58 struct inet_timewait_sock **twp)
@@ -209,8 +211,7 @@ out:
209 } 211 }
210} 212}
211 213
212static int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, 214int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
213 int addr_len)
214{ 215{
215 struct inet_sock *inet = inet_sk(sk); 216 struct inet_sock *inet = inet_sk(sk);
216 struct dccp_sock *dp = dccp_sk(sk); 217 struct dccp_sock *dp = dccp_sk(sk);
@@ -288,16 +289,6 @@ static int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr,
288 usin->sin_port); 289 usin->sin_port);
289 dccp_update_gss(sk, dp->dccps_iss); 290 dccp_update_gss(sk, dp->dccps_iss);
290 291
291 /*
292 * SWL and AWL are initially adjusted so that they are not less than
293 * the initial Sequence Numbers received and sent, respectively:
294 * SWL := max(GSR + 1 - floor(W/4), ISR),
295 * AWL := max(GSS - W' + 1, ISS).
296 * These adjustments MUST be applied only at the beginning of the
297 * connection.
298 */
299 dccp_set_seqno(&dp->dccps_awl, max48(dp->dccps_awl, dp->dccps_iss));
300
301 inet->id = dp->dccps_iss ^ jiffies; 292 inet->id = dp->dccps_iss ^ jiffies;
302 293
303 err = dccp_connect(sk); 294 err = dccp_connect(sk);
@@ -317,6 +308,8 @@ failure:
317 goto out; 308 goto out;
318} 309}
319 310
311EXPORT_SYMBOL_GPL(dccp_v4_connect);
312
320/* 313/*
321 * This routine does path mtu discovery as defined in RFC1191. 314 * This routine does path mtu discovery as defined in RFC1191.
322 */ 315 */
@@ -608,7 +601,7 @@ out:
608} 601}
609 602
610/* This routine computes an IPv4 DCCP checksum. */ 603/* This routine computes an IPv4 DCCP checksum. */
611static void dccp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb) 604void dccp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb)
612{ 605{
613 const struct inet_sock *inet = inet_sk(sk); 606 const struct inet_sock *inet = inet_sk(sk);
614 struct dccp_hdr *dh = dccp_hdr(skb); 607 struct dccp_hdr *dh = dccp_hdr(skb);
@@ -616,6 +609,8 @@ static void dccp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb)
616 dh->dccph_checksum = dccp_v4_checksum(skb, inet->saddr, inet->daddr); 609 dh->dccph_checksum = dccp_v4_checksum(skb, inet->saddr, inet->daddr);
617} 610}
618 611
612EXPORT_SYMBOL_GPL(dccp_v4_send_check);
613
619int dccp_v4_send_reset(struct sock *sk, enum dccp_reset_codes code) 614int dccp_v4_send_reset(struct sock *sk, enum dccp_reset_codes code)
620{ 615{
621 struct sk_buff *skb; 616 struct sk_buff *skb;
@@ -651,16 +646,6 @@ static inline u64 dccp_v4_init_sequence(const struct sock *sk,
651 dccp_hdr(skb)->dccph_sport); 646 dccp_hdr(skb)->dccph_sport);
652} 647}
653 648
654static inline int dccp_bad_service_code(const struct sock *sk,
655 const __u32 service)
656{
657 const struct dccp_sock *dp = dccp_sk(sk);
658
659 if (dp->dccps_service == service)
660 return 0;
661 return !dccp_list_has_service(dp->dccps_service_list, service);
662}
663
664int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb) 649int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
665{ 650{
666 struct inet_request_sock *ireq; 651 struct inet_request_sock *ireq;
@@ -672,7 +657,6 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
672 const __u32 service = dccp_hdr_request(skb)->dccph_req_service; 657 const __u32 service = dccp_hdr_request(skb)->dccph_req_service;
673 struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb); 658 struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb);
674 __u8 reset_code = DCCP_RESET_CODE_TOO_BUSY; 659 __u8 reset_code = DCCP_RESET_CODE_TOO_BUSY;
675 struct dst_entry *dst = NULL;
676 660
677 /* Never answer to DCCP_PKT_REQUESTs send to broadcast or multicast */ 661 /* Never answer to DCCP_PKT_REQUESTs send to broadcast or multicast */
678 if (((struct rtable *)skb->dst)->rt_flags & 662 if (((struct rtable *)skb->dst)->rt_flags &
@@ -713,7 +697,6 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
713 ireq = inet_rsk(req); 697 ireq = inet_rsk(req);
714 ireq->loc_addr = daddr; 698 ireq->loc_addr = daddr;
715 ireq->rmt_addr = saddr; 699 ireq->rmt_addr = saddr;
716 /* FIXME: Merge Aristeu's option parsing code when ready */
717 req->rcv_wnd = 100; /* Fake, option parsing will get the 700 req->rcv_wnd = 100; /* Fake, option parsing will get the
718 right value */ 701 right value */
719 ireq->opt = NULL; 702 ireq->opt = NULL;
@@ -731,7 +714,7 @@ int dccp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
731 dreq->dreq_iss = dccp_v4_init_sequence(sk, skb); 714 dreq->dreq_iss = dccp_v4_init_sequence(sk, skb);
732 dreq->dreq_service = service; 715 dreq->dreq_service = service;
733 716
734 if (dccp_v4_send_response(sk, req, dst)) 717 if (dccp_v4_send_response(sk, req, NULL))
735 goto drop_and_free; 718 goto drop_and_free;
736 719
737 inet_csk_reqsk_queue_hash_add(sk, req, DCCP_TIMEOUT_INIT); 720 inet_csk_reqsk_queue_hash_add(sk, req, DCCP_TIMEOUT_INIT);
@@ -748,6 +731,8 @@ drop:
748 return -1; 731 return -1;
749} 732}
750 733
734EXPORT_SYMBOL_GPL(dccp_v4_conn_request);
735
751/* 736/*
752 * The three way handshake has completed - we got a valid ACK or DATAACK - 737 * The three way handshake has completed - we got a valid ACK or DATAACK -
753 * now create the new socket. 738 * now create the new socket.
@@ -802,6 +787,8 @@ exit:
802 return NULL; 787 return NULL;
803} 788}
804 789
790EXPORT_SYMBOL_GPL(dccp_v4_request_recv_sock);
791
805static struct sock *dccp_v4_hnd_req(struct sock *sk, struct sk_buff *skb) 792static struct sock *dccp_v4_hnd_req(struct sock *sk, struct sk_buff *skb)
806{ 793{
807 const struct dccp_hdr *dh = dccp_hdr(skb); 794 const struct dccp_hdr *dh = dccp_hdr(skb);
@@ -1021,7 +1008,9 @@ discard:
1021 return 0; 1008 return 0;
1022} 1009}
1023 1010
1024static inline int dccp_invalid_packet(struct sk_buff *skb) 1011EXPORT_SYMBOL_GPL(dccp_v4_do_rcv);
1012
1013int dccp_invalid_packet(struct sk_buff *skb)
1025{ 1014{
1026 const struct dccp_hdr *dh; 1015 const struct dccp_hdr *dh;
1027 1016
@@ -1075,17 +1064,11 @@ static inline int dccp_invalid_packet(struct sk_buff *skb)
1075 return 1; 1064 return 1;
1076 } 1065 }
1077 1066
1078 /* If the header checksum is incorrect, drop packet and return */
1079 if (dccp_v4_verify_checksum(skb, skb->nh.iph->saddr,
1080 skb->nh.iph->daddr) < 0) {
1081 LIMIT_NETDEBUG(KERN_WARNING "DCCP: header checksum is "
1082 "incorrect\n");
1083 return 1;
1084 }
1085
1086 return 0; 1067 return 0;
1087} 1068}
1088 1069
1070EXPORT_SYMBOL_GPL(dccp_invalid_packet);
1071
1089/* this is called when real data arrives */ 1072/* this is called when real data arrives */
1090int dccp_v4_rcv(struct sk_buff *skb) 1073int dccp_v4_rcv(struct sk_buff *skb)
1091{ 1074{
@@ -1098,6 +1081,14 @@ int dccp_v4_rcv(struct sk_buff *skb)
1098 if (dccp_invalid_packet(skb)) 1081 if (dccp_invalid_packet(skb))
1099 goto discard_it; 1082 goto discard_it;
1100 1083
1084 /* If the header checksum is incorrect, drop packet and return */
1085 if (dccp_v4_verify_checksum(skb, skb->nh.iph->saddr,
1086 skb->nh.iph->daddr) < 0) {
1087 LIMIT_NETDEBUG(KERN_WARNING "%s: incorrect header checksum\n",
1088 __FUNCTION__);
1089 goto discard_it;
1090 }
1091
1101 dh = dccp_hdr(skb); 1092 dh = dccp_hdr(skb);
1102 1093
1103 DCCP_SKB_CB(skb)->dccpd_seq = dccp_hdr_seq(skb); 1094 DCCP_SKB_CB(skb)->dccpd_seq = dccp_hdr_seq(skb);
@@ -1217,7 +1208,7 @@ struct inet_connection_sock_af_ops dccp_ipv4_af_ops = {
1217 .sockaddr_len = sizeof(struct sockaddr_in), 1208 .sockaddr_len = sizeof(struct sockaddr_in),
1218}; 1209};
1219 1210
1220static int dccp_v4_init_sock(struct sock *sk) 1211int dccp_v4_init_sock(struct sock *sk)
1221{ 1212{
1222 struct dccp_sock *dp = dccp_sk(sk); 1213 struct dccp_sock *dp = dccp_sk(sk);
1223 static int dccp_ctl_socket_init = 1; 1214 static int dccp_ctl_socket_init = 1;
@@ -1270,7 +1261,9 @@ static int dccp_v4_init_sock(struct sock *sk)
1270 return 0; 1261 return 0;
1271} 1262}
1272 1263
1273static int dccp_v4_destroy_sock(struct sock *sk) 1264EXPORT_SYMBOL_GPL(dccp_v4_init_sock);
1265
1266int dccp_v4_destroy_sock(struct sock *sk)
1274{ 1267{
1275 struct dccp_sock *dp = dccp_sk(sk); 1268 struct dccp_sock *dp = dccp_sk(sk);
1276 1269
@@ -1303,6 +1296,8 @@ static int dccp_v4_destroy_sock(struct sock *sk)
1303 return 0; 1296 return 0;
1304} 1297}
1305 1298
1299EXPORT_SYMBOL_GPL(dccp_v4_destroy_sock);
1300
1306static void dccp_v4_reqsk_destructor(struct request_sock *req) 1301static void dccp_v4_reqsk_destructor(struct request_sock *req)
1307{ 1302{
1308 kfree(inet_rsk(req)->opt); 1303 kfree(inet_rsk(req)->opt);
@@ -1331,7 +1326,7 @@ struct proto dccp_prot = {
1331 .recvmsg = dccp_recvmsg, 1326 .recvmsg = dccp_recvmsg,
1332 .backlog_rcv = dccp_v4_do_rcv, 1327 .backlog_rcv = dccp_v4_do_rcv,
1333 .hash = dccp_v4_hash, 1328 .hash = dccp_v4_hash,
1334 .unhash = dccp_v4_unhash, 1329 .unhash = dccp_unhash,
1335 .accept = inet_csk_accept, 1330 .accept = inet_csk_accept,
1336 .get_port = dccp_v4_get_port, 1331 .get_port = dccp_v4_get_port,
1337 .shutdown = dccp_shutdown, 1332 .shutdown = dccp_shutdown,
diff --git a/net/dccp/minisocks.c b/net/dccp/minisocks.c
index c7ff80cf53a0..5c767b5e9a52 100644
--- a/net/dccp/minisocks.c
+++ b/net/dccp/minisocks.c
@@ -40,6 +40,8 @@ struct inet_timewait_death_row dccp_death_row = {
40 (unsigned long)&dccp_death_row), 40 (unsigned long)&dccp_death_row),
41}; 41};
42 42
43EXPORT_SYMBOL_GPL(dccp_death_row);
44
43void dccp_time_wait(struct sock *sk, int state, int timeo) 45void dccp_time_wait(struct sock *sk, int state, int timeo)
44{ 46{
45 struct inet_timewait_sock *tw = NULL; 47 struct inet_timewait_sock *tw = NULL;
@@ -170,6 +172,8 @@ out_free:
170 return newsk; 172 return newsk;
171} 173}
172 174
175EXPORT_SYMBOL_GPL(dccp_create_openreq_child);
176
173/* 177/*
174 * Process an incoming packet for RESPOND sockets represented 178 * Process an incoming packet for RESPOND sockets represented
175 * as an request_sock. 179 * as an request_sock.
@@ -236,6 +240,8 @@ drop:
236 goto out; 240 goto out;
237} 241}
238 242
243EXPORT_SYMBOL_GPL(dccp_check_req);
244
239/* 245/*
240 * Queue segment on the new socket if the new socket is active, 246 * Queue segment on the new socket if the new socket is active,
241 * otherwise we just shortcircuit this and continue with 247 * otherwise we just shortcircuit this and continue with
@@ -266,3 +272,5 @@ int dccp_child_process(struct sock *parent, struct sock *child,
266 sock_put(child); 272 sock_put(child);
267 return ret; 273 return ret;
268} 274}
275
276EXPORT_SYMBOL_GPL(dccp_child_process);
diff --git a/net/dccp/output.c b/net/dccp/output.c
index f35880503bb8..c40f7f8a328b 100644
--- a/net/dccp/output.c
+++ b/net/dccp/output.c
@@ -135,12 +135,6 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
135unsigned int dccp_sync_mss(struct sock *sk, u32 pmtu) 135unsigned int dccp_sync_mss(struct sock *sk, u32 pmtu)
136{ 136{
137 struct dccp_sock *dp = dccp_sk(sk); 137 struct dccp_sock *dp = dccp_sk(sk);
138 /*
139 * FIXME: we really should be using the af_specific thing to support
140 * IPv6.
141 * mss_now = pmtu - tp->af_specific->net_header_len -
142 * sizeof(struct dccp_hdr) - sizeof(struct dccp_hdr_ext);
143 */
144 int mss_now = (pmtu - inet_csk(sk)->icsk_af_ops->net_header_len - 138 int mss_now = (pmtu - inet_csk(sk)->icsk_af_ops->net_header_len -
145 sizeof(struct dccp_hdr) - sizeof(struct dccp_hdr_ext)); 139 sizeof(struct dccp_hdr) - sizeof(struct dccp_hdr_ext));
146 140
@@ -164,6 +158,8 @@ unsigned int dccp_sync_mss(struct sock *sk, u32 pmtu)
164 return mss_now; 158 return mss_now;
165} 159}
166 160
161EXPORT_SYMBOL_GPL(dccp_sync_mss);
162
167void dccp_write_space(struct sock *sk) 163void dccp_write_space(struct sock *sk)
168{ 164{
169 read_lock(&sk->sk_callback_lock); 165 read_lock(&sk->sk_callback_lock);
@@ -319,6 +315,8 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst,
319 return skb; 315 return skb;
320} 316}
321 317
318EXPORT_SYMBOL_GPL(dccp_make_response);
319
322struct sk_buff *dccp_make_reset(struct sock *sk, struct dst_entry *dst, 320struct sk_buff *dccp_make_reset(struct sock *sk, struct dst_entry *dst,
323 const enum dccp_reset_codes code) 321 const enum dccp_reset_codes code)
324 322
@@ -375,6 +373,7 @@ struct sk_buff *dccp_make_reset(struct sock *sk, struct dst_entry *dst,
375 */ 373 */
376static inline void dccp_connect_init(struct sock *sk) 374static inline void dccp_connect_init(struct sock *sk)
377{ 375{
376 struct dccp_sock *dp = dccp_sk(sk);
378 struct dst_entry *dst = __sk_dst_get(sk); 377 struct dst_entry *dst = __sk_dst_get(sk);
379 struct inet_connection_sock *icsk = inet_csk(sk); 378 struct inet_connection_sock *icsk = inet_csk(sk);
380 379
@@ -383,10 +382,16 @@ static inline void dccp_connect_init(struct sock *sk)
383 382
384 dccp_sync_mss(sk, dst_mtu(dst)); 383 dccp_sync_mss(sk, dst_mtu(dst));
385 384
386 /* 385 dccp_update_gss(sk, dp->dccps_iss);
387 * FIXME: set dp->{dccps_swh,dccps_swl}, with 386 /*
388 * something like dccp_inc_seq 387 * SWL and AWL are initially adjusted so that they are not less than
389 */ 388 * the initial Sequence Numbers received and sent, respectively:
389 * SWL := max(GSR + 1 - floor(W/4), ISR),
390 * AWL := max(GSS - W' + 1, ISS).
391 * These adjustments MUST be applied only at the beginning of the
392 * connection.
393 */
394 dccp_set_seqno(&dp->dccps_awl, max48(dp->dccps_awl, dp->dccps_iss));
390 395
391 icsk->icsk_retransmits = 0; 396 icsk->icsk_retransmits = 0;
392} 397}
@@ -418,6 +423,8 @@ int dccp_connect(struct sock *sk)
418 return 0; 423 return 0;
419} 424}
420 425
426EXPORT_SYMBOL_GPL(dccp_connect);
427
421void dccp_send_ack(struct sock *sk) 428void dccp_send_ack(struct sock *sk)
422{ 429{
423 /* If we have been reset, we may not send again. */ 430 /* If we have been reset, we may not send again. */
diff --git a/net/dccp/proto.c b/net/dccp/proto.c
index 9cb2989f93b2..51dfacd22a6e 100644
--- a/net/dccp/proto.c
+++ b/net/dccp/proto.c
@@ -41,8 +41,12 @@
41 41
42DEFINE_SNMP_STAT(struct dccp_mib, dccp_statistics) __read_mostly; 42DEFINE_SNMP_STAT(struct dccp_mib, dccp_statistics) __read_mostly;
43 43
44EXPORT_SYMBOL_GPL(dccp_statistics);
45
44atomic_t dccp_orphan_count = ATOMIC_INIT(0); 46atomic_t dccp_orphan_count = ATOMIC_INIT(0);
45 47
48EXPORT_SYMBOL_GPL(dccp_orphan_count);
49
46static struct net_protocol dccp_protocol = { 50static struct net_protocol dccp_protocol = {
47 .handler = dccp_v4_rcv, 51 .handler = dccp_v4_rcv,
48 .err_handler = dccp_v4_err, 52 .err_handler = dccp_v4_err,
@@ -149,6 +153,8 @@ int dccp_disconnect(struct sock *sk, int flags)
149 return err; 153 return err;
150} 154}
151 155
156EXPORT_SYMBOL_GPL(dccp_disconnect);
157
152/* 158/*
153 * Wait for a DCCP event. 159 * Wait for a DCCP event.
154 * 160 *
@@ -156,8 +162,8 @@ int dccp_disconnect(struct sock *sk, int flags)
156 * take care of normal races (between the test and the event) and we don't 162 * take care of normal races (between the test and the event) and we don't
157 * go look at any of the socket buffers directly. 163 * go look at any of the socket buffers directly.
158 */ 164 */
159static unsigned int dccp_poll(struct file *file, struct socket *sock, 165unsigned int dccp_poll(struct file *file, struct socket *sock,
160 poll_table *wait) 166 poll_table *wait)
161{ 167{
162 unsigned int mask; 168 unsigned int mask;
163 struct sock *sk = sock->sk; 169 struct sock *sk = sock->sk;
@@ -205,12 +211,16 @@ static unsigned int dccp_poll(struct file *file, struct socket *sock,
205 return mask; 211 return mask;
206} 212}
207 213
214EXPORT_SYMBOL_GPL(dccp_poll);
215
208int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg) 216int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg)
209{ 217{
210 dccp_pr_debug("entry\n"); 218 dccp_pr_debug("entry\n");
211 return -ENOIOCTLCMD; 219 return -ENOIOCTLCMD;
212} 220}
213 221
222EXPORT_SYMBOL_GPL(dccp_ioctl);
223
214static int dccp_setsockopt_service(struct sock *sk, const u32 service, 224static int dccp_setsockopt_service(struct sock *sk, const u32 service,
215 char __user *optval, int optlen) 225 char __user *optval, int optlen)
216{ 226{
@@ -284,6 +294,8 @@ int dccp_setsockopt(struct sock *sk, int level, int optname,
284 return err; 294 return err;
285} 295}
286 296
297EXPORT_SYMBOL_GPL(dccp_setsockopt);
298
287static int dccp_getsockopt_service(struct sock *sk, int len, 299static int dccp_getsockopt_service(struct sock *sk, int len,
288 u32 __user *optval, 300 u32 __user *optval,
289 int __user *optlen) 301 int __user *optlen)
@@ -357,6 +369,8 @@ int dccp_getsockopt(struct sock *sk, int level, int optname,
357 return 0; 369 return 0;
358} 370}
359 371
372EXPORT_SYMBOL_GPL(dccp_getsockopt);
373
360int dccp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, 374int dccp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
361 size_t len) 375 size_t len)
362{ 376{
@@ -413,6 +427,8 @@ out_discard:
413 goto out_release; 427 goto out_release;
414} 428}
415 429
430EXPORT_SYMBOL_GPL(dccp_sendmsg);
431
416int dccp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, 432int dccp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
417 size_t len, int nonblock, int flags, int *addr_len) 433 size_t len, int nonblock, int flags, int *addr_len)
418{ 434{
@@ -510,7 +526,9 @@ out:
510 return len; 526 return len;
511} 527}
512 528
513static int inet_dccp_listen(struct socket *sock, int backlog) 529EXPORT_SYMBOL_GPL(dccp_recvmsg);
530
531int inet_dccp_listen(struct socket *sock, int backlog)
514{ 532{
515 struct sock *sk = sock->sk; 533 struct sock *sk = sock->sk;
516 unsigned char old_state; 534 unsigned char old_state;
@@ -546,6 +564,8 @@ out:
546 return err; 564 return err;
547} 565}
548 566
567EXPORT_SYMBOL_GPL(inet_dccp_listen);
568
549static const unsigned char dccp_new_state[] = { 569static const unsigned char dccp_new_state[] = {
550 /* current state: new state: action: */ 570 /* current state: new state: action: */
551 [0] = DCCP_CLOSED, 571 [0] = DCCP_CLOSED,
@@ -651,11 +671,15 @@ adjudge_to_death:
651 sock_put(sk); 671 sock_put(sk);
652} 672}
653 673
674EXPORT_SYMBOL_GPL(dccp_close);
675
654void dccp_shutdown(struct sock *sk, int how) 676void dccp_shutdown(struct sock *sk, int how)
655{ 677{
656 dccp_pr_debug("entry\n"); 678 dccp_pr_debug("entry\n");
657} 679}
658 680
681EXPORT_SYMBOL_GPL(dccp_shutdown);
682
659static struct proto_ops inet_dccp_ops = { 683static struct proto_ops inet_dccp_ops = {
660 .family = PF_INET, 684 .family = PF_INET,
661 .owner = THIS_MODULE, 685 .owner = THIS_MODULE,
@@ -763,6 +787,8 @@ MODULE_PARM_DESC(thash_entries, "Number of ehash buckets");
763int dccp_debug; 787int dccp_debug;
764module_param(dccp_debug, int, 0444); 788module_param(dccp_debug, int, 0444);
765MODULE_PARM_DESC(dccp_debug, "Enable debug messages"); 789MODULE_PARM_DESC(dccp_debug, "Enable debug messages");
790
791EXPORT_SYMBOL_GPL(dccp_debug);
766#endif 792#endif
767 793
768static int __init dccp_init(void) 794static int __init dccp_init(void)