static void e1000e_build_rx_metadata ( E1000ECore * core , struct NetRxPkt * pkt , bool is_eop , const E1000E_RSSInfo * rss_info , uint32_t * rss , uint32_t * mrq , uint32_t * status_flags , uint16_t * ip_id , uint16_t * vlan_tag ) {
 struct virtio_net_hdr * vhdr ;
 bool isip4 , isip6 , istcp , isudp ;
 uint32_t pkt_type ;
 * status_flags = E1000_RXD_STAT_DD ;
 if ( ! is_eop ) {
 goto func_exit ;
 }
 * status_flags |= E1000_RXD_STAT_EOP ;
 net_rx_pkt_get_protocols ( pkt , & isip4 , & isip6 , & isudp , & istcp ) ;
 trace_e1000e_rx_metadata_protocols ( isip4 , isip6 , isudp , istcp ) ;
 if ( net_rx_pkt_is_vlan_stripped ( pkt ) ) {
 * status_flags |= E1000_RXD_STAT_VP ;
 * vlan_tag = cpu_to_le16 ( net_rx_pkt_get_vlan_tag ( pkt ) ) ;
 trace_e1000e_rx_metadata_vlan ( * vlan_tag ) ;
 }
 if ( ( core -> mac [ RXCSUM ] & E1000_RXCSUM_PCSD ) != 0 ) {
 if ( rss_info -> enabled ) {
 * rss = cpu_to_le32 ( rss_info -> hash ) ;
 * mrq = cpu_to_le32 ( rss_info -> type | ( rss_info -> queue << 8 ) ) ;
 trace_e1000e_rx_metadata_rss ( * rss , * mrq ) ;
 }
 }
 else if ( isip4 ) {
 * status_flags |= E1000_RXD_STAT_IPIDV ;
 * ip_id = cpu_to_le16 ( net_rx_pkt_get_ip_id ( pkt ) ) ;
 trace_e1000e_rx_metadata_ip_id ( * ip_id ) ;
 }
 if ( istcp && e1000e_is_tcp_ack ( core , pkt ) ) {
 * status_flags |= E1000_RXD_STAT_ACK ;
 trace_e1000e_rx_metadata_ack ( ) ;
 }
 if ( isip6 && ( core -> mac [ RFCTL ] & E1000_RFCTL_IPV6_DIS ) ) {
 trace_e1000e_rx_metadata_ipv6_filtering_disabled ( ) ;
 pkt_type = E1000_RXD_PKT_MAC ;
 }
 else if ( istcp || isudp ) {
 pkt_type = isip4 ? E1000_RXD_PKT_IP4_XDP : E1000_RXD_PKT_IP6_XDP ;
 }
 else if ( isip4 || isip6 ) {
 pkt_type = isip4 ? E1000_RXD_PKT_IP4 : E1000_RXD_PKT_IP6 ;
 }
 else {
 pkt_type = E1000_RXD_PKT_MAC ;
 }
 * status_flags |= E1000_RXD_PKT_TYPE ( pkt_type ) ;
 trace_e1000e_rx_metadata_pkt_type ( pkt_type ) ;
 if ( isip6 && ( core -> mac [ RFCTL ] & E1000_RFCTL_IPV6_XSUM_DIS ) ) {
 trace_e1000e_rx_metadata_ipv6_sum_disabled ( ) ;
 goto func_exit ;
 }
 if ( ! net_rx_pkt_has_virt_hdr ( pkt ) ) {
 trace_e1000e_rx_metadata_no_virthdr ( ) ;
 e1000e_verify_csum_in_sw ( core , pkt , status_flags , istcp , isudp ) ;
 goto func_exit ;
 }
 vhdr = net_rx_pkt_get_vhdr ( pkt ) ;
 if ( ! ( vhdr -> flags & VIRTIO_NET_HDR_F_DATA_VALID ) && ! ( vhdr -> flags & VIRTIO_NET_HDR_F_NEEDS_CSUM ) ) {
 trace_e1000e_rx_metadata_virthdr_no_csum_info ( ) ;
 e1000e_verify_csum_in_sw ( core , pkt , status_flags , istcp , isudp ) ;
 goto func_exit ;
 }
 if ( e1000e_rx_l3_cso_enabled ( core ) ) {
 * status_flags |= isip4 ? E1000_RXD_STAT_IPCS : 0 ;
 }
 else {
 trace_e1000e_rx_metadata_l3_cso_disabled ( ) ;
 }
 if ( e1000e_rx_l4_cso_enabled ( core ) ) {
 if ( istcp ) {
 * status_flags |= E1000_RXD_STAT_TCPCS ;
 }
 else if ( isudp ) {
 * status_flags |= E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS ;
 }
 }
 else {
 trace_e1000e_rx_metadata_l4_cso_disabled ( ) ;
 }
 trace_e1000e_rx_metadata_status_flags ( * status_flags ) ;
 func_exit : * status_flags = cpu_to_le32 ( * status_flags ) ;
 }
