net: qualcomm: rmnet: Handle command packets with checksum trailer
authorSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>
Sun, 7 Jan 2018 18:36:38 +0000 (11:36 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 8 Jan 2018 18:58:49 +0000 (13:58 -0500)
When using the MAPv4 packet format in conjunction with MAP commands,
a dummy DL checksum trailer will be appended to the packet. Before
this packet is sent out as an ACK, the DL checksum trailer needs to be
removed.

Signed-off-by: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c

index 51e604923ac19ab4bc4362be89273630cdc88626..6bc328fb88e13fba1f635ae9e7337e1395ce56d4 100644 (file)
@@ -58,11 +58,24 @@ static u8 rmnet_map_do_flow_control(struct sk_buff *skb,
 }
 
 static void rmnet_map_send_ack(struct sk_buff *skb,
-                              unsigned char type)
+                              unsigned char type,
+                              struct rmnet_port *port)
 {
        struct rmnet_map_control_command *cmd;
        int xmit_status;
 
+       if (port->data_format & RMNET_INGRESS_FORMAT_MAP_CKSUMV4) {
+               if (skb->len < sizeof(struct rmnet_map_header) +
+                   RMNET_MAP_GET_LENGTH(skb) +
+                   sizeof(struct rmnet_map_dl_csum_trailer)) {
+                       kfree_skb(skb);
+                       return;
+               }
+
+               skb_trim(skb, skb->len -
+                        sizeof(struct rmnet_map_dl_csum_trailer));
+       }
+
        skb->protocol = htons(ETH_P_MAP);
 
        cmd = RMNET_MAP_GET_CMD_START(skb);
@@ -100,5 +113,5 @@ void rmnet_map_command(struct sk_buff *skb, struct rmnet_port *port)
                break;
        }
        if (rc == RMNET_MAP_COMMAND_ACK)
-               rmnet_map_send_ack(skb, rc);
+               rmnet_map_send_ack(skb, rc, port);
 }