]> err.no Git - linux-2.6/blobdiff - net/dccp/output.c
[DCCP]: ipv6.c needs net/ip6_checksum.c
[linux-2.6] / net / dccp / output.c
index f35880503bb8910ec6509349de57f8581ad80cd4..efd7ffb903a149a46d38d57e691b20bfba416c67 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/kernel.h>
 #include <linux/skbuff.h>
 
+#include <net/inet_sock.h>
 #include <net/sock.h>
 
 #include "ackvec.h"
@@ -134,18 +135,13 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
 
 unsigned int dccp_sync_mss(struct sock *sk, u32 pmtu)
 {
+       struct inet_connection_sock *icsk = inet_csk(sk);
        struct dccp_sock *dp = dccp_sk(sk);
-       /*
-        * FIXME: we really should be using the af_specific thing to support
-        *        IPv6.
-        * mss_now = pmtu - tp->af_specific->net_header_len -
-        *           sizeof(struct dccp_hdr) - sizeof(struct dccp_hdr_ext);
-        */
-       int mss_now = (pmtu - inet_csk(sk)->icsk_af_ops->net_header_len -
+       int mss_now = (pmtu - icsk->icsk_af_ops->net_header_len -
                       sizeof(struct dccp_hdr) - sizeof(struct dccp_hdr_ext));
 
        /* Now subtract optional transport overhead */
-       mss_now -= dp->dccps_ext_header_len;
+       mss_now -= icsk->icsk_ext_hdr_len;
 
        /*
         * FIXME: this should come from the CCID infrastructure, where, say,
@@ -158,12 +154,14 @@ unsigned int dccp_sync_mss(struct sock *sk, u32 pmtu)
        mss_now -= ((5 + 6 + 10 + 6 + 6 + 6 + 3) / 4) * 4;
 
        /* And store cached results */
-       dp->dccps_pmtu_cookie = pmtu;
+       icsk->icsk_pmtu_cookie = pmtu;
        dp->dccps_mss_cache = mss_now;
 
        return mss_now;
 }
 
+EXPORT_SYMBOL_GPL(dccp_sync_mss);
+
 void dccp_write_space(struct sock *sk)
 {
        read_lock(&sk->sk_callback_lock);
@@ -319,6 +317,8 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst,
        return skb;
 }
 
+EXPORT_SYMBOL_GPL(dccp_make_response);
+
 struct sk_buff *dccp_make_reset(struct sock *sk, struct dst_entry *dst,
                                const enum dccp_reset_codes code)
                                   
@@ -375,6 +375,7 @@ struct sk_buff *dccp_make_reset(struct sock *sk, struct dst_entry *dst,
  */
 static inline void dccp_connect_init(struct sock *sk)
 {
+       struct dccp_sock *dp = dccp_sk(sk);
        struct dst_entry *dst = __sk_dst_get(sk);
        struct inet_connection_sock *icsk = inet_csk(sk);
 
@@ -383,10 +384,16 @@ static inline void dccp_connect_init(struct sock *sk)
        
        dccp_sync_mss(sk, dst_mtu(dst));
 
-       /*
-        * FIXME: set dp->{dccps_swh,dccps_swl}, with
-        * something like dccp_inc_seq
-        */
+       dccp_update_gss(sk, dp->dccps_iss);
+       /*
+        * SWL and AWL are initially adjusted so that they are not less than
+        * the initial Sequence Numbers received and sent, respectively:
+        *      SWL := max(GSR + 1 - floor(W/4), ISR),
+        *      AWL := max(GSS - W' + 1, ISS).
+        * These adjustments MUST be applied only at the beginning of the
+        * connection.
+        */
+       dccp_set_seqno(&dp->dccps_awl, max48(dp->dccps_awl, dp->dccps_iss));
 
        icsk->icsk_retransmits = 0;
 }
@@ -418,6 +425,8 @@ int dccp_connect(struct sock *sk)
        return 0;
 }
 
+EXPORT_SYMBOL_GPL(dccp_connect);
+
 void dccp_send_ack(struct sock *sk)
 {
        /* If we have been reset, we may not send again. */