kni_sock_sndmsg(struct socket *sock, struct msghdr *m, size_t total_len) #endif /* HAVE_KIOCB_MSG_PARAM */ { struct kni_vhost_queue *q = container_of(sock->sk, struct kni_vhost_queue, sk); int vnet_hdr_len = 0; unsigned long len = total_len; if (unlikely(q == NULL || q->kni == NULL)) return 0; KNI_DBG_TX("kni_sndmsg len %ld, flags 0x%08x, nb_iov %d\n", #ifdef HAVE_IOV_ITER_MSGHDR len, q->flags, (int)m->msg_iter.iov->iov_len); #else len, q->flags, (int)m->msg_iovlen); #endif #ifdef RTE_KNI_VHOST_VNET_HDR_EN if (likely(q->flags & IFF_VNET_HDR)) { vnet_hdr_len = q->vnet_hdr_sz; if (unlikely(len < vnet_hdr_len)) return -EINVAL; len -= vnet_hdr_len; } #endif if (unlikely(len < ETH_HLEN + q->vnet_hdr_sz)) return -EINVAL; return kni_vhost_net_tx(q->kni, m, vnet_hdr_len, len); }
static int kni_sock_sndmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m, size_t total_len) { struct kni_vhost_queue *q = container_of(sock->sk, struct kni_vhost_queue, sk); int vnet_hdr_len = 0; unsigned long len = total_len; if (unlikely(q == NULL || q->kni == NULL)) return 0; KNI_DBG_TX("kni_sndmsg len %ld, flags 0x%08x, nb_iov %d\n", len, q->flags, (int)m->msg_iovlen); #ifdef RTE_KNI_VHOST_VNET_HDR_EN if (likely(q->flags & IFF_VNET_HDR)) { vnet_hdr_len = q->vnet_hdr_sz; if (unlikely(len < vnet_hdr_len)) return -EINVAL; len -= vnet_hdr_len; } #endif if (unlikely(len < ETH_HLEN + q->vnet_hdr_sz)) return -EINVAL; return kni_vhost_net_tx(q->kni, m->msg_iov, vnet_hdr_len, len); }