[DCCP] Give precedence to the biggest ELAPSED_TIME
[deliverable/linux.git] / net / dccp / options.c
index 7ecffdf857560437b9302674d20cbd655a710cef..34b230a00875906176c26af4af1a3d094b9ed8a4 100644 (file)
@@ -72,6 +72,7 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
        struct dccp_options_received *opt_recv = &dp->dccps_options_received;
        unsigned char opt, len;
        unsigned char *value;
+       u32 elapsed_time;
 
        memset(opt_recv, 0, sizeof(*opt_recv));
 
@@ -159,18 +160,18 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
                                      (unsigned long long)
                                      DCCP_SKB_CB(skb)->dccpd_ack_seq);
 
-                       if (len > 4) {
-                               if (len == 6)
-                                       opt_recv->dccpor_elapsed_time =
-                                                ntohs(*(u16 *)(value + 4));
-                               else
-                                       opt_recv->dccpor_elapsed_time =
-                                                ntohl(*(u32 *)(value + 4));
 
-                               dccp_pr_debug("%sTIMESTAMP_ECHO ELAPSED_TIME=%d\n",
-                                     debug_prefix,
-                                     opt_recv->dccpor_elapsed_time);
-                       }
+                       if (len == 4)
+                               break;
+
+                       if (len == 6)
+                               elapsed_time = ntohs(*(u16 *)(value + 4));
+                       else
+                               elapsed_time = ntohl(*(u32 *)(value + 4));
+
+                       /* Give precedence to the biggest ELAPSED_TIME */
+                       if (elapsed_time > opt_recv->dccpor_elapsed_time)
+                               opt_recv->dccpor_elapsed_time = elapsed_time;
                        break;
                case DCCPO_ELAPSED_TIME:
                        if (len != 2 && len != 4)
@@ -180,14 +181,15 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
                                continue;
 
                        if (len == 2)
-                               opt_recv->dccpor_elapsed_time =
-                                                       ntohs(*(u16 *)value);
+                               elapsed_time = ntohs(*(u16 *)value);
                        else
-                               opt_recv->dccpor_elapsed_time =
-                                                       ntohl(*(u32 *)value);
+                               elapsed_time = ntohl(*(u32 *)value);
+
+                       if (elapsed_time > opt_recv->dccpor_elapsed_time)
+                               opt_recv->dccpor_elapsed_time = elapsed_time;
 
                        dccp_pr_debug("%sELAPSED_TIME=%d\n", debug_prefix,
-                                     opt_recv->dccpor_elapsed_time);
+                                     elapsed_time);
                        break;
                        /*
                         * From draft-ietf-dccp-spec-11.txt:
@@ -348,7 +350,7 @@ void dccp_insert_option_elapsed_time(struct sock *sk,
                      (unsigned long long) DCCP_SKB_CB(skb)->dccpd_seq);
 }
 
-EXPORT_SYMBOL(dccp_insert_option_elapsed_time);
+EXPORT_SYMBOL_GPL(dccp_insert_option_elapsed_time);
 
 static void dccp_insert_option_ack_vector(struct sock *sk, struct sk_buff *skb)
 {
@@ -359,7 +361,7 @@ static void dccp_insert_option_ack_vector(struct sock *sk, struct sk_buff *skb)
 #endif
        struct dccp_ackpkts *ap = dp->dccps_hc_rx_ackpkts;
        int len = ap->dccpap_buf_vector_len + 2;
-       const u32 elapsed_time = now_delta(ap->dccpap_time) / 10;
+       const u32 elapsed_time = timeval_now_delta(&ap->dccpap_time) / 10;
        unsigned char *to, *from;
 
        if (elapsed_time != 0)
@@ -426,8 +428,7 @@ static void dccp_insert_option_ack_vector(struct sock *sk, struct sk_buff *skb)
                      (unsigned long long) ap->dccpap_ack_ackno);
 }
 
-static inline void dccp_insert_option_timestamp(struct sock *sk,
-                                               struct sk_buff *skb)
+void dccp_insert_option_timestamp(struct sock *sk, struct sk_buff *skb)
 {
        struct timeval tv;
        u32 now;
@@ -441,6 +442,8 @@ static inline void dccp_insert_option_timestamp(struct sock *sk,
        dccp_insert_option(sk, skb, DCCPO_TIMESTAMP, &now, sizeof(now));
 }
 
+EXPORT_SYMBOL_GPL(dccp_insert_option_timestamp);
+
 static void dccp_insert_option_timestamp_echo(struct sock *sk,
                                              struct sk_buff *skb)
 {
@@ -450,7 +453,8 @@ static void dccp_insert_option_timestamp_echo(struct sock *sk,
                                        "CLIENT TX opt: " : "server TX opt: ";
 #endif
        u32 tstamp_echo;
-       const u32 elapsed_time = now_delta(dp->dccps_timestamp_time) / 10;
+       const u32 elapsed_time =
+                       timeval_now_delta(&dp->dccps_timestamp_time) / 10;
        const int elapsed_time_len = dccp_elapsed_time_len(elapsed_time);
        const int len = 6 + elapsed_time_len;
        unsigned char *to;
@@ -503,14 +507,18 @@ void dccp_insert_options(struct sock *sk, struct sk_buff *skb)
                    (dp->dccps_hc_rx_ackpkts->dccpap_buf_ackno !=
                     DCCP_MAX_SEQNO + 1))
                        dccp_insert_option_ack_vector(sk, skb);
-
-               dccp_insert_option_timestamp(sk, skb);
                if (dp->dccps_timestamp_echo != 0)
                        dccp_insert_option_timestamp_echo(sk, skb);
        }
 
-       ccid_hc_rx_insert_options(dp->dccps_hc_rx_ccid, sk, skb);
-       ccid_hc_tx_insert_options(dp->dccps_hc_tx_ccid, sk, skb);
+       if (dp->dccps_hc_rx_insert_options) {
+               ccid_hc_rx_insert_options(dp->dccps_hc_rx_ccid, sk, skb);
+               dp->dccps_hc_rx_insert_options = 0;
+       }
+       if (dp->dccps_hc_tx_insert_options) {
+               ccid_hc_tx_insert_options(dp->dccps_hc_tx_ccid, sk, skb);
+               dp->dccps_hc_tx_insert_options = 0;
+       }
 
        /* XXX: insert other options when appropriate */
 
This page took 0.062884 seconds and 5 git commands to generate.