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

Commit fe853a8e authored by Conner Huff's avatar Conner Huff Committed by Gerrit - the friendly Code Review server
Browse files

rmnet: Changes required for rmnet_perf module



export symbols and change some signatures slightly
so that rmnet_perf module can play nice with
API's from rmnet

Change-Id: If8569516ccc0973ec9fb045942a024ac3a74a5fb
Signed-off-by: default avatarConner Huff <chuff@codeaurora.org>
parent 05e3fb2a
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -52,10 +52,11 @@ static const struct nla_policy rmnet_policy[IFLA_RMNET_MAX + 2] = {
	[IFLA_VLAN_EGRESS_QOS]	= { .len = sizeof(struct tcmsg) },
};

static int rmnet_is_real_dev_registered(const struct net_device *real_dev)
int rmnet_is_real_dev_registered(const struct net_device *real_dev)
{
	return rcu_access_pointer(real_dev->rx_handler) == rmnet_rx_handler;
}
EXPORT_SYMBOL(rmnet_is_real_dev_registered);

/* Needs rtnl lock */
static struct rmnet_port*
@@ -416,6 +417,7 @@ struct rmnet_port *rmnet_get_port(struct net_device *real_dev)
	else
		return NULL;
}
EXPORT_SYMBOL(rmnet_get_port);

struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id)
{
@@ -428,6 +430,7 @@ struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id)

	return NULL;
}
EXPORT_SYMBOL(rmnet_get_endpoint);

int rmnet_add_bridge(struct net_device *rmnet_dev,
		     struct net_device *slave_dev)
+2 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ struct rmnet_port {
	u8 rmnet_mode;
	struct hlist_head muxed_ep[RMNET_MAX_LOGICAL_EP];
	struct net_device *bridge_ep;
	void *rmnet_perf;

	u16 egress_agg_size;
	u16 egress_agg_count;
@@ -108,6 +109,7 @@ struct rmnet_priv {
	void *qos_info;
};

int rmnet_is_real_dev_registered(const struct net_device *real_dev);
struct rmnet_port *rmnet_get_port(struct net_device *real_dev);
struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id);
int rmnet_add_bridge(struct net_device *rmnet_dev,
+33 −16
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ static int rmnet_check_skb_can_gro(struct sk_buff *skb)
	return -EPROTONOSUPPORT;
}

static void rmnet_set_skb_proto(struct sk_buff *skb)
void rmnet_set_skb_proto(struct sk_buff *skb)
{
	switch (skb->data[0] & 0xF0) {
	case RMNET_IP_VERSION_4:
@@ -60,6 +60,7 @@ static void rmnet_set_skb_proto(struct sk_buff *skb)
		break;
	}
}
EXPORT_SYMBOL(rmnet_set_skb_proto);

/* Shs hook handler */

@@ -69,7 +70,7 @@ EXPORT_SYMBOL(rmnet_shs_skb_entry);

/* Generic handler */

static void
void
rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port)
{
	struct rmnet_priv *priv = netdev_priv(skb->dev);
@@ -91,6 +92,7 @@ rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port)
	else
		netif_receive_skb(skb);
}
EXPORT_SYMBOL(rmnet_deliver_skb);

/* MAP handler */

