1  /*
2  * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 and
6  * only version 2 as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * RMNET Data configuration specification
14  */
15 
16 #ifndef _RMNET_DATA_H_
17 #define _RMNET_DATA_H_
18 
19 /* ***************** Constants ********************************************** */
20 #define RMNET_LOCAL_LOGICAL_ENDPOINT -1
21 
22 #define RMNET_EGRESS_FORMAT__RESERVED__         (1<<0)
23 #define RMNET_EGRESS_FORMAT_MAP                 (1<<1)
24 #define RMNET_EGRESS_FORMAT_AGGREGATION         (1<<2)
25 #define RMNET_EGRESS_FORMAT_MUXING              (1<<3)
26 #define RMNET_EGRESS_FORMAT_MAP_CKSUMV3         (1<<4)
27 #define RMNET_EGRESS_FORMAT_MAP_CKSUMV4         (1<<5)
28 
29 #define RMNET_INGRESS_FIX_ETHERNET              (1<<0)
30 #define RMNET_INGRESS_FORMAT_MAP                (1<<1)
31 #define RMNET_INGRESS_FORMAT_DEAGGREGATION      (1<<2)
32 #define RMNET_INGRESS_FORMAT_DEMUXING           (1<<3)
33 #define RMNET_INGRESS_FORMAT_MAP_COMMANDS       (1<<4)
34 #define RMNET_INGRESS_FORMAT_MAP_CKSUMV3        (1<<5)
35 #define RMNET_INGRESS_FORMAT_MAP_CKSUMV4        (1<<6)
36 
37 /* ***************** Netlink API ******************************************** */
38 #define RMNET_NETLINK_PROTO 31
39 #define RMNET_MAX_STR_LEN  16
40 #define RMNET_NL_DATA_MAX_LEN 64
41 
42 #define RMNET_NETLINK_MSG_COMMAND    0
43 #define RMNET_NETLINK_MSG_RETURNCODE 1
44 #define RMNET_NETLINK_MSG_RETURNDATA 2
45 
46 struct rmnet_nl_msg_s {
47 	uint16_t reserved;
48 	uint16_t message_type;
49 	uint16_t reserved2:14;
50 	uint16_t crd:2;
51 	union {
52 		uint16_t arg_length;
53 		uint16_t return_code;
54 	};
55 	union {
56 		uint8_t data[RMNET_NL_DATA_MAX_LEN];
57 		struct {
58 			uint8_t  dev[RMNET_MAX_STR_LEN];
59 			uint32_t flags;
60 			uint16_t agg_size;
61 			uint16_t agg_count;
62 			uint8_t  tail_spacing;
63 		} data_format;
64 		struct {
65 			uint8_t dev[RMNET_MAX_STR_LEN];
66 			int32_t ep_id;
67 			uint8_t operating_mode;
68 			uint8_t next_dev[RMNET_MAX_STR_LEN];
69 		} local_ep_config;
70 		struct {
71 			uint32_t id;
72 			uint8_t  vnd_name[RMNET_MAX_STR_LEN];
73 		} vnd;
74 		struct {
75 			uint32_t id;
76 			uint32_t map_flow_id;
77 			uint32_t tc_flow_id;
78 		} flow_control;
79 	};
80 };
81 
82 enum rmnet_netlink_message_types_e {
83 	/*
84 	 * RMNET_NETLINK_ASSOCIATE_NETWORK_DEVICE - Register RMNET data driver
85 	 *                                          on a particular device.
86 	 * Args: char[] dev_name: Null terminated ASCII string, max length: 15
87 	 * Returns: status code
88 	 */
89 	RMNET_NETLINK_ASSOCIATE_NETWORK_DEVICE,
90 
91 	/*
92 	 * RMNET_NETLINK_UNASSOCIATE_NETWORK_DEVICE - Unregister RMNET data
93 	 *                                            driver on a particular
94 	 *                                            device.
95 	 * Args: char[] dev_name: Null terminated ASCII string, max length: 15
96 	 * Returns: status code
97 	 */
98 	RMNET_NETLINK_UNASSOCIATE_NETWORK_DEVICE,
99 
100 	/*
101 	 * RMNET_NETLINK_GET_NETWORK_DEVICE_ASSOCIATED - Get if RMNET data
102 	 *                                            driver is registered on a
103 	 *                                            particular device.
104 	 * Args: char[] dev_name: Null terminated ASCII string, max length: 15
105 	 * Returns: 1 if registered, 0 if not
106 	 */
107 	RMNET_NETLINK_GET_NETWORK_DEVICE_ASSOCIATED,
108 
109 	/*
110 	 * RMNET_NETLINK_SET_LINK_EGRESS_DATA_FORMAT - Sets the egress data
111 	 *                                             format for a particular
112 	 *                                             link.
113 	 * Args: uint32_t egress_flags
114 	 *       char[] dev_name: Null terminated ASCII string, max length: 15
115 	 * Returns: status code
116 	 */
117 	RMNET_NETLINK_SET_LINK_EGRESS_DATA_FORMAT,
118 
119 	/*
120 	 * RMNET_NETLINK_GET_LINK_EGRESS_DATA_FORMAT - Gets the egress data
121 	 *                                             format for a particular
122 	 *                                             link.
123 	 * Args: char[] dev_name: Null terminated ASCII string, max length: 15
124 	 * Returns: 4-bytes data: uint32_t egress_flags
125 	 */
126 	RMNET_NETLINK_GET_LINK_EGRESS_DATA_FORMAT,
127 
128 	/*
129 	 * RMNET_NETLINK_SET_LINK_INGRESS_DATA_FORMAT - Sets the ingress data
130 	 *                                              format for a particular
131 	 *                                              link.
132 	 * Args: uint32_t ingress_flags
133 	 *       char[] dev_name: Null terminated ASCII string, max length: 15
134 	 * Returns: status code
135 	 */
136 	RMNET_NETLINK_SET_LINK_INGRESS_DATA_FORMAT,
137 
138 	/*
139 	 * RMNET_NETLINK_GET_LINK_INGRESS_DATA_FORMAT - Gets the ingress data
140 	 *                                              format for a particular
141 	 *                                              link.
142 	 * Args: char[] dev_name: Null terminated ASCII string, max length: 15
143 	 * Returns: 4-bytes data: uint32_t ingress_flags
144 	 */
145 	RMNET_NETLINK_GET_LINK_INGRESS_DATA_FORMAT,
146 
147 	/*
148 	 * RMNET_NETLINK_SET_LOGICAL_EP_CONFIG - Sets the logical endpoint
149 	 *                                       configuration for a particular
150 	 *                                       link.
151 	 * Args: char[] dev_name: Null terminated ASCII string, max length: 15
152 	 *     int32_t logical_ep_id, valid values are -1 through 31
153 	 *     uint8_t rmnet_mode: one of none, vnd, bridged
154 	 *     char[] egress_dev_name: Egress device if operating in bridge mode
155 	 * Returns: status code
156 	 */
157 	RMNET_NETLINK_SET_LOGICAL_EP_CONFIG,
158 
159 	/*
160 	 * RMNET_NETLINK_UNSET_LOGICAL_EP_CONFIG - Un-sets the logical endpoint
161 	 *                                       configuration for a particular
162 	 *                                       link.
163 	 * Args: char[] dev_name: Null terminated ASCII string, max length: 15
164 	 *       int32_t logical_ep_id, valid values are -1 through 31
165 	 * Returns: status code
166 	 */
167 	RMNET_NETLINK_UNSET_LOGICAL_EP_CONFIG,
168 
169 	/*
170 	 * RMNET_NETLINK_GET_LOGICAL_EP_CONFIG - Gets the logical endpoint
171 	 *                                       configuration for a particular
172 	 *                                       link.
173 	 * Args: char[] dev_name: Null terminated ASCII string, max length: 15
174 	 *        int32_t logical_ep_id, valid values are -1 through 31
175 	 * Returns: uint8_t rmnet_mode: one of none, vnd, bridged
176 	 * char[] egress_dev_name: Egress device
177 	 */
178 	RMNET_NETLINK_GET_LOGICAL_EP_CONFIG,
179 
180 	/*
181 	 * RMNET_NETLINK_NEW_VND - Creates a new virtual network device node
182 	 * Args: int32_t node number
183 	 * Returns: status code
184 	 */
185 	RMNET_NETLINK_NEW_VND,
186 
187 	/*
188 	 * RMNET_NETLINK_NEW_VND_WITH_PREFIX - Creates a new virtual network
189 	 *                                     device node with the specified
190 	 *                                     prefix for the device name
191 	 * Args: int32_t node number
192 	 *       char[] vnd_name - Use as prefix
193 	 * Returns: status code
194 	 */
195 	RMNET_NETLINK_NEW_VND_WITH_PREFIX,
196 
197 	/*
198 	 * RMNET_NETLINK_GET_VND_NAME - Gets the string name of a VND from ID
199 	 * Args: int32_t node number
200 	 * Returns: char[] vnd_name
201 	 */
202 	RMNET_NETLINK_GET_VND_NAME,
203 
204 	/*
205 	 * RMNET_NETLINK_FREE_VND - Removes virtual network device node
206 	 * Args: int32_t node number
207 	 * Returns: status code
208 	 */
209 	RMNET_NETLINK_FREE_VND,
210 
211 	/*
212 	 * RMNET_NETLINK_ADD_VND_TC_FLOW - Add flow control handle on VND
213 	 * Args: int32_t node number
214 	 *       uint32_t MAP Flow Handle
215 	 *       uint32_t TC Flow Handle
216 	 * Returns: status code
217 	 */
218 	RMNET_NETLINK_ADD_VND_TC_FLOW,
219 
220 	/*
221 	 * RMNET_NETLINK_DEL_VND_TC_FLOW - Removes flow control handle on VND
222 	 * Args: int32_t node number
223 	 *       uint32_t MAP Flow Handle
224 	 * Returns: status code
225 	 */
226 	RMNET_NETLINK_DEL_VND_TC_FLOW
227 };
228 
229 enum rmnet_config_endpoint_modes_e {
230 	/* Pass the frame up the stack with no modifications to skb->dev      */
231 	RMNET_EPMODE_NONE,
232 	/* Replace skb->dev to a virtual rmnet device and pass up the stack   */
233 	RMNET_EPMODE_VND,
234 	/* Pass the frame directly to another device with dev_queue_xmit().   */
235 	RMNET_EPMODE_BRIDGE,
236 	/* Must be the last item in the list                                  */
237 	RMNET_EPMODE_LENGTH
238 };
239 
240 enum rmnet_config_return_codes_e {
241 	RMNET_CONFIG_OK,
242 	RMNET_CONFIG_UNKNOWN_MESSAGE,
243 	RMNET_CONFIG_UNKNOWN_ERROR,
244 	RMNET_CONFIG_NOMEM,
245 	RMNET_CONFIG_DEVICE_IN_USE,
246 	RMNET_CONFIG_INVALID_REQUEST,
247 	RMNET_CONFIG_NO_SUCH_DEVICE,
248 	RMNET_CONFIG_BAD_ARGUMENTS,
249 	RMNET_CONFIG_BAD_EGRESS_DEVICE,
250 	RMNET_CONFIG_TC_HANDLE_FULL
251 };
252 
253 #endif /* _RMNET_DATA_H_ */
254