xsk: prepare 'options' in xdp_desc for multi-buffer use
[linux-2.6-microblaze.git] / net / xdp / xsk.c
index 5a8c0dd..914a80c 100644 (file)
@@ -135,14 +135,14 @@ int xsk_reg_pool_at_qid(struct net_device *dev, struct xsk_buff_pool *pool,
        return 0;
 }
 
-static int __xsk_rcv_zc(struct xdp_sock *xs, struct xdp_buff *xdp, u32 len)
+static int __xsk_rcv_zc(struct xdp_sock *xs, struct xdp_buff *xdp, u32 len, u32 flags)
 {
        struct xdp_buff_xsk *xskb = container_of(xdp, struct xdp_buff_xsk, xdp);
        u64 addr;
        int err;
 
        addr = xp_get_handle(xskb);
-       err = xskq_prod_reserve_desc(xs->rx, addr, len);
+       err = xskq_prod_reserve_desc(xs->rx, addr, len, flags);
        if (err) {
                xs->rx_queue_full++;
                return err;
@@ -189,7 +189,7 @@ static int __xsk_rcv(struct xdp_sock *xs, struct xdp_buff *xdp)
        }
 
        xsk_copy_xdp(xsk_xdp, xdp, len);
-       err = __xsk_rcv_zc(xs, xsk_xdp, len);
+       err = __xsk_rcv_zc(xs, xsk_xdp, len, 0);
        if (err) {
                xsk_buff_free(xsk_xdp);
                return err;
@@ -259,7 +259,7 @@ static int xsk_rcv(struct xdp_sock *xs, struct xdp_buff *xdp)
 
        if (xdp->rxq->mem.type == MEM_TYPE_XSK_BUFF_POOL) {
                len = xdp->data_end - xdp->data;
-               return __xsk_rcv_zc(xs, xdp, len);
+               return __xsk_rcv_zc(xs, xdp, len, 0);
        }
 
        err = __xsk_rcv(xs, xdp);
@@ -886,6 +886,7 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
        struct sock *sk = sock->sk;
        struct xdp_sock *xs = xdp_sk(sk);
        struct net_device *dev;
+       int bound_dev_if;
        u32 flags, qid;
        int err = 0;
 
@@ -899,6 +900,10 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
                      XDP_USE_NEED_WAKEUP))
                return -EINVAL;
 
+       bound_dev_if = READ_ONCE(sk->sk_bound_dev_if);
+       if (bound_dev_if && bound_dev_if != sxdp->sxdp_ifindex)
+               return -EINVAL;
+
        rtnl_lock();
        mutex_lock(&xs->mutex);
        if (xs->state != XSK_READY) {