diff --git a/net/rmnet_data/rmnet_data_handlers.c b/net/rmnet_data/rmnet_data_handlers.c index 2275377347c3..0f60f505c099 100644 --- a/net/rmnet_data/rmnet_data_handlers.c +++ b/net/rmnet_data/rmnet_data_handlers.c @@ -441,7 +441,13 @@ static int rmnet_map_egress_handler(struct sk_buff *skb, rmnet_stats_ul_checksum(ckresult); } - map_header = rmnet_map_add_map_header(skb, additional_header_length); + if ((config->egress_data_format & RMNET_EGRESS_FORMAT_MAP_CKSUMV4) && + (!(config->egress_data_format & RMNET_EGRESS_FORMAT_AGGREGATION))) + map_header = rmnet_map_add_map_header + (skb, additional_header_length, RMNET_MAP_NO_PAD_BYTES); + else + map_header = rmnet_map_add_map_header + (skb, additional_header_length, RMNET_MAP_ADD_PAD_BYTES); if (!map_header) { LOGD("%s", "Failed to add MAP header to egress packet"); diff --git a/net/rmnet_data/rmnet_map.h b/net/rmnet_data/rmnet_map.h index 962b03f4f2ea..165bd5288189 100644 --- a/net/rmnet_data/rmnet_map.h +++ b/net/rmnet_data/rmnet_map.h @@ -132,12 +132,15 @@ enum rmnet_map_agg_state_e { #define RMNET_MAP_COMMAND_UNSUPPORTED 2 #define RMNET_MAP_COMMAND_INVALID 3 +#define RMNET_MAP_NO_PAD_BYTES 0 +#define RMNET_MAP_ADD_PAD_BYTES 1 + uint8_t rmnet_map_demultiplex(struct sk_buff *skb); struct sk_buff *rmnet_map_deaggregate(struct sk_buff *skb, struct rmnet_phys_ep_conf_s *config); struct rmnet_map_header_s *rmnet_map_add_map_header(struct sk_buff *skb, - int hdrlen); + int hdrlen, int pad); rx_handler_result_t rmnet_map_command(struct sk_buff *skb, struct rmnet_phys_ep_conf_s *config); void rmnet_map_aggregate(struct sk_buff *skb, diff --git a/net/rmnet_data/rmnet_map_data.c b/net/rmnet_data/rmnet_map_data.c index 4ea3d2f56aa7..4d3bd35e7538 100644 --- a/net/rmnet_data/rmnet_map_data.c +++ b/net/rmnet_data/rmnet_map_data.c @@ -64,6 +64,8 @@ struct agg_work { * @skb: Socket buffer ("packet") to modify * @hdrlen: Number of bytes of header data which should not be included in * MAP length field + * @pad: Specify if padding the MAP packet to make it 4 byte aligned is + * necessary * * Padding is calculated and set appropriately in MAP header. Mux ID is * initialized to 0. @@ -76,7 +78,7 @@ struct agg_work { * todo: Parameterize skb alignment */ struct rmnet_map_header_s *rmnet_map_add_map_header(struct sk_buff *skb, - int hdrlen) + int hdrlen, int pad) { uint32_t padding, map_datalen; uint8_t *padbytes; @@ -90,6 +92,11 @@ struct rmnet_map_header_s *rmnet_map_add_map_header(struct sk_buff *skb, skb_push(skb, sizeof(struct rmnet_map_header_s)); memset(map_header, 0, sizeof(struct rmnet_map_header_s)); + if (pad == RMNET_MAP_NO_PAD_BYTES) { + map_header->pkt_len = htons(map_datalen); + return map_header; + } + padding = ALIGN(map_datalen, 4) - map_datalen; if (padding == 0)