diff options
Diffstat (limited to 'net/dccp/output.c')
| -rw-r--r-- | net/dccp/output.c | 26 |
1 files changed, 9 insertions, 17 deletions
diff --git a/net/dccp/output.c b/net/dccp/output.c index ea6d0e91e511..4786bdcddcc9 100644 --- a/net/dccp/output.c +++ b/net/dccp/output.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | 16 | ||
| 17 | #include <net/sock.h> | 17 | #include <net/sock.h> |
| 18 | 18 | ||
| 19 | #include "ackvec.h" | ||
| 19 | #include "ccid.h" | 20 | #include "ccid.h" |
| 20 | #include "dccp.h" | 21 | #include "dccp.h" |
| 21 | 22 | ||
| @@ -85,7 +86,7 @@ int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb) | |||
| 85 | switch (dcb->dccpd_type) { | 86 | switch (dcb->dccpd_type) { |
| 86 | case DCCP_PKT_REQUEST: | 87 | case DCCP_PKT_REQUEST: |
| 87 | dccp_hdr_request(skb)->dccph_req_service = | 88 | dccp_hdr_request(skb)->dccph_req_service = |
| 88 | dcb->dccpd_service; | 89 | dp->dccps_service; |
| 89 | break; | 90 | break; |
| 90 | case DCCP_PKT_RESET: | 91 | case DCCP_PKT_RESET: |
| 91 | dccp_hdr_reset(skb)->dccph_reset_code = | 92 | dccp_hdr_reset(skb)->dccph_reset_code = |
| @@ -225,7 +226,6 @@ int dccp_write_xmit(struct sock *sk, struct sk_buff *skb, long *timeo) | |||
| 225 | err = dccp_wait_for_ccid(sk, skb, timeo); | 226 | err = dccp_wait_for_ccid(sk, skb, timeo); |
| 226 | 227 | ||
| 227 | if (err == 0) { | 228 | if (err == 0) { |
| 228 | const struct dccp_ackpkts *ap = dp->dccps_hc_rx_ackpkts; | ||
| 229 | struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb); | 229 | struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb); |
| 230 | const int len = skb->len; | 230 | const int len = skb->len; |
| 231 | 231 | ||
| @@ -236,15 +236,7 @@ int dccp_write_xmit(struct sock *sk, struct sk_buff *skb, long *timeo) | |||
| 236 | inet_csk(sk)->icsk_rto, | 236 | inet_csk(sk)->icsk_rto, |
| 237 | DCCP_RTO_MAX); | 237 | DCCP_RTO_MAX); |
| 238 | dcb->dccpd_type = DCCP_PKT_DATAACK; | 238 | dcb->dccpd_type = DCCP_PKT_DATAACK; |
| 239 | /* | 239 | } else if (dccp_ack_pending(sk)) |
| 240 | * FIXME: we really should have a | ||
| 241 | * dccps_ack_pending or use icsk. | ||
| 242 | */ | ||
| 243 | } else if (inet_csk_ack_scheduled(sk) || | ||
| 244 | dp->dccps_timestamp_echo != 0 || | ||
| 245 | (dp->dccps_options.dccpo_send_ack_vector && | ||
| 246 | ap->dccpap_buf_ackno != DCCP_MAX_SEQNO + 1 && | ||
| 247 | ap->dccpap_ack_seqno == DCCP_MAX_SEQNO + 1)) | ||
| 248 | dcb->dccpd_type = DCCP_PKT_DATAACK; | 240 | dcb->dccpd_type = DCCP_PKT_DATAACK; |
| 249 | else | 241 | else |
| 250 | dcb->dccpd_type = DCCP_PKT_DATA; | 242 | dcb->dccpd_type = DCCP_PKT_DATA; |
| @@ -270,6 +262,7 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst, | |||
| 270 | struct request_sock *req) | 262 | struct request_sock *req) |
| 271 | { | 263 | { |
| 272 | struct dccp_hdr *dh; | 264 | struct dccp_hdr *dh; |
| 265 | struct dccp_request_sock *dreq; | ||
| 273 | const int dccp_header_size = sizeof(struct dccp_hdr) + | 266 | const int dccp_header_size = sizeof(struct dccp_hdr) + |
| 274 | sizeof(struct dccp_hdr_ext) + | 267 | sizeof(struct dccp_hdr_ext) + |
| 275 | sizeof(struct dccp_hdr_response); | 268 | sizeof(struct dccp_hdr_response); |
| @@ -285,8 +278,9 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst, | |||
| 285 | skb->dst = dst_clone(dst); | 278 | skb->dst = dst_clone(dst); |
| 286 | skb->csum = 0; | 279 | skb->csum = 0; |
| 287 | 280 | ||
| 281 | dreq = dccp_rsk(req); | ||
| 288 | DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_RESPONSE; | 282 | DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_RESPONSE; |
| 289 | DCCP_SKB_CB(skb)->dccpd_seq = dccp_rsk(req)->dreq_iss; | 283 | DCCP_SKB_CB(skb)->dccpd_seq = dreq->dreq_iss; |
| 290 | dccp_insert_options(sk, skb); | 284 | dccp_insert_options(sk, skb); |
| 291 | 285 | ||
| 292 | skb->h.raw = skb_push(skb, dccp_header_size); | 286 | skb->h.raw = skb_push(skb, dccp_header_size); |
| @@ -300,8 +294,9 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst, | |||
| 300 | DCCP_SKB_CB(skb)->dccpd_opt_len) / 4; | 294 | DCCP_SKB_CB(skb)->dccpd_opt_len) / 4; |
| 301 | dh->dccph_type = DCCP_PKT_RESPONSE; | 295 | dh->dccph_type = DCCP_PKT_RESPONSE; |
| 302 | dh->dccph_x = 1; | 296 | dh->dccph_x = 1; |
| 303 | dccp_hdr_set_seq(dh, dccp_rsk(req)->dreq_iss); | 297 | dccp_hdr_set_seq(dh, dreq->dreq_iss); |
| 304 | dccp_hdr_set_ack(dccp_hdr_ack_bits(skb), dccp_rsk(req)->dreq_isr); | 298 | dccp_hdr_set_ack(dccp_hdr_ack_bits(skb), dreq->dreq_isr); |
| 299 | dccp_hdr_response(skb)->dccph_resp_service = dreq->dreq_service; | ||
| 305 | 300 | ||
| 306 | dh->dccph_checksum = dccp_v4_checksum(skb, inet_rsk(req)->loc_addr, | 301 | dh->dccph_checksum = dccp_v4_checksum(skb, inet_rsk(req)->loc_addr, |
| 307 | inet_rsk(req)->rmt_addr); | 302 | inet_rsk(req)->rmt_addr); |
| @@ -397,9 +392,6 @@ int dccp_connect(struct sock *sk) | |||
| 397 | skb_reserve(skb, MAX_DCCP_HEADER); | 392 | skb_reserve(skb, MAX_DCCP_HEADER); |
| 398 | 393 | ||
| 399 | DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_REQUEST; | 394 | DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_REQUEST; |
| 400 | /* FIXME: set service to something meaningful, coming | ||
| 401 | * from userspace*/ | ||
| 402 | DCCP_SKB_CB(skb)->dccpd_service = 0; | ||
| 403 | skb->csum = 0; | 395 | skb->csum = 0; |
| 404 | skb_set_owner_w(skb, sk); | 396 | skb_set_owner_w(skb, sk); |
| 405 | 397 | ||
