{
        int err;
        struct dccp_hdr *rxdh = dccp_hdr(rxskb), *dh;
-       const int dccp_hdr_ack_len = sizeof(struct dccp_hdr) +
+       const u32 dccp_hdr_ack_len = sizeof(struct dccp_hdr) +
                                     sizeof(struct dccp_hdr_ext) +
                                     sizeof(struct dccp_hdr_ack_bits);
        struct sk_buff *skb;
        if (((struct rtable *)rxskb->dst)->rt_type != RTN_LOCAL)
                return;
 
-       skb = alloc_skb(MAX_DCCP_HEADER + 15, GFP_ATOMIC);
+       skb = alloc_skb(dccp_v4_ctl_socket->sk->sk_prot->max_header, GFP_ATOMIC);
        if (skb == NULL)
                return;
 
        /* Reserve space for headers. */
-       skb_reserve(skb, MAX_DCCP_HEADER);
+       skb_reserve(skb, dccp_v4_ctl_socket->sk->sk_prot->max_header);
 
        skb->dst = dst_clone(rxskb->dst);
 
        if (dst == NULL)
                return;
 
-       skb = alloc_skb(MAX_DCCP_HEADER + 15, GFP_ATOMIC);
+       skb = alloc_skb(dccp_v4_ctl_socket->sk->sk_prot->max_header,
+                       GFP_ATOMIC);
        if (skb == NULL)
                goto out;
 
        /* Reserve space for headers. */
-       skb_reserve(skb, MAX_DCCP_HEADER);
+       skb_reserve(skb, dccp_v4_ctl_socket->sk->sk_prot->max_header);
        skb->dst = dst_clone(dst);
 
        skb->h.raw = skb_push(skb, dccp_hdr_reset_len);
 
 static void dccp_v6_ctl_send_reset(struct sk_buff *rxskb)
 {
        struct dccp_hdr *rxdh = dccp_hdr(rxskb), *dh;
-       const int dccp_hdr_reset_len = sizeof(struct dccp_hdr) +
+       const u32 dccp_hdr_reset_len = sizeof(struct dccp_hdr) +
                                       sizeof(struct dccp_hdr_ext) +
                                       sizeof(struct dccp_hdr_reset);
        struct sk_buff *skb;
        if (!ipv6_unicast_destination(rxskb))
                return;
 
-       /*
-        * We need to grab some memory, and put together an RST,
-        * and then put it into the queue to be sent.
-        */
-
-       skb = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) +
-                       dccp_hdr_reset_len, GFP_ATOMIC);
+       skb = alloc_skb(dccp_v6_ctl_socket->sk->sk_prot->max_header,
+                       GFP_ATOMIC);
        if (skb == NULL)
                return;
 
-       skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr) +
-                   dccp_hdr_reset_len);
+       skb_reserve(skb, dccp_v6_ctl_socket->sk->sk_prot->max_header);
 
        skb->h.raw = skb_push(skb, dccp_hdr_reset_len);
        dh = dccp_hdr(skb);
 {
        struct flowi fl;
        struct dccp_hdr *rxdh = dccp_hdr(rxskb), *dh;
-       const int dccp_hdr_ack_len = sizeof(struct dccp_hdr) +
+       const u32 dccp_hdr_ack_len = sizeof(struct dccp_hdr) +
                                     sizeof(struct dccp_hdr_ext) +
                                     sizeof(struct dccp_hdr_ack_bits);
        struct sk_buff *skb;
 
-       skb = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) +
-                       dccp_hdr_ack_len, GFP_ATOMIC);
+       skb = alloc_skb(dccp_v6_ctl_socket->sk->sk_prot->max_header,
+                       GFP_ATOMIC);
        if (skb == NULL)
                return;
 
-       skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr) +
-                        dccp_hdr_ack_len);
+       skb_reserve(skb, dccp_v6_ctl_socket->sk->sk_prot->max_header);
 
        skb->h.raw = skb_push(skb, dccp_hdr_ack_len);
        dh = dccp_hdr(skb);
 
                struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb);
                struct dccp_hdr *dh;
                /* XXX For now we're using only 48 bits sequence numbers */