static void e1000e_build_rx_metadata ( E1000ECore * core , struct NetRxPkt * pkt , bool is_eop , const E1000E_RSSInfo * rss_info , uint32_t * rss , uint32_t * mrq , uint32_t * status_flags , uint16_t * ip_id , uint16_t * vlan_tag ) {
 struct virtio_net_hdr * vhdr ;
 bool isip4 , isip6 , istcp , isudp ;
 uint32_t pkt_type ;
 * status_flags = E1000_RXD_STAT_DD ;
 if ( ! is_eop ) {
 goto func_exit ;
 }
 * status_flags |= E1000_RXD_STAT_EOP ;
 net_rx_pkt_get_protocols ( pkt , & isip4 , & isip6 , & isudp , & istcp ) ;
 trace_e1000e_rx_metadata_protocols ( isip4 , isip6 , isudp , istcp ) ;
 if ( net_rx_pkt_is_vlan_stripped ( pkt ) ) {
 * status_flags |= E1000_RXD_STAT_VP ;
 * vlan_tag = cpu_to_le16 ( net_rx_pkt_get_vlan_tag ( pkt ) ) ;
 trace_e1000e_rx_metadata_vlan ( * vlan_tag ) ;
 }
 if ( ( core -> mac [ RXCSUM ] & E1000_RXCSUM_PCSD ) != 0 ) {
 if ( rss_info -> enabled ) {
 * rss = cpu_to_le32 ( rss_info -> hash ) ;
 * mrq = cpu_to_le32 ( rss_info -> type | ( rss_info -> queue << 8 ) ) ;
 trace_e1000e_rx_metadata_rss ( * rss , * mrq ) ;
 }
 }
 else if ( isip4 ) {
 * status_flags |= E1000_RXD_STAT_IPIDV ;
 * ip_id = cpu_to_le16 ( net_rx_pkt_get_ip_id ( pkt ) ) ;
 trace_e1000e_rx_metadata_ip_id ( * ip_id ) ;
 }
 if ( istcp && e1000e_is_tcp_ack ( core , pkt ) ) {
 * status_flags |= E1000_RXD_STAT_ACK ;
 trace_e1000e_rx_metadata_ack ( ) ;
 }
 if ( isip6 && ( core -> mac [ RFCTL ] & E1000_RFCTL_IPV6_DIS ) ) {
 trace_e1000e_rx_metadata_ipv6_filtering_disabled ( ) ;
 pkt_type = E1000_RXD_PKT_MAC ;
 }
 else if ( istcp || isudp ) {
 pkt_type = isip4 ? E1000_RXD_PKT_IP4_XDP : E1000_RXD_PKT_IP6_XDP ;
 }
 else if ( isip4 || isip6 ) {
 pkt_type = isip4 ? E1000_RXD_PKT_IP4 : E1000_RXD_PKT_IP6 ;
 }
 else {
 pkt_type = E1000_RXD_PKT_MAC ;
 }
 * status_flags |= E1000_RXD_PKT_TYPE ( pkt_type ) ;
 trace_e1000e_rx_metadata_pkt_type ( pkt_type ) ;
 if ( isip6 && ( core -> mac [ RFCTL ] & E1000_RFCTL_IPV6_XSUM_DIS ) ) {
 trace_e1000e_rx_metadata_ipv6_sum_disabled ( ) ;
 goto func_exit ;
 }
 if ( ! net_rx_pkt_has_virt_hdr ( pkt ) ) {
 trace_e1000e_rx_metadata_no_virthdr ( ) ;
 e1000e_verify_csum_in_sw ( core , pkt , status_flags , istcp , isudp ) ;
 goto func_exit ;
 }
 vhdr = net_rx_pkt_get_vhdr ( pkt ) ;
 if ( ! ( vhdr -> flags & VIRTIO_NET_HDR_F_DATA_VALID ) && ! ( vhdr -> flags & VIRTIO_NET_HDR_F_NEEDS_CSUM ) ) {
 trace_e1000e_rx_metadata_virthdr_no_csum_info ( ) ;
 e1000e_verify_csum_in_sw ( core , pkt , status_flags , istcp , isudp ) ;
 goto func_exit ;
 }
 if ( e1000e_rx_l3_cso_enabled ( core ) ) {
 * status_flags |= isip4 ? E1000_RXD_STAT_IPCS : 0 ;
 }
 else {
 trace_e1000e_rx_metadata_l3_cso_disabled ( ) ;
 }
 if ( e1000e_rx_l4_cso_enabled ( core ) ) {
 if ( istcp ) {
 * status_flags |= E1000_RXD_STAT_TCPCS ;
 }
 else if ( isudp ) {
 * status_flags |= E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS ;
 }
 }
 else {
 trace_e1000e_rx_metadata_l4_cso_disabled ( ) ;
 }
 trace_e1000e_rx_metadata_status_flags ( * status_flags ) ;
 func_exit : * status_flags = cpu_to_le32 ( * status_flags ) ;
 }