]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/packet/af_packet.c
Merge branch 'stable-4.9' of git://git.infradead.org/users/pcmoore/audit
[karo-tx-linux.git] / net / packet / af_packet.c
index 9bff6ef16fa7632fcfc05f23dd696d75ead6d5e8..33a4697d55394c0a73b5f88e3b19ecd0d923a878 100644 (file)
@@ -1341,7 +1341,7 @@ static unsigned int fanout_demux_hash(struct packet_fanout *f,
                                      struct sk_buff *skb,
                                      unsigned int num)
 {
-       return reciprocal_scale(skb_get_hash(skb), num);
+       return reciprocal_scale(__skb_get_hash_symmetric(skb), num);
 }
 
 static unsigned int fanout_demux_lb(struct packet_fanout *f,
@@ -1588,13 +1588,9 @@ static int fanout_set_data_ebpf(struct packet_sock *po, char __user *data,
        if (copy_from_user(&fd, data, len))
                return -EFAULT;
 
-       new = bpf_prog_get(fd);
+       new = bpf_prog_get_type(fd, BPF_PROG_TYPE_SOCKET_FILTER);
        if (IS_ERR(new))
                return PTR_ERR(new);
-       if (new->type != BPF_PROG_TYPE_SOCKET_FILTER) {
-               bpf_prog_put(new);
-               return -EINVAL;
-       }
 
        __fanout_set_data_bpf(po->fanout, new);
        return 0;
@@ -1927,13 +1923,11 @@ retry:
                goto out_unlock;
        }
 
-       sockc.tsflags = 0;
+       sockc.tsflags = sk->sk_tsflags;
        if (msg->msg_controllen) {
                err = sock_cmsg_send(sk, msg, &sockc);
-               if (unlikely(err)) {
-                       err = -EINVAL;
+               if (unlikely(err))
                        goto out_unlock;
-               }
        }
 
        skb->protocol = proto;
@@ -1979,40 +1973,8 @@ static int __packet_rcv_vnet(const struct sk_buff *skb,
 {
        *vnet_hdr = (const struct virtio_net_hdr) { 0 };
 
-       if (skb_is_gso(skb)) {
-               struct skb_shared_info *sinfo = skb_shinfo(skb);
-
-               /* This is a hint as to how much should be linear. */
-               vnet_hdr->hdr_len =
-                       __cpu_to_virtio16(vio_le(), skb_headlen(skb));
-               vnet_hdr->gso_size =
-                       __cpu_to_virtio16(vio_le(), sinfo->gso_size);
-
-               if (sinfo->gso_type & SKB_GSO_TCPV4)
-                       vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4;
-               else if (sinfo->gso_type & SKB_GSO_TCPV6)
-                       vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV6;
-               else if (sinfo->gso_type & SKB_GSO_UDP)
-                       vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_UDP;
-               else if (sinfo->gso_type & SKB_GSO_FCOE)
-                       return -EINVAL;
-               else
-                       BUG();
-
-               if (sinfo->gso_type & SKB_GSO_TCP_ECN)
-                       vnet_hdr->gso_type |= VIRTIO_NET_HDR_GSO_ECN;
-       } else
-               vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_NONE;
-
-       if (skb->ip_summed == CHECKSUM_PARTIAL) {
-               vnet_hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM;
-               vnet_hdr->csum_start = __cpu_to_virtio16(vio_le(),
-                                 skb_checksum_start_offset(skb));
-               vnet_hdr->csum_offset = __cpu_to_virtio16(vio_le(),
-                                                skb->csum_offset);
-       } else if (skb->ip_summed == CHECKSUM_UNNECESSARY) {
-               vnet_hdr->flags = VIRTIO_NET_HDR_F_DATA_VALID;
-       } /* else everything is zero */
+       if (virtio_net_hdr_from_skb(skb, vnet_hdr, vio_le()))
+               BUG();
 
        return 0;
 }
@@ -2678,7 +2640,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
                dev = dev_get_by_index(sock_net(&po->sk), saddr->sll_ifindex);
        }
 
-       sockc.tsflags = 0;
+       sockc.tsflags = po->sk.sk_tsflags;
        if (msg->msg_controllen) {
                err = sock_cmsg_send(&po->sk, msg, &sockc);
                if (unlikely(err))
@@ -2881,7 +2843,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
        if (unlikely(!(dev->flags & IFF_UP)))
                goto out_unlock;
 
-       sockc.tsflags = 0;
+       sockc.tsflags = sk->sk_tsflags;
        sockc.mark = sk->sk_mark;
        if (msg->msg_controllen) {
                err = sock_cmsg_send(sk, msg, &sockc);