@@ -177,25 +177,23 @@ static int netvsc_close(struct net_device *net)
177
177
return ret ;
178
178
}
179
179
180
- static void * init_ppi_data (struct rndis_message * msg , u32 ppi_size ,
181
- int pkt_type )
180
+ static inline void * init_ppi_data (struct rndis_message * msg ,
181
+ u32 ppi_size , u32 pkt_type )
182
182
{
183
- struct rndis_packet * rndis_pkt ;
183
+ struct rndis_packet * rndis_pkt = & msg -> msg . pkt ;
184
184
struct rndis_per_packet_info * ppi ;
185
185
186
- rndis_pkt = & msg -> msg .pkt ;
187
186
rndis_pkt -> data_offset += ppi_size ;
188
-
189
- ppi = (struct rndis_per_packet_info * )((void * )rndis_pkt +
190
- rndis_pkt -> per_pkt_info_offset + rndis_pkt -> per_pkt_info_len );
187
+ ppi = (void * )rndis_pkt + rndis_pkt -> per_pkt_info_offset
188
+ + rndis_pkt -> per_pkt_info_len ;
191
189
192
190
ppi -> size = ppi_size ;
193
191
ppi -> type = pkt_type ;
194
192
ppi -> ppi_offset = sizeof (struct rndis_per_packet_info );
195
193
196
194
rndis_pkt -> per_pkt_info_len += ppi_size ;
197
195
198
- return ppi ;
196
+ return ppi + 1 ;
199
197
}
200
198
201
199
/* Azure hosts don't support non-TCP port numbers in hashing for fragmented
@@ -472,10 +470,8 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
472
470
int ret ;
473
471
unsigned int num_data_pgs ;
474
472
struct rndis_message * rndis_msg ;
475
- struct rndis_packet * rndis_pkt ;
476
473
struct net_device * vf_netdev ;
477
474
u32 rndis_msg_size ;
478
- struct rndis_per_packet_info * ppi ;
479
475
u32 hash ;
480
476
struct hv_page_buffer pb [MAX_PAGE_BUFFER_COUNT ];
481
477
@@ -530,34 +526,36 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
530
526
531
527
rndis_msg = (struct rndis_message * )skb -> head ;
532
528
533
- memset (rndis_msg , 0 , RNDIS_AND_PPI_SIZE );
534
-
535
529
/* Add the rndis header */
536
530
rndis_msg -> ndis_msg_type = RNDIS_MSG_PACKET ;
537
531
rndis_msg -> msg_len = packet -> total_data_buflen ;
538
- rndis_pkt = & rndis_msg -> msg .pkt ;
539
- rndis_pkt -> data_offset = sizeof (struct rndis_packet );
540
- rndis_pkt -> data_len = packet -> total_data_buflen ;
541
- rndis_pkt -> per_pkt_info_offset = sizeof (struct rndis_packet );
532
+
533
+ rndis_msg -> msg .pkt = (struct rndis_packet ) {
534
+ .data_offset = sizeof (struct rndis_packet ),
535
+ .data_len = packet -> total_data_buflen ,
536
+ .per_pkt_info_offset = sizeof (struct rndis_packet ),
537
+ };
542
538
543
539
rndis_msg_size = RNDIS_MESSAGE_SIZE (struct rndis_packet );
544
540
545
541
hash = skb_get_hash_raw (skb );
546
542
if (hash != 0 && net -> real_num_tx_queues > 1 ) {
543
+ u32 * hash_info ;
544
+
547
545
rndis_msg_size += NDIS_HASH_PPI_SIZE ;
548
- ppi = init_ppi_data (rndis_msg , NDIS_HASH_PPI_SIZE ,
549
- NBL_HASH_VALUE );
550
- * ( u32 * )(( void * ) ppi + ppi -> ppi_offset ) = hash ;
546
+ hash_info = init_ppi_data (rndis_msg , NDIS_HASH_PPI_SIZE ,
547
+ NBL_HASH_VALUE );
548
+ * hash_info = hash ;
551
549
}
552
550
553
551
if (skb_vlan_tag_present (skb )) {
554
552
struct ndis_pkt_8021q_info * vlan ;
555
553
556
554
rndis_msg_size += NDIS_VLAN_PPI_SIZE ;
557
- ppi = init_ppi_data (rndis_msg , NDIS_VLAN_PPI_SIZE ,
558
- IEEE_8021Q_INFO );
555
+ vlan = init_ppi_data (rndis_msg , NDIS_VLAN_PPI_SIZE ,
556
+ IEEE_8021Q_INFO );
559
557
560
- vlan = ( void * ) ppi + ppi -> ppi_offset ;
558
+ vlan -> value = 0 ;
561
559
vlan -> vlanid = skb -> vlan_tci & VLAN_VID_MASK ;
562
560
vlan -> pri = (skb -> vlan_tci & VLAN_PRIO_MASK ) >>
563
561
VLAN_PRIO_SHIFT ;
@@ -567,11 +565,10 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
567
565
struct ndis_tcp_lso_info * lso_info ;
568
566
569
567
rndis_msg_size += NDIS_LSO_PPI_SIZE ;
570
- ppi = init_ppi_data (rndis_msg , NDIS_LSO_PPI_SIZE ,
571
- TCP_LARGESEND_PKTINFO );
572
-
573
- lso_info = (void * )ppi + ppi -> ppi_offset ;
568
+ lso_info = init_ppi_data (rndis_msg , NDIS_LSO_PPI_SIZE ,
569
+ TCP_LARGESEND_PKTINFO );
574
570
571
+ lso_info -> value = 0 ;
575
572
lso_info -> lso_v2_transmit .type = NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE ;
576
573
if (skb -> protocol == htons (ETH_P_IP )) {
577
574
lso_info -> lso_v2_transmit .ip_version =
@@ -596,12 +593,10 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
596
593
struct ndis_tcp_ip_checksum_info * csum_info ;
597
594
598
595
rndis_msg_size += NDIS_CSUM_PPI_SIZE ;
599
- ppi = init_ppi_data (rndis_msg , NDIS_CSUM_PPI_SIZE ,
600
- TCPIP_CHKSUM_PKTINFO );
601
-
602
- csum_info = (struct ndis_tcp_ip_checksum_info * )((void * )ppi +
603
- ppi -> ppi_offset );
596
+ csum_info = init_ppi_data (rndis_msg , NDIS_CSUM_PPI_SIZE ,
597
+ TCPIP_CHKSUM_PKTINFO );
604
598
599
+ csum_info -> value = 0 ;
605
600
csum_info -> transmit .tcp_header_offset = skb_transport_offset (skb );
606
601
607
602
if (skb -> protocol == htons (ETH_P_IP )) {
0 commit comments