|
@@ -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);
|
|
|
}
|