Loading include/uapi/linux/rmnet_data.h +1 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #define RMNET_INGRESS_FORMAT_DEAGGREGATION (1<<2) #define RMNET_INGRESS_FORMAT_DEMUXING (1<<3) #define RMNET_INGRESS_FORMAT_MAP_COMMANDS (1<<4) #define RMNET_INGRESS_FORMAT_MAP_CKSUMV3 (1<<5) /* ***************** Netlink API ******************************************** */ #define RMNET_NETLINK_PROTO 31 Loading net/rmnet_data/rmnet_data_handlers.c +16 −0 Original line number Diff line number Diff line Loading @@ -255,6 +255,7 @@ static rx_handler_result_t _rmnet_map_ingress_handler(struct sk_buff *skb, struct rmnet_logical_ep_conf_s *ep; uint8_t mux_id; uint16_t len; int ckresult; mux_id = RMNET_MAP_GET_MUX_ID(skb); len = RMNET_MAP_GET_LENGTH(skb) Loading @@ -281,6 +282,21 @@ static rx_handler_result_t _rmnet_map_ingress_handler(struct sk_buff *skb, if (config->ingress_data_format & RMNET_INGRESS_FORMAT_DEMUXING) skb->dev = ep->egress_dev; if (config->ingress_data_format & RMNET_INGRESS_FORMAT_MAP_CKSUMV3) { ckresult = rmnet_map_checksum_downlink_packet(skb); trace_rmnet_map_checksum_downlink_packet(skb, ckresult); if (likely(ckresult == RMNET_MAP_CHECKSUM_OK)) skb->ip_summed |= CHECKSUM_UNNECESSARY; else if (ckresult != RMNET_MAP_CHECKSUM_ERR_UNKNOWN_IP_VERSION && ckresult != RMNET_MAP_CHECKSUM_ERR_UNKNOWN_TRANSPORT && ckresult != RMNET_MAP_CHECKSUM_VALID_FLAG_NOT_SET && ckresult != RMNET_MAP_CHECKSUM_FRAGMENTED_PACKET) { rmnet_kfree_skb(skb, RMNET_STATS_SKBFREE_INGRESS_BAD_MAP_CKSUM); return RX_HANDLER_CONSUMED; } } /* Subtract MAP header */ skb_pull(skb, sizeof(struct rmnet_map_header_s)); skb_trim(skb, len); Loading net/rmnet_data/rmnet_data_stats.h +1 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ enum rmnet_skb_free_e { RMNET_STATS_SKBFREE_DEAGG_CLONE_FAIL, RMNET_STATS_SKBFREE_DEAGG_UNKOWN_IP_TYP, RMNET_STATS_SKBFREE_DEAGG_DATA_LEN_0, RMNET_STATS_SKBFREE_INGRESS_BAD_MAP_CKSUM, RMNET_STATS_SKBFREE_MAX }; Loading net/rmnet_data/rmnet_data_trace.h +20 −0 Original line number Diff line number Diff line Loading @@ -200,6 +200,26 @@ TRACE_EVENT(rmnet_end_deaggregation, __get_str(name), __entry->num) ) TRACE_EVENT(rmnet_map_checksum_downlink_packet, TP_PROTO(struct sk_buff *skb, int ckresult), TP_ARGS(skb, ckresult), TP_STRUCT__entry( __string(name, skb->dev->name) __field(int, res) ), TP_fast_assign( __assign_str(name, skb->dev->name); __entry->res = ckresult; ), TP_printk("DL checksum on dev=%s, res: %d", __get_str(name), __entry->res) ) #endif /* _RMNET_DATA_TRACE_H_ */ /* This part must be outside protection */ Loading net/rmnet_data/rmnet_map.h +25 −10 Original line number Diff line number Diff line Loading @@ -48,6 +48,22 @@ struct rmnet_map_control_command_s { }; } __aligned(1); struct rmnet_map_dl_checksum_trailer_s { unsigned char reserved_h; #if defined(__LITTLE_ENDIAN_BITFIELD) unsigned char valid:1; unsigned char reserved_l:7; #elif defined(__BIG_ENDIAN_BITFIELD) unsigned char reserved_l:7; unsigned char valid:1; #else #error "Please fix <asm/byteorder.h>" #endif unsigned short checksum_start_offset; unsigned short checksum_length; unsigned short checksum_value; } __aligned(1); enum rmnet_map_results_e { RMNET_MAP_SUCCESS, RMNET_MAP_CONSUMED, Loading @@ -70,11 +86,12 @@ enum rmnet_map_checksum_errors_e { RMNET_MAP_CHECKSUM_OK, RMNET_MAP_CHECKSUM_VALID_FLAG_NOT_SET, RMNET_MAP_CHECKSUM_VALIDATION_FAILED, RMNET_MAP_CHECKSUM_ERROR_UNKOWN, RMNET_MAP_CHECKSUM_ERROR_NOT_DATA_PACKET, RMNET_MAP_CHECKSUM_ERROR_BAD_BUFFER, RMNET_MAP_CHECKSUM_ERROR_UNKNOWN_IP_VERSION, RMNET_MAP_CHECKSUM_ERROR_UNKNOWN_TRANSPORT, RMNET_MAP_CHECKSUM_ERR_UNKOWN, RMNET_MAP_CHECKSUM_ERR_NOT_DATA_PACKET, RMNET_MAP_CHECKSUM_ERR_BAD_BUFFER, RMNET_MAP_CHECKSUM_ERR_UNKNOWN_IP_VERSION, RMNET_MAP_CHECKSUM_ERR_UNKNOWN_TRANSPORT, RMNET_MAP_CHECKSUM_FRAGMENTED_PACKET, /* This should always be the last element */ RMNET_MAP_CHECKSUM_ENUM_LENGTH }; Loading @@ -93,11 +110,6 @@ enum rmnet_map_agg_state_e { RMNET_MAP_TXFER_SCHEDULED }; #define RMNET_MAP_P_ICMP4 0x01 #define RMNET_MAP_P_TCP 0x06 #define RMNET_MAP_P_UDP 0x11 #define RMNET_MAP_P_ICMP6 0x3a #define RMNET_MAP_COMMAND_REQUEST 0 #define RMNET_MAP_COMMAND_ACK 1 #define RMNET_MAP_COMMAND_UNSUPPORTED 2 Loading @@ -114,4 +126,7 @@ rx_handler_result_t rmnet_map_command(struct sk_buff *skb, void rmnet_map_aggregate(struct sk_buff *skb, struct rmnet_phys_ep_conf_s *config); int rmnet_map_checksum_downlink_packet(struct sk_buff *skb); #endif /* _RMNET_MAP_H_ */ Loading
include/uapi/linux/rmnet_data.h +1 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #define RMNET_INGRESS_FORMAT_DEAGGREGATION (1<<2) #define RMNET_INGRESS_FORMAT_DEMUXING (1<<3) #define RMNET_INGRESS_FORMAT_MAP_COMMANDS (1<<4) #define RMNET_INGRESS_FORMAT_MAP_CKSUMV3 (1<<5) /* ***************** Netlink API ******************************************** */ #define RMNET_NETLINK_PROTO 31 Loading
net/rmnet_data/rmnet_data_handlers.c +16 −0 Original line number Diff line number Diff line Loading @@ -255,6 +255,7 @@ static rx_handler_result_t _rmnet_map_ingress_handler(struct sk_buff *skb, struct rmnet_logical_ep_conf_s *ep; uint8_t mux_id; uint16_t len; int ckresult; mux_id = RMNET_MAP_GET_MUX_ID(skb); len = RMNET_MAP_GET_LENGTH(skb) Loading @@ -281,6 +282,21 @@ static rx_handler_result_t _rmnet_map_ingress_handler(struct sk_buff *skb, if (config->ingress_data_format & RMNET_INGRESS_FORMAT_DEMUXING) skb->dev = ep->egress_dev; if (config->ingress_data_format & RMNET_INGRESS_FORMAT_MAP_CKSUMV3) { ckresult = rmnet_map_checksum_downlink_packet(skb); trace_rmnet_map_checksum_downlink_packet(skb, ckresult); if (likely(ckresult == RMNET_MAP_CHECKSUM_OK)) skb->ip_summed |= CHECKSUM_UNNECESSARY; else if (ckresult != RMNET_MAP_CHECKSUM_ERR_UNKNOWN_IP_VERSION && ckresult != RMNET_MAP_CHECKSUM_ERR_UNKNOWN_TRANSPORT && ckresult != RMNET_MAP_CHECKSUM_VALID_FLAG_NOT_SET && ckresult != RMNET_MAP_CHECKSUM_FRAGMENTED_PACKET) { rmnet_kfree_skb(skb, RMNET_STATS_SKBFREE_INGRESS_BAD_MAP_CKSUM); return RX_HANDLER_CONSUMED; } } /* Subtract MAP header */ skb_pull(skb, sizeof(struct rmnet_map_header_s)); skb_trim(skb, len); Loading
net/rmnet_data/rmnet_data_stats.h +1 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ enum rmnet_skb_free_e { RMNET_STATS_SKBFREE_DEAGG_CLONE_FAIL, RMNET_STATS_SKBFREE_DEAGG_UNKOWN_IP_TYP, RMNET_STATS_SKBFREE_DEAGG_DATA_LEN_0, RMNET_STATS_SKBFREE_INGRESS_BAD_MAP_CKSUM, RMNET_STATS_SKBFREE_MAX }; Loading
net/rmnet_data/rmnet_data_trace.h +20 −0 Original line number Diff line number Diff line Loading @@ -200,6 +200,26 @@ TRACE_EVENT(rmnet_end_deaggregation, __get_str(name), __entry->num) ) TRACE_EVENT(rmnet_map_checksum_downlink_packet, TP_PROTO(struct sk_buff *skb, int ckresult), TP_ARGS(skb, ckresult), TP_STRUCT__entry( __string(name, skb->dev->name) __field(int, res) ), TP_fast_assign( __assign_str(name, skb->dev->name); __entry->res = ckresult; ), TP_printk("DL checksum on dev=%s, res: %d", __get_str(name), __entry->res) ) #endif /* _RMNET_DATA_TRACE_H_ */ /* This part must be outside protection */ Loading
net/rmnet_data/rmnet_map.h +25 −10 Original line number Diff line number Diff line Loading @@ -48,6 +48,22 @@ struct rmnet_map_control_command_s { }; } __aligned(1); struct rmnet_map_dl_checksum_trailer_s { unsigned char reserved_h; #if defined(__LITTLE_ENDIAN_BITFIELD) unsigned char valid:1; unsigned char reserved_l:7; #elif defined(__BIG_ENDIAN_BITFIELD) unsigned char reserved_l:7; unsigned char valid:1; #else #error "Please fix <asm/byteorder.h>" #endif unsigned short checksum_start_offset; unsigned short checksum_length; unsigned short checksum_value; } __aligned(1); enum rmnet_map_results_e { RMNET_MAP_SUCCESS, RMNET_MAP_CONSUMED, Loading @@ -70,11 +86,12 @@ enum rmnet_map_checksum_errors_e { RMNET_MAP_CHECKSUM_OK, RMNET_MAP_CHECKSUM_VALID_FLAG_NOT_SET, RMNET_MAP_CHECKSUM_VALIDATION_FAILED, RMNET_MAP_CHECKSUM_ERROR_UNKOWN, RMNET_MAP_CHECKSUM_ERROR_NOT_DATA_PACKET, RMNET_MAP_CHECKSUM_ERROR_BAD_BUFFER, RMNET_MAP_CHECKSUM_ERROR_UNKNOWN_IP_VERSION, RMNET_MAP_CHECKSUM_ERROR_UNKNOWN_TRANSPORT, RMNET_MAP_CHECKSUM_ERR_UNKOWN, RMNET_MAP_CHECKSUM_ERR_NOT_DATA_PACKET, RMNET_MAP_CHECKSUM_ERR_BAD_BUFFER, RMNET_MAP_CHECKSUM_ERR_UNKNOWN_IP_VERSION, RMNET_MAP_CHECKSUM_ERR_UNKNOWN_TRANSPORT, RMNET_MAP_CHECKSUM_FRAGMENTED_PACKET, /* This should always be the last element */ RMNET_MAP_CHECKSUM_ENUM_LENGTH }; Loading @@ -93,11 +110,6 @@ enum rmnet_map_agg_state_e { RMNET_MAP_TXFER_SCHEDULED }; #define RMNET_MAP_P_ICMP4 0x01 #define RMNET_MAP_P_TCP 0x06 #define RMNET_MAP_P_UDP 0x11 #define RMNET_MAP_P_ICMP6 0x3a #define RMNET_MAP_COMMAND_REQUEST 0 #define RMNET_MAP_COMMAND_ACK 1 #define RMNET_MAP_COMMAND_UNSUPPORTED 2 Loading @@ -114,4 +126,7 @@ rx_handler_result_t rmnet_map_command(struct sk_buff *skb, void rmnet_map_aggregate(struct sk_buff *skb, struct rmnet_phys_ep_conf_s *config); int rmnet_map_checksum_downlink_packet(struct sk_buff *skb); #endif /* _RMNET_MAP_H_ */