Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c +7 −2 Original line number Diff line number Diff line Loading @@ -248,7 +248,7 @@ __rmnet_map_ingress_handler(struct sk_buff *skb, if (qmap->next_hdr && (port->data_format & (RMNET_FLAGS_INGRESS_COALESCE | RMNET_FLAGS_INGRESS_MAP_CKSUMV5))) { if (rmnet_map_process_next_hdr_packet(skb, &list)) if (rmnet_map_process_next_hdr_packet(skb, &list, len)) goto free_skb; } else { /* We only have the main QMAP header to worry about */ Loading Loading @@ -316,10 +316,15 @@ rmnet_map_ingress_handler(struct sk_buff *skb, struct sk_buff *skb_frag = skb_shinfo(skb)->frag_list; skb_shinfo(skb)->frag_list = NULL; while ((skbn = rmnet_map_deaggregate(skb, port)) != NULL) while ((skbn = rmnet_map_deaggregate(skb, port)) != NULL) { __rmnet_map_ingress_handler(skbn, port); if (skbn == skb) goto next_skb; } consume_skb(skb); next_skb: skb = skb_frag; } } Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h +2 −1 Original line number Diff line number Diff line Loading @@ -248,7 +248,8 @@ void rmnet_map_checksum_uplink_packet(struct sk_buff *skb, struct net_device *orig_dev, int csum_type); int rmnet_map_process_next_hdr_packet(struct sk_buff *skb, struct sk_buff_head *list); struct sk_buff_head *list, u16 len); int rmnet_map_tx_agg_skip(struct sk_buff *skb, int offset); void rmnet_map_tx_aggregate(struct sk_buff *skb, struct rmnet_port *port); void rmnet_map_tx_aggregate_init(struct rmnet_port *port); Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c +18 −3 Original line number Diff line number Diff line Loading @@ -324,7 +324,7 @@ struct sk_buff *rmnet_map_deaggregate(struct sk_buff *skb, { struct rmnet_map_header *maph; struct sk_buff *skbn; unsigned char *data = rmnet_map_data_ptr(skb); unsigned char *data = rmnet_map_data_ptr(skb), *next_hdr = NULL; u32 packet_len; if (skb->len == 0) Loading @@ -336,8 +336,12 @@ struct sk_buff *rmnet_map_deaggregate(struct sk_buff *skb, if (port->data_format & RMNET_FLAGS_INGRESS_MAP_CKSUMV4) packet_len += sizeof(struct rmnet_map_dl_csum_trailer); else if (port->data_format & RMNET_FLAGS_INGRESS_MAP_CKSUMV5) { if (!maph->cd_bit) if (!maph->cd_bit) { packet_len += sizeof(struct rmnet_map_v5_csum_header); /* Coalescing headers require MAPv5 */ next_hdr = data + sizeof(*maph); } } if (((int)skb->len - (int)packet_len) < 0) Loading @@ -347,6 +351,11 @@ struct sk_buff *rmnet_map_deaggregate(struct sk_buff *skb, if (ntohs(maph->pkt_len) == 0) return NULL; if (next_hdr && ((struct rmnet_map_v5_coal_header *)next_hdr)->header_type == RMNET_MAP_HEADER_TYPE_COALESCING) return skb; if (skb_is_nonlinear(skb)) { skb_frag_t *frag0 = skb_shinfo(skb)->frags; struct page *page = skb_frag_page(frag0); Loading Loading @@ -1000,7 +1009,8 @@ static int rmnet_map_data_check_coal_header(struct sk_buff *skb, /* Process a QMAPv5 packet header */ int rmnet_map_process_next_hdr_packet(struct sk_buff *skb, struct sk_buff_head *list) struct sk_buff_head *list, u16 len) { struct rmnet_priv *priv = netdev_priv(skb->dev); u64 nlo_err_mask; Loading @@ -1027,6 +1037,11 @@ int rmnet_map_process_next_hdr_packet(struct sk_buff *skb, pskb_pull(skb, (sizeof(struct rmnet_map_header) + sizeof(struct rmnet_map_v5_csum_header))); /* Remove padding only for csum offload packets. * Coalesced packets should never have padding. */ pskb_trim(skb, len); __skb_queue_tail(list, skb); break; default: Loading Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c +7 −2 Original line number Diff line number Diff line Loading @@ -248,7 +248,7 @@ __rmnet_map_ingress_handler(struct sk_buff *skb, if (qmap->next_hdr && (port->data_format & (RMNET_FLAGS_INGRESS_COALESCE | RMNET_FLAGS_INGRESS_MAP_CKSUMV5))) { if (rmnet_map_process_next_hdr_packet(skb, &list)) if (rmnet_map_process_next_hdr_packet(skb, &list, len)) goto free_skb; } else { /* We only have the main QMAP header to worry about */ Loading Loading @@ -316,10 +316,15 @@ rmnet_map_ingress_handler(struct sk_buff *skb, struct sk_buff *skb_frag = skb_shinfo(skb)->frag_list; skb_shinfo(skb)->frag_list = NULL; while ((skbn = rmnet_map_deaggregate(skb, port)) != NULL) while ((skbn = rmnet_map_deaggregate(skb, port)) != NULL) { __rmnet_map_ingress_handler(skbn, port); if (skbn == skb) goto next_skb; } consume_skb(skb); next_skb: skb = skb_frag; } } Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h +2 −1 Original line number Diff line number Diff line Loading @@ -248,7 +248,8 @@ void rmnet_map_checksum_uplink_packet(struct sk_buff *skb, struct net_device *orig_dev, int csum_type); int rmnet_map_process_next_hdr_packet(struct sk_buff *skb, struct sk_buff_head *list); struct sk_buff_head *list, u16 len); int rmnet_map_tx_agg_skip(struct sk_buff *skb, int offset); void rmnet_map_tx_aggregate(struct sk_buff *skb, struct rmnet_port *port); void rmnet_map_tx_aggregate_init(struct rmnet_port *port); Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c +18 −3 Original line number Diff line number Diff line Loading @@ -324,7 +324,7 @@ struct sk_buff *rmnet_map_deaggregate(struct sk_buff *skb, { struct rmnet_map_header *maph; struct sk_buff *skbn; unsigned char *data = rmnet_map_data_ptr(skb); unsigned char *data = rmnet_map_data_ptr(skb), *next_hdr = NULL; u32 packet_len; if (skb->len == 0) Loading @@ -336,8 +336,12 @@ struct sk_buff *rmnet_map_deaggregate(struct sk_buff *skb, if (port->data_format & RMNET_FLAGS_INGRESS_MAP_CKSUMV4) packet_len += sizeof(struct rmnet_map_dl_csum_trailer); else if (port->data_format & RMNET_FLAGS_INGRESS_MAP_CKSUMV5) { if (!maph->cd_bit) if (!maph->cd_bit) { packet_len += sizeof(struct rmnet_map_v5_csum_header); /* Coalescing headers require MAPv5 */ next_hdr = data + sizeof(*maph); } } if (((int)skb->len - (int)packet_len) < 0) Loading @@ -347,6 +351,11 @@ struct sk_buff *rmnet_map_deaggregate(struct sk_buff *skb, if (ntohs(maph->pkt_len) == 0) return NULL; if (next_hdr && ((struct rmnet_map_v5_coal_header *)next_hdr)->header_type == RMNET_MAP_HEADER_TYPE_COALESCING) return skb; if (skb_is_nonlinear(skb)) { skb_frag_t *frag0 = skb_shinfo(skb)->frags; struct page *page = skb_frag_page(frag0); Loading Loading @@ -1000,7 +1009,8 @@ static int rmnet_map_data_check_coal_header(struct sk_buff *skb, /* Process a QMAPv5 packet header */ int rmnet_map_process_next_hdr_packet(struct sk_buff *skb, struct sk_buff_head *list) struct sk_buff_head *list, u16 len) { struct rmnet_priv *priv = netdev_priv(skb->dev); u64 nlo_err_mask; Loading @@ -1027,6 +1037,11 @@ int rmnet_map_process_next_hdr_packet(struct sk_buff *skb, pskb_pull(skb, (sizeof(struct rmnet_map_header) + sizeof(struct rmnet_map_v5_csum_header))); /* Remove padding only for csum offload packets. * Coalesced packets should never have padding. */ pskb_trim(skb, len); __skb_queue_tail(list, skb); break; default: Loading