|
@@ -200,10 +200,10 @@ struct sock *dccp_check_req(struct sock *sk, struct sk_buff *skb,
|
|
|
struct request_sock **prev)
|
|
|
{
|
|
|
struct sock *child = NULL;
|
|
|
+ struct dccp_request_sock *dreq = dccp_rsk(req);
|
|
|
|
|
|
/* Check for retransmitted REQUEST */
|
|
|
if (dccp_hdr(skb)->dccph_type == DCCP_PKT_REQUEST) {
|
|
|
- struct dccp_request_sock *dreq = dccp_rsk(req);
|
|
|
|
|
|
if (after48(DCCP_SKB_CB(skb)->dccpd_seq, dreq->dreq_isr)) {
|
|
|
dccp_pr_debug("Retransmitted REQUEST\n");
|
|
@@ -227,22 +227,22 @@ struct sock *dccp_check_req(struct sock *sk, struct sk_buff *skb,
|
|
|
goto drop;
|
|
|
|
|
|
/* Invalid ACK */
|
|
|
- if (DCCP_SKB_CB(skb)->dccpd_ack_seq != dccp_rsk(req)->dreq_iss) {
|
|
|
+ if (DCCP_SKB_CB(skb)->dccpd_ack_seq != dreq->dreq_iss) {
|
|
|
dccp_pr_debug("Invalid ACK number: ack_seq=%llu, "
|
|
|
"dreq_iss=%llu\n",
|
|
|
(unsigned long long)
|
|
|
DCCP_SKB_CB(skb)->dccpd_ack_seq,
|
|
|
- (unsigned long long)
|
|
|
- dccp_rsk(req)->dreq_iss);
|
|
|
+ (unsigned long long) dreq->dreq_iss);
|
|
|
goto drop;
|
|
|
}
|
|
|
|
|
|
+ if (dccp_parse_options(sk, dreq, skb))
|
|
|
+ goto drop;
|
|
|
+
|
|
|
child = inet_csk(sk)->icsk_af_ops->syn_recv_sock(sk, skb, req, NULL);
|
|
|
if (child == NULL)
|
|
|
goto listen_overflow;
|
|
|
|
|
|
- /* FIXME: deal with options */
|
|
|
-
|
|
|
inet_csk_reqsk_queue_unlink(sk, req, prev);
|
|
|
inet_csk_reqsk_queue_removed(sk, req);
|
|
|
inet_csk_reqsk_queue_add(sk, req, child);
|