net/mlx5: Change the acl enable prototype to return status
[cascardo/linux.git] / net / ipv4 / ip_sockglue.c
index 71a52f4..b8a2d63 100644 (file)
@@ -98,7 +98,7 @@ static void ip_cmsg_recv_retopts(struct msghdr *msg, struct sk_buff *skb)
 }
 
 static void ip_cmsg_recv_checksum(struct msghdr *msg, struct sk_buff *skb,
-                                 int offset)
+                                 int tlen, int offset)
 {
        __wsum csum = skb->csum;
 
@@ -106,8 +106,9 @@ static void ip_cmsg_recv_checksum(struct msghdr *msg, struct sk_buff *skb,
                return;
 
        if (offset != 0)
-               csum = csum_sub(csum, csum_partial(skb_transport_header(skb),
-                                                  offset, 0));
+               csum = csum_sub(csum,
+                               csum_partial(skb_transport_header(skb) + tlen,
+                                            offset, 0));
 
        put_cmsg(msg, SOL_IP, IP_CHECKSUM, sizeof(__wsum), &csum);
 }
@@ -153,7 +154,7 @@ static void ip_cmsg_recv_dstaddr(struct msghdr *msg, struct sk_buff *skb)
 }
 
 void ip_cmsg_recv_offset(struct msghdr *msg, struct sk_buff *skb,
-                        int offset)
+                        int tlen, int offset)
 {
        struct inet_sock *inet = inet_sk(skb->sk);
        unsigned int flags = inet->cmsg_flags;
@@ -216,7 +217,7 @@ void ip_cmsg_recv_offset(struct msghdr *msg, struct sk_buff *skb,
        }
 
        if (flags & IP_CMSG_CHECKSUM)
-               ip_cmsg_recv_checksum(msg, skb, offset);
+               ip_cmsg_recv_checksum(msg, skb, tlen, offset);
 }
 EXPORT_SYMBOL(ip_cmsg_recv_offset);
 
@@ -284,9 +285,12 @@ int ip_cmsg_send(struct sock *sk, struct msghdr *msg, struct ipcm_cookie *ipc,
                        ipc->ttl = val;
                        break;
                case IP_TOS:
-                       if (cmsg->cmsg_len != CMSG_LEN(sizeof(int)))
+                       if (cmsg->cmsg_len == CMSG_LEN(sizeof(int)))
+                               val = *(int *)CMSG_DATA(cmsg);
+                       else if (cmsg->cmsg_len == CMSG_LEN(sizeof(u8)))
+                               val = *(u8 *)CMSG_DATA(cmsg);
+                       else
                                return -EINVAL;
-                       val = *(int *)CMSG_DATA(cmsg);
                        if (val < 0 || val > 255)
                                return -EINVAL;
                        ipc->tos = val;