-               const int dccp_header_size = sizeof(*dh) +
+               const u32 dccp_header_size = sizeof(*dh) +
                                             sizeof(struct dccp_hdr_ext) +
                                          dccp_packet_hdr_len(dcb->dccpd_type);
                int err, set_ack = 1;
 {
        struct dccp_hdr *dh;
        struct dccp_request_sock *dreq;
-       const int dccp_header_size = sizeof(struct dccp_hdr) +
+       const u32 dccp_header_size = sizeof(struct dccp_hdr) +
                                     sizeof(struct dccp_hdr_ext) +
                                     sizeof(struct dccp_hdr_response);
-       struct sk_buff *skb = sock_wmalloc(sk, MAX_HEADER + DCCP_MAX_OPT_LEN +
-                                              dccp_header_size, 1,
+       struct sk_buff *skb = sock_wmalloc(sk, sk->sk_prot->max_header, 1,
                                           GFP_ATOMIC);
        if (skb == NULL)
                return NULL;
 
        /* Reserve space for headers. */
-       skb_reserve(skb, MAX_HEADER + DCCP_MAX_OPT_LEN + dccp_header_size);
+       skb_reserve(skb, sk->sk_prot->max_header);
 
        skb->dst = dst_clone(dst);
        skb->csum = 0;
 {
        struct dccp_hdr *dh;
        struct dccp_sock *dp = dccp_sk(sk);
-       const int dccp_header_size = sizeof(struct dccp_hdr) +
+       const u32 dccp_header_size = sizeof(struct dccp_hdr) +
                                     sizeof(struct dccp_hdr_ext) +
                                     sizeof(struct dccp_hdr_reset);
-       struct sk_buff *skb = sock_wmalloc(sk, MAX_HEADER + DCCP_MAX_OPT_LEN +
-                                              dccp_header_size, 1,
+       struct sk_buff *skb = sock_wmalloc(sk, sk->sk_prot->max_header, 1,
                                           GFP_ATOMIC);
        if (skb == NULL)
                return NULL;
 
        /* Reserve space for headers. */
-       skb_reserve(skb, MAX_HEADER + DCCP_MAX_OPT_LEN + dccp_header_size);
+       skb_reserve(skb, sk->sk_prot->max_header);
 
        skb->dst = dst_clone(dst);
        skb->csum = 0;
 
        dccp_connect_init(sk);
 
-       skb = alloc_skb(MAX_DCCP_HEADER + 15, sk->sk_allocation);
+       skb = alloc_skb(sk->sk_prot->max_header, sk->sk_allocation);
        if (unlikely(skb == NULL))
                return -ENOBUFS;
 
        /* Reserve space for headers. */
-       skb_reserve(skb, MAX_DCCP_HEADER);
+       skb_reserve(skb, sk->sk_prot->max_header);
 
        DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_REQUEST;
        skb->csum = 0;
 {
        /* If we have been reset, we may not send again. */
        if (sk->sk_state != DCCP_CLOSED) {
-               struct sk_buff *skb = alloc_skb(MAX_DCCP_HEADER, GFP_ATOMIC);
+               struct sk_buff *skb = alloc_skb(sk->sk_prot->max_header,
+                                               GFP_ATOMIC);
 
                if (skb == NULL) {
                        inet_csk_schedule_ack(sk);
                }
 
                /* Reserve space for headers */
-               skb_reserve(skb, MAX_DCCP_HEADER);
+               skb_reserve(skb, sk->sk_prot->max_header);
                skb->csum = 0;
                DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_ACK;
                dccp_transmit_skb(sk, skb);
         * dccp_transmit_skb() will set the ownership to this
         * sock.
         */
-       struct sk_buff *skb = alloc_skb(MAX_DCCP_HEADER, GFP_ATOMIC);
+       struct sk_buff *skb = alloc_skb(sk->sk_prot->max_header, GFP_ATOMIC);
 
        if (skb == NULL)
                /* FIXME: how to make sure the sync is sent? */
                return;
 
        /* Reserve space for headers and prepare control bits. */
-       skb_reserve(skb, MAX_DCCP_HEADER);
+       skb_reserve(skb, sk->sk_prot->max_header);
        skb->csum = 0;
        DCCP_SKB_CB(skb)->dccpd_type = pkt_type;
        DCCP_SKB_CB(skb)->dccpd_seq = seq;