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

Commit c9132a27 authored by Harout Hedeshian's avatar Harout Hedeshian Committed by Gerrit - the friendly Code Review server
Browse files

net: rmnet_data: In-band flow control



Implement MAP based in-band flow control. Added 2 new configuration
messages to allow adding and deleting flow handles. Added handlers
in VND for flow control events. Added flow control command handler
in rmnet_map_commands.

CRs-fixed: 568534
Change-Id: Ica52e4ad89430c9fa5e2b38e389ee6bc91de2e9b
Signed-off-by: default avatarHarout Hedeshian <harouth@codeaurora.org>
parent 0dcf4ed8
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -66,6 +66,11 @@ struct rmnet_nl_msg_s {
			uint32_t id;
			uint8_t  vnd_name[RMNET_MAX_STR_LEN];
		} vnd;
		struct {
			uint32_t id;
			uint32_t map_flow_id;
			uint32_t tc_flow_id;
		} flow_control;
	};
};

@@ -186,7 +191,24 @@ enum rmnet_netlink_message_types_e {
	 * Args: int32_t node number
	 * Returns: status code
	 */
	RMNET_NETLINK_FREE_VND
	RMNET_NETLINK_FREE_VND,

	/*
	 * RMNET_NETLINK_ADD_VND_TC_FLOW - Add flow control handle on VND
	 * Args: int32_t node number
	 *       uint32_t MAP Flow Handle
	 *       uint32_t TC Flow Handle
	 * Returns: status code
	 */
	RMNET_NETLINK_ADD_VND_TC_FLOW,

	/*
	 * RMNET_NETLINK_DEL_VND_TC_FLOW - Removes flow control handle on VND
	 * Args: int32_t node number
	 *       uint32_t MAP Flow Handle
	 * Returns: status code
	 */
	RMNET_NETLINK_DEL_VND_TC_FLOW
};

enum rmnet_config_endpoint_modes_e {
@@ -205,7 +227,8 @@ enum rmnet_config_return_codes_e {
	RMNET_CONFIG_INVALID_REQUEST,
	RMNET_CONFIG_NO_SUCH_DEVICE,
	RMNET_CONFIG_BAD_ARGUMENTS,
	RMNET_CONFIG_BAD_EGRESS_DEVICE
	RMNET_CONFIG_BAD_EGRESS_DEVICE,
	RMNET_CONFIG_TC_HANDLE_FULL
};

#endif /* _RMNET_DATA_H_ */
+45 −0
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@
#include "rmnet_data_vnd.h"
#include "rmnet_data_private.h"

RMNET_LOG_MODULE(RMNET_DATA_LOGMASK_CONFIG);

/* ***************** Local Definitions and Declarations ********************* */
static struct sock *nl_socket_handle;

@@ -316,6 +318,41 @@ static void _rmnet_netlink_get_vnd_name
	resp_rmnet->arg_length = RMNET_NL_MSG_SIZE(vnd);
}

static void _rmnet_netlink_add_del_vnd_tc_flow
					(uint32_t command,
					 struct rmnet_nl_msg_s *rmnet_header,
					 struct rmnet_nl_msg_s *resp_rmnet)
{
	uint32_t id;
	uint32_t map_flow_id;
	uint32_t tc_flow_id;

	_RMNET_NETLINK_NULL_CHECKS();
	resp_rmnet->crd = RMNET_NETLINK_MSG_RETURNCODE;

	id = rmnet_header->flow_control.id;
	map_flow_id = rmnet_header->flow_control.map_flow_id;
	tc_flow_id = rmnet_header->flow_control.tc_flow_id;

	switch (command) {
	case RMNET_NETLINK_ADD_VND_TC_FLOW:
		resp_rmnet->return_code = rmnet_vnd_add_tc_flow(id,
								map_flow_id,
								tc_flow_id);
		break;
	case RMNET_NETLINK_DEL_VND_TC_FLOW:
		resp_rmnet->return_code = rmnet_vnd_del_tc_flow(id,
								map_flow_id,
								tc_flow_id);
		break;
	default:
		LOGM("%s(): called with unhandled command %d\n",
		     __func__, command);
		resp_rmnet->return_code = RMNET_CONFIG_INVALID_REQUEST;
		break;
	}
}