@@ -104,7 +106,7 @@ __rmnet_map_ingress_handler(struct sk_buff *skb,

	if (RMNET_MAP_GET_CD_BIT(skb)) {
		if (port->data_format & RMNET_INGRESS_FORMAT_DL_MARKER) {
			if (!rmnet_map_flow_command(skb, port))
			if (!rmnet_map_flow_command(skb, port, false))
				return;
		}

@@ -144,11 +146,14 @@ __rmnet_map_ingress_handler(struct sk_buff *skb,
	kfree_skb(skb);
}

int (*rmnet_perf_deag_entry)(struct sk_buff *skb,
			     struct rmnet_port *port) __rcu __read_mostly;
EXPORT_SYMBOL(rmnet_perf_deag_entry);

static void
rmnet_map_ingress_handler(struct sk_buff *skb,
			  struct rmnet_port *port)
{
	struct sk_buff *skbn;

	if (skb->dev->type == ARPHRD_ETHER) {
		if (pskb_expand_head(skb, ETH_HLEN, 0, GFP_KERNEL)) {
@@ -160,19 +165,30 @@ rmnet_map_ingress_handler(struct sk_buff *skb,
	}

	if (port->data_format & RMNET_FLAGS_INGRESS_DEAGGREGATION) {
		int (*rmnet_perf_core_deaggregate)(struct sk_buff *skb,
						   struct rmnet_port *port);
		/* Deaggregation and freeing of HW originating
		 * buffers is done within here
		 */
		rmnet_perf_core_deaggregate =
					rcu_dereference(rmnet_perf_deag_entry);
		if (rmnet_perf_core_deaggregate) {
			rmnet_perf_core_deaggregate(skb, port);
		} else {
			struct sk_buff *skbn;

			while (skb) {
			struct sk_buff *skb_frag = skb_shinfo(skb)->frag_list;
				struct sk_buff *skb_frag =
						skb_shinfo(skb)->frag_list;

				skb_shinfo(skb)->frag_list = NULL;

				while ((skbn = rmnet_map_deaggregate(skb, port))
					!= NULL)
					__rmnet_map_ingress_handler(skbn, port);

				consume_skb(skb);

				skb = skb_frag;
			}
		}
	} else {
		__rmnet_map_ingress_handler(skb, port);
	}
@@ -269,6 +285,7 @@ rx_handler_result_t rmnet_rx_handler(struct sk_buff **pskb)
done:
	return RX_HANDLER_CONSUMED;
}
EXPORT_SYMBOL(rmnet_rx_handler);

/* Modifies packet as per logical endpoint configuration and egress data format
 * for egress device configured in logical endpoint. Packet is then transmitted
+4 −1
Original line number Diff line number Diff line
@@ -19,7 +19,10 @@
#include "rmnet_config.h"

void rmnet_egress_handler(struct sk_buff *skb);

void rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port);
void rmnet_set_skb_proto(struct sk_buff *skb);
rx_handler_result_t _rmnet_map_ingress_handler(struct sk_buff *skb,
					       struct rmnet_port *port);
rx_handler_result_t rmnet_rx_handler(struct sk_buff **pskb);

#endif /* _RMNET_HANDLERS_H_ */
+7 −1
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@

#ifndef _RMNET_MAP_H_
#define _RMNET_MAP_H_
#include "rmnet_config.h"

struct rmnet_map_control_command {
	u8  command_name;
@@ -131,6 +132,9 @@ struct rmnet_map_dl_ind {
#define RMNET_MAP_GET_LENGTH(Y) (ntohs(((struct rmnet_map_header *) \
					(Y)->data)->pkt_len))

#define RMNET_MAP_DEAGGR_SPACING  64
#define RMNET_MAP_DEAGGR_HEADROOM (RMNET_MAP_DEAGGR_SPACING / 2)

#define RMNET_MAP_COMMAND_REQUEST     0
#define RMNET_MAP_COMMAND_ACK         1
#define RMNET_MAP_COMMAND_UNSUPPORTED 2
@@ -151,7 +155,9 @@ 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);
void rmnet_map_tx_aggregate_exit(struct rmnet_port *port);
int rmnet_map_flow_command(struct sk_buff *skb, struct rmnet_port *port);
int rmnet_map_flow_command(struct sk_buff *skb,
			   struct rmnet_port *port,
			   bool rmnet_perf);
void rmnet_map_cmd_init(struct rmnet_port *port);
int rmnet_map_dl_ind_register(struct rmnet_port *port,
			      struct rmnet_map_dl_ind *dl_ind);
Loading