Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}