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");
                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);