/**
 * rmnet_config_netlink_msg_handler() - Netlink message handler callback
 * @skb:      Packet containing netlink messages
@@ -418,6 +455,13 @@ void rmnet_config_netlink_msg_handler(struct sk_buff *skb)
		_rmnet_netlink_get_vnd_name(rmnet_header, resp_rmnet);
		break;

	case RMNET_NETLINK_DEL_VND_TC_FLOW:
	case RMNET_NETLINK_ADD_VND_TC_FLOW:
		_rmnet_netlink_add_del_vnd_tc_flow(rmnet_header->message_type,
						   rmnet_header,
						   resp_rmnet);
		break;

	default:
		resp_rmnet->crd = RMNET_NETLINK_MSG_RETURNCODE;
		resp_rmnet->return_code = RMNET_CONFIG_UNKNOWN_MESSAGE;
@@ -425,6 +469,7 @@ void rmnet_config_netlink_msg_handler(struct sk_buff *skb)
	}
	rtnl_unlock();
	nlmsg_unicast(nl_socket_handle, skb_response, return_pid);
	LOGD("%s(): Done processing command\n", __func__);

}

+3 −0
Original line number Diff line number Diff line
@@ -23,6 +23,9 @@
#include "rmnet_data_vnd.h"
#include "rmnet_map.h"

RMNET_LOG_MODULE(RMNET_DATA_LOGMASK_HANDLER);


void rmnet_egress_handler(struct sk_buff *skb,
			  struct rmnet_logical_ep_conf_s *ep);

+4 −0
Original line number Diff line number Diff line
@@ -27,6 +27,10 @@ unsigned int rmnet_data_log_level = RMNET_LOG_LVL_ERR | RMNET_LOG_LVL_HI;
module_param(rmnet_data_log_level, uint,  S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(log_level, "Logging level");

unsigned int rmnet_data_log_module_mask;
module_param(rmnet_data_log_module_mask, uint,  S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(rmnet_data_log_module_mask, "Logging module mask");

/* ***************** Startup/Shutdown *************************************** */

/**
+17 −3
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#define RMNET_ETHERNET_HEADER_LENGTH    14

extern unsigned int rmnet_data_log_level;
extern unsigned int rmnet_data_log_module_mask;

#define RMNET_INIT_OK     0
#define RMNET_INIT_ERROR  1
@@ -32,6 +33,15 @@ extern unsigned int rmnet_data_log_level;
#define RMNET_LOG_LVL_HI  (1<<1)
#define RMNET_LOG_LVL_ERR (1<<0)

#define RMNET_LOG_MODULE(X) \
	static uint32_t rmnet_mod_mask = X

#define RMNET_DATA_LOGMASK_CONFIG  (1<<0)
#define RMNET_DATA_LOGMASK_HANDLER (1<<1)
#define RMNET_DATA_LOGMASK_VND     (1<<2)
#define RMNET_DATA_LOGMASK_MAPD    (1<<3)
#define RMNET_DATA_LOGMASK_MAPC    (1<<4)

#define LOGE(fmt, ...) do { if (rmnet_data_log_level & RMNET_LOG_LVL_ERR) \
			pr_err(fmt, ##__VA_ARGS__); \
			} while (0)
@@ -49,9 +59,13 @@ extern unsigned int rmnet_data_log_level;
			pr_notice(fmt, ##__VA_ARGS__); \
			} while (0)

#define LOGD(fmt, ...) do { if (unlikely \
			(rmnet_data_log_level & RMNET_LOG_LVL_DBG)) \
			pr_debug(fmt, ##__VA_ARGS__); \
/* Don't use pr_debug as it is compiled out of the kernel. We can be sure of
 * minimal impact as LOGD is not enabled by default.
 */
#define LOGD(fmt, ...) do { if (unlikely( \
			    (rmnet_data_log_level & RMNET_LOG_LVL_DBG) \
			    && (rmnet_data_log_module_mask & rmnet_mod_mask))) \
			pr_notice(fmt, ##__VA_ARGS__); \
			} while (0)

#endif /* _RMNET_DATA_PRIVATE_H_ */
Loading