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 <subas...@codeaurora.org>
---
 drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c 
b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c
index 51e6049..6bc328f 100644
--- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c
+++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c
@@ -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);
 }
-- 
1.9.1

Reply via email to