equal
deleted
inserted
replaced
10 */ |
10 */ |
11 |
11 |
12 #include "ackvec.h" |
12 #include "ackvec.h" |
13 #include "dccp.h" |
13 #include "dccp.h" |
14 |
14 |
15 #include <linux/dccp.h> |
|
16 #include <linux/init.h> |
15 #include <linux/init.h> |
17 #include <linux/errno.h> |
16 #include <linux/errno.h> |
18 #include <linux/kernel.h> |
17 #include <linux/kernel.h> |
19 #include <linux/skbuff.h> |
18 #include <linux/skbuff.h> |
20 #include <linux/slab.h> |
19 #include <linux/slab.h> |
66 int dccp_insert_option_ackvec(struct sock *sk, struct sk_buff *skb) |
65 int dccp_insert_option_ackvec(struct sock *sk, struct sk_buff *skb) |
67 { |
66 { |
68 struct dccp_sock *dp = dccp_sk(sk); |
67 struct dccp_sock *dp = dccp_sk(sk); |
69 struct dccp_ackvec *av = dp->dccps_hc_rx_ackvec; |
68 struct dccp_ackvec *av = dp->dccps_hc_rx_ackvec; |
70 /* Figure out how many options do we need to represent the ackvec */ |
69 /* Figure out how many options do we need to represent the ackvec */ |
71 const u16 nr_opts = DIV_ROUND_UP(av->av_vec_len, DCCP_MAX_ACKVEC_OPT_LEN); |
70 const u8 nr_opts = DIV_ROUND_UP(av->av_vec_len, DCCP_SINGLE_OPT_MAXLEN); |
72 u16 len = av->av_vec_len + 2 * nr_opts, i; |
71 u16 len = av->av_vec_len + 2 * nr_opts, i; |
73 u32 elapsed_time; |
72 u32 elapsed_time; |
74 const unsigned char *tail, *from; |
73 const unsigned char *tail, *from; |
75 unsigned char *to; |
74 unsigned char *to; |
76 struct dccp_ackvec_record *avr; |
75 struct dccp_ackvec_record *avr; |
98 tail = av->av_buf + DCCP_MAX_ACKVEC_LEN; |
97 tail = av->av_buf + DCCP_MAX_ACKVEC_LEN; |
99 |
98 |
100 for (i = 0; i < nr_opts; ++i) { |
99 for (i = 0; i < nr_opts; ++i) { |
101 int copylen = len; |
100 int copylen = len; |
102 |
101 |
103 if (len > DCCP_MAX_ACKVEC_OPT_LEN) |
102 if (len > DCCP_SINGLE_OPT_MAXLEN) |
104 copylen = DCCP_MAX_ACKVEC_OPT_LEN; |
103 copylen = DCCP_SINGLE_OPT_MAXLEN; |
105 |
104 |
106 *to++ = DCCPO_ACK_VECTOR_0; |
105 *to++ = DCCPO_ACK_VECTOR_0; |
107 *to++ = copylen + 2; |
106 *to++ = copylen + 2; |
108 |
107 |
109 /* Check if buf_head wraps */ |
108 /* Check if buf_head wraps */ |
430 } |
429 } |
431 |
430 |
432 int dccp_ackvec_parse(struct sock *sk, const struct sk_buff *skb, |
431 int dccp_ackvec_parse(struct sock *sk, const struct sk_buff *skb, |
433 u64 *ackno, const u8 opt, const u8 *value, const u8 len) |
432 u64 *ackno, const u8 opt, const u8 *value, const u8 len) |
434 { |
433 { |
435 if (len > DCCP_MAX_ACKVEC_OPT_LEN) |
434 if (len > DCCP_SINGLE_OPT_MAXLEN) |
436 return -1; |
435 return -1; |
437 |
436 |
438 /* dccp_ackvector_print(DCCP_SKB_CB(skb)->dccpd_ack_seq, value, len); */ |
437 /* dccp_ackvector_print(DCCP_SKB_CB(skb)->dccpd_ack_seq, value, len); */ |
439 dccp_ackvec_check_rcv_ackvector(dccp_sk(sk)->dccps_hc_rx_ackvec, sk, |
438 dccp_ackvec_check_rcv_ackvector(dccp_sk(sk)->dccps_hc_rx_ackvec, sk, |
440 ackno, len, value); |
439 ackno, len, value); |