src/dpdk/drivers/net/netvsc/hn_rxtx.c
static void hn_encap(struct rndis_packet_msg *pkt,
		     uint16_t queue_id,
		     const struct rte_mbuf *m)
{
	unsigned int hlen = m->l2_len + m->l3_len;
	uint32_t *pi_data;
	uint32_t pkt_hlen;

	pkt->type = RNDIS_PACKET_MSG;
	pkt->len = m->pkt_len;
	pkt->dataoffset = 0;
	pkt->datalen = m->pkt_len;
	pkt->oobdataoffset = 0;
	pkt->oobdatalen = 0;
	pkt->oobdataelements = 0;
	pkt->pktinfooffset = sizeof(*pkt);
	pkt->pktinfolen = 0;
	pkt->vchandle = 0;
	pkt->reserved = 0;

	/*
	 * Set the hash value for this packet, to the queue_id to cause
	 * TX done event for this packet on the right channel.
	 */
	pi_data = hn_rndis_pktinfo_append(pkt, NDIS_HASH_VALUE_SIZE,
					  NDIS_PKTINFO_TYPE_HASHVAL);
	*pi_data = queue_id;

	if (m->ol_flags & PKT_TX_VLAN_PKT) {
		pi_data = hn_rndis_pktinfo_append(pkt, NDIS_VLAN_INFO_SIZE,
						  NDIS_PKTINFO_TYPE_VLAN);
		*pi_data = m->vlan_tci;
	}

	if (m->ol_flags & PKT_TX_TCP_SEG) {
		pi_data = hn_rndis_pktinfo_append(pkt, NDIS_LSO2_INFO_SIZE,
						  NDIS_PKTINFO_TYPE_LSO);

		if (m->ol_flags & PKT_TX_IPV6) {
			*pi_data = NDIS_LSO2_INFO_MAKEIPV6(hlen,
							   m->tso_segsz);
		} else {
			*pi_data = NDIS_LSO2_INFO_MAKEIPV4(hlen,
							   m->tso_segsz);
		}
	} else if (m->ol_flags &
		   (PKT_TX_TCP_CKSUM | PKT_TX_UDP_CKSUM | PKT_TX_IP_CKSUM)) {
		pi_data = hn_rndis_pktinfo_append(pkt, NDIS_TXCSUM_INFO_SIZE,
						  NDIS_PKTINFO_TYPE_CSUM);
		*pi_data = 0;

		if (m->ol_flags & PKT_TX_IPV6)
			*pi_data |= NDIS_TXCSUM_INFO_IPV6;
		if (m->ol_flags & PKT_TX_IPV4) {
			*pi_data |= NDIS_TXCSUM_INFO_IPV4;

			if (m->ol_flags & PKT_TX_IP_CKSUM)
				*pi_data |= NDIS_TXCSUM_INFO_IPCS;
		}

		if (m->ol_flags & PKT_TX_TCP_CKSUM)
			*pi_data |= NDIS_TXCSUM_INFO_MKTCPCS(hlen);
		else if (m->ol_flags & PKT_TX_UDP_CKSUM)
			*pi_data |= NDIS_TXCSUM_INFO_MKUDPCS(hlen);
	}

	pkt_hlen = pkt->pktinfooffset + pkt->pktinfolen;
	/* Fixup RNDIS packet message total length */
	pkt->len += pkt_hlen;

	/* Convert RNDIS packet message offsets */
	pkt->dataoffset = hn_rndis_pktmsg_offset(pkt_hlen);
	pkt->pktinfooffset = hn_rndis_pktmsg_offset(pkt->pktinfooffset);
}
/* Put RNDIS header and packet info on packet */
Put RNDIS header and packet info on packet
Put RNDIS header and packet info on packet
static void hn_encap(struct rndis_packet_msg *pkt,
		     uint16_t queue_id,
		     const struct rte_mbuf *m)
{
	unsigned int hlen = m->l2_len + m->l3_len;
	uint32_t *pi_data;
	uint32_t pkt_hlen;
	pkt->type = RNDIS_PACKET_MSG;
	pkt->len = m->pkt_len;
	pkt->dataoffset = 0;
	pkt->datalen = m->pkt_len;
	pkt->oobdataoffset = 0;
	pkt->oobdatalen = 0;
	pkt->oobdataelements = 0;
	pkt->pktinfooffset = sizeof(*pkt);
	pkt->pktinfolen = 0;
	pkt->vchandle = 0;
	pkt->reserved = 0;
	pi_data = hn_rndis_pktinfo_append(pkt, NDIS_HASH_VALUE_SIZE,
					  NDIS_PKTINFO_TYPE_HASHVAL);
	*pi_data = queue_id;
	if (m->ol_flags & PKT_TX_VLAN_PKT) {
		pi_data = hn_rndis_pktinfo_append(pkt, NDIS_VLAN_INFO_SIZE,
						  NDIS_PKTINFO_TYPE_VLAN);
		*pi_data = m->vlan_tci;
	}
	if (m->ol_flags & PKT_TX_TCP_SEG) {
		pi_data = hn_rndis_pktinfo_append(pkt, NDIS_LSO2_INFO_SIZE,
						  NDIS_PKTINFO_TYPE_LSO);
		if (m->ol_flags & PKT_TX_IPV6) {
			*pi_data = NDIS_LSO2_INFO_MAKEIPV6(hlen,
							   m->tso_segsz);
		} else {
			*pi_data = NDIS_LSO2_INFO_MAKEIPV4(hlen,
							   m->tso_segsz);
		}
	} else if (m->ol_flags &
		   (PKT_TX_TCP_CKSUM | PKT_TX_UDP_CKSUM | PKT_TX_IP_CKSUM)) {
		pi_data = hn_rndis_pktinfo_append(pkt, NDIS_TXCSUM_INFO_SIZE,
						  NDIS_PKTINFO_TYPE_CSUM);
		*pi_data = 0;
		if (m->ol_flags & PKT_TX_IPV6)
			*pi_data |= NDIS_TXCSUM_INFO_IPV6;
		if (m->ol_flags & PKT_TX_IPV4) {
			*pi_data |= NDIS_TXCSUM_INFO_IPV4;
			if (m->ol_flags & PKT_TX_IP_CKSUM)
				*pi_data |= NDIS_TXCSUM_INFO_IPCS;
		}
		if (m->ol_flags & PKT_TX_TCP_CKSUM)
			*pi_data |= NDIS_TXCSUM_INFO_MKTCPCS(hlen);
		else if (m->ol_flags & PKT_TX_UDP_CKSUM)
			*pi_data |= NDIS_TXCSUM_INFO_MKUDPCS(hlen);
	}
	pkt_hlen = pkt->pktinfooffset + pkt->pktinfolen;
	pkt->len += pkt_hlen;
	pkt->dataoffset = hn_rndis_pktmsg_offset(pkt_hlen);
	pkt->pktinfooffset = hn_rndis_pktmsg_offset(pkt->pktinfooffset);
}
static void hn_encap ( struct rndis_packet_msg * pkt , uint16_t queue_id , const struct rte_mbuf * m ) { unsigned int hlen = m -> l2_len + m -> l3_len ; uint32_t * pi_data ; uint32_t pkt_hlen ; pkt -> type = RNDIS_PACKET_MSG ; pkt -> len = m -> pkt_len ; pkt -> dataoffset = 0 ; pkt -> datalen = m -> pkt_len ; pkt -> oobdataoffset = 0 ; pkt -> oobdatalen = 0 ; pkt -> oobdataelements = 0 ; pkt -> pktinfooffset = sizeof ( * pkt ) ; pkt -> pktinfolen = 0 ; pkt -> vchandle = 0 ; pkt -> reserved = 0 ; pi_data = hn_rndis_pktinfo_append ( pkt , NDIS_HASH_VALUE_SIZE , NDIS_PKTINFO_TYPE_HASHVAL ) ; * pi_data = queue_id ; if ( m -> ol_flags & PKT_TX_VLAN_PKT ) { pi_data = hn_rndis_pktinfo_append ( pkt , NDIS_VLAN_INFO_SIZE , NDIS_PKTINFO_TYPE_VLAN ) ; * pi_data = m -> vlan_tci ; } if ( m -> ol_flags & PKT_TX_TCP_SEG ) { pi_data = hn_rndis_pktinfo_append ( pkt , NDIS_LSO2_INFO_SIZE , NDIS_PKTINFO_TYPE_LSO ) ; if ( m -> ol_flags & PKT_TX_IPV6 ) { * pi_data = NDIS_LSO2_INFO_MAKEIPV6 ( hlen , m -> tso_segsz ) ; } else { * pi_data = NDIS_LSO2_INFO_MAKEIPV4 ( hlen , m -> tso_segsz ) ; } } else if ( m -> ol_flags & ( PKT_TX_TCP_CKSUM | PKT_TX_UDP_CKSUM | PKT_TX_IP_CKSUM ) ) { pi_data = hn_rndis_pktinfo_append ( pkt , NDIS_TXCSUM_INFO_SIZE , NDIS_PKTINFO_TYPE_CSUM ) ; * pi_data = 0 ; if ( m -> ol_flags & PKT_TX_IPV6 ) * pi_data |= NDIS_TXCSUM_INFO_IPV6 ; if ( m -> ol_flags & PKT_TX_IPV4 ) { * pi_data |= NDIS_TXCSUM_INFO_IPV4 ; if ( m -> ol_flags & PKT_TX_IP_CKSUM ) * pi_data |= NDIS_TXCSUM_INFO_IPCS ; } if ( m -> ol_flags & PKT_TX_TCP_CKSUM ) * pi_data |= NDIS_TXCSUM_INFO_MKTCPCS ( hlen ) ; else if ( m -> ol_flags & PKT_TX_UDP_CKSUM ) * pi_data |= NDIS_TXCSUM_INFO_MKUDPCS ( hlen ) ; } pkt_hlen = pkt -> pktinfooffset + pkt -> pktinfolen ; pkt -> len += pkt_hlen ; pkt -> dataoffset = hn_rndis_pktmsg_offset ( pkt_hlen ) ; pkt -> pktinfooffset = hn_rndis_pktmsg_offset ( pkt -> pktinfooffset ) ; }
Put RNDIS header and packet info on packet
Put RNDIS header and packet info on packet
/*
	 * Set the hash value for this packet, to the queue_id to cause
	 * TX done event for this packet on the right channel.
	 */ /* Fixup RNDIS packet message total length */ /* Convert RNDIS packet message offsets */