Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 474e8cf4 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "net: rmnet_data: add support for DL MAP based checksum offload"

parents 0739231d 0db8fc47
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+16 −0
Original line number Diff line number Diff line
@@ -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)
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -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
};

+20 −0
Original line number Diff line number Diff line
@@ -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 */
+25 −10
Original line number Diff line number Diff line
@@ -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,
@@ -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
};
@@ -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
@@ -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