diff options
Diffstat (limited to 'net/dccp/input.c')
| -rw-r--r-- | net/dccp/input.c | 79 |
1 files changed, 51 insertions, 28 deletions
diff --git a/net/dccp/input.c b/net/dccp/input.c index 3454d5941900..b6cba72b44e8 100644 --- a/net/dccp/input.c +++ b/net/dccp/input.c | |||
| @@ -151,29 +151,12 @@ static int dccp_check_seqno(struct sock *sk, struct sk_buff *skb) | |||
| 151 | return 0; | 151 | return 0; |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | int dccp_rcv_established(struct sock *sk, struct sk_buff *skb, | 154 | static inline int __dccp_rcv_established(struct sock *sk, struct sk_buff *skb, |
| 155 | const struct dccp_hdr *dh, const unsigned len) | 155 | const struct dccp_hdr *dh, |
| 156 | const unsigned len) | ||
| 156 | { | 157 | { |
| 157 | struct dccp_sock *dp = dccp_sk(sk); | 158 | struct dccp_sock *dp = dccp_sk(sk); |
| 158 | 159 | ||
| 159 | if (dccp_check_seqno(sk, skb)) | ||
| 160 | goto discard; | ||
| 161 | |||
| 162 | if (dccp_parse_options(sk, skb)) | ||
| 163 | goto discard; | ||
| 164 | |||
| 165 | if (DCCP_SKB_CB(skb)->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ) | ||
| 166 | dccp_event_ack_recv(sk, skb); | ||
| 167 | |||
| 168 | if (dp->dccps_options.dccpo_send_ack_vector && | ||
| 169 | dccp_ackvec_add(dp->dccps_hc_rx_ackvec, sk, | ||
| 170 | DCCP_SKB_CB(skb)->dccpd_seq, | ||
| 171 | DCCP_ACKVEC_STATE_RECEIVED)) | ||
| 172 | goto discard; | ||
| 173 | |||
| 174 | ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb); | ||
| 175 | ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb); | ||
| 176 | |||
| 177 | switch (dccp_hdr(skb)->dccph_type) { | 160 | switch (dccp_hdr(skb)->dccph_type) { |
| 178 | case DCCP_PKT_DATAACK: | 161 | case DCCP_PKT_DATAACK: |
| 179 | case DCCP_PKT_DATA: | 162 | case DCCP_PKT_DATA: |
| @@ -250,6 +233,37 @@ discard: | |||
| 250 | return 0; | 233 | return 0; |
| 251 | } | 234 | } |
| 252 | 235 | ||
| 236 | int dccp_rcv_established(struct sock *sk, struct sk_buff *skb, | ||
| 237 | const struct dccp_hdr *dh, const unsigned len) | ||
| 238 | { | ||
| 239 | struct dccp_sock *dp = dccp_sk(sk); | ||
| 240 | |||
| 241 | if (dccp_check_seqno(sk, skb)) | ||
| 242 | goto discard; | ||
| 243 | |||
| 244 | if (dccp_parse_options(sk, skb)) | ||
| 245 | goto discard; | ||
| 246 | |||
| 247 | if (DCCP_SKB_CB(skb)->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ) | ||
| 248 | dccp_event_ack_recv(sk, skb); | ||
| 249 | |||
| 250 | if (dp->dccps_options.dccpo_send_ack_vector && | ||
| 251 | dccp_ackvec_add(dp->dccps_hc_rx_ackvec, sk, | ||
| 252 | DCCP_SKB_CB(skb)->dccpd_seq, | ||
| 253 | DCCP_ACKVEC_STATE_RECEIVED)) | ||
| 254 | goto discard; | ||
| 255 | |||
| 256 | ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb); | ||
| 257 | ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb); | ||
| 258 | |||
| 259 | return __dccp_rcv_established(sk, skb, dh, len); | ||
| 260 | discard: | ||
| 261 | __kfree_skb(skb); | ||
| 262 | return 0; | ||
| 263 | } | ||
| 264 | |||
| 265 | EXPORT_SYMBOL_GPL(dccp_rcv_established); | ||
| 266 | |||
| 253 | static int dccp_rcv_request_sent_state_process(struct sock *sk, | 267 | static int dccp_rcv_request_sent_state_process(struct sock *sk, |
| 254 | struct sk_buff *skb, | 268 | struct sk_buff *skb, |
| 255 | const struct dccp_hdr *dh, | 269 | const struct dccp_hdr *dh, |
| @@ -286,6 +300,12 @@ static int dccp_rcv_request_sent_state_process(struct sock *sk, | |||
| 286 | goto out_invalid_packet; | 300 | goto out_invalid_packet; |
| 287 | } | 301 | } |
| 288 | 302 | ||
| 303 | if (dp->dccps_options.dccpo_send_ack_vector && | ||
| 304 | dccp_ackvec_add(dp->dccps_hc_rx_ackvec, sk, | ||
| 305 | DCCP_SKB_CB(skb)->dccpd_seq, | ||
| 306 | DCCP_ACKVEC_STATE_RECEIVED)) | ||
| 307 | goto out_invalid_packet; /* FIXME: change error code */ | ||
| 308 | |||
| 289 | dp->dccps_isr = DCCP_SKB_CB(skb)->dccpd_seq; | 309 | dp->dccps_isr = DCCP_SKB_CB(skb)->dccpd_seq; |
| 290 | dccp_update_gsr(sk, dp->dccps_isr); | 310 | dccp_update_gsr(sk, dp->dccps_isr); |
| 291 | /* | 311 | /* |
| @@ -309,7 +329,7 @@ static int dccp_rcv_request_sent_state_process(struct sock *sk, | |||
| 309 | goto out_invalid_packet; | 329 | goto out_invalid_packet; |
| 310 | } | 330 | } |
| 311 | 331 | ||
| 312 | dccp_sync_mss(sk, dp->dccps_pmtu_cookie); | 332 | dccp_sync_mss(sk, icsk->icsk_pmtu_cookie); |
| 313 | 333 | ||
| 314 | /* | 334 | /* |
| 315 | * Step 10: Process REQUEST state (second part) | 335 | * Step 10: Process REQUEST state (second part) |
| @@ -329,7 +349,7 @@ static int dccp_rcv_request_sent_state_process(struct sock *sk, | |||
| 329 | dccp_set_state(sk, DCCP_PARTOPEN); | 349 | dccp_set_state(sk, DCCP_PARTOPEN); |
| 330 | 350 | ||
| 331 | /* Make sure socket is routed, for correct metrics. */ | 351 | /* Make sure socket is routed, for correct metrics. */ |
| 332 | inet_sk_rebuild_header(sk); | 352 | icsk->icsk_af_ops->rebuild_header(sk); |
| 333 | 353 | ||
| 334 | if (!sock_flag(sk, SOCK_DEAD)) { | 354 | if (!sock_flag(sk, SOCK_DEAD)) { |
| 335 | sk->sk_state_change(sk); | 355 | sk->sk_state_change(sk); |
| @@ -398,9 +418,9 @@ static int dccp_rcv_respond_partopen_state_process(struct sock *sk, | |||
| 398 | 418 | ||
| 399 | if (dh->dccph_type == DCCP_PKT_DATAACK || | 419 | if (dh->dccph_type == DCCP_PKT_DATAACK || |
| 400 | dh->dccph_type == DCCP_PKT_DATA) { | 420 | dh->dccph_type == DCCP_PKT_DATA) { |
| 401 | dccp_rcv_established(sk, skb, dh, len); | 421 | __dccp_rcv_established(sk, skb, dh, len); |
| 402 | queued = 1; /* packet was queued | 422 | queued = 1; /* packet was queued |
| 403 | (by dccp_rcv_established) */ | 423 | (by __dccp_rcv_established) */ |
| 404 | } | 424 | } |
| 405 | break; | 425 | break; |
| 406 | } | 426 | } |
| @@ -444,7 +464,8 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
| 444 | */ | 464 | */ |
| 445 | if (sk->sk_state == DCCP_LISTEN) { | 465 | if (sk->sk_state == DCCP_LISTEN) { |
| 446 | if (dh->dccph_type == DCCP_PKT_REQUEST) { | 466 | if (dh->dccph_type == DCCP_PKT_REQUEST) { |
| 447 | if (dccp_v4_conn_request(sk, skb) < 0) | 467 | if (inet_csk(sk)->icsk_af_ops->conn_request(sk, |
| 468 | skb) < 0) | ||
| 448 | return 1; | 469 | return 1; |
| 449 | 470 | ||
| 450 | /* FIXME: do congestion control initialization */ | 471 | /* FIXME: do congestion control initialization */ |
| @@ -471,14 +492,14 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
| 471 | if (dcb->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ) | 492 | if (dcb->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ) |
| 472 | dccp_event_ack_recv(sk, skb); | 493 | dccp_event_ack_recv(sk, skb); |
| 473 | 494 | ||
| 474 | ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb); | ||
| 475 | ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb); | ||
| 476 | |||
| 477 | if (dp->dccps_options.dccpo_send_ack_vector && | 495 | if (dp->dccps_options.dccpo_send_ack_vector && |
| 478 | dccp_ackvec_add(dp->dccps_hc_rx_ackvec, sk, | 496 | dccp_ackvec_add(dp->dccps_hc_rx_ackvec, sk, |
| 479 | DCCP_SKB_CB(skb)->dccpd_seq, | 497 | DCCP_SKB_CB(skb)->dccpd_seq, |
| 480 | DCCP_ACKVEC_STATE_RECEIVED)) | 498 | DCCP_ACKVEC_STATE_RECEIVED)) |
| 481 | goto discard; | 499 | goto discard; |
| 500 | |||
| 501 | ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb); | ||
| 502 | ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb); | ||
| 482 | } | 503 | } |
| 483 | 504 | ||
| 484 | /* | 505 | /* |
| @@ -566,3 +587,5 @@ discard: | |||
| 566 | } | 587 | } |
| 567 | return 0; | 588 | return 0; |
| 568 | } | 589 | } |
| 590 | |||
| 591 | EXPORT_SYMBOL_GPL(dccp_rcv_state_process); | ||
