aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>2018-03-21 21:48:14 -0400
committerDavid S. Miller <davem@davemloft.net>2018-03-22 15:00:44 -0400
commit14452ca3b5ce304fb2fea96dbc9ca1e4e7978551 (patch)
treec9320a9f0ceb58d7ab57e7eca9c5b7ea60eaac6f
parent378e25357ac78ad02fbc98bec9b4e3baaa916c5c (diff)
net: qualcomm: rmnet: Export mux_id and flags to netlink
Define new netlink attributes for rmnet mux_id and flags. These flags / mux_id were earlier using vlan flags / id respectively. The flag bits are also moved to uapi and are renamed with prefix RMNET_FLAG_*. Also add the rmnet policy to handle the new netlink attributes. Signed-off-by: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c41
-rw-r--r--drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c10
-rw-r--r--drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c2
-rw-r--r--drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c2
-rw-r--r--drivers/net/ethernet/qualcomm/rmnet/rmnet_private.h6
-rw-r--r--include/uapi/linux/if_link.h21
6 files changed, 53 insertions, 29 deletions
diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c
index 096301a31c4f..c5b7b2af25d8 100644
--- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c
+++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c
@@ -43,6 +43,11 @@
43 43
44/* Local Definitions and Declarations */ 44/* Local Definitions and Declarations */
45 45
46static const struct nla_policy rmnet_policy[IFLA_RMNET_MAX + 1] = {
47 [IFLA_RMNET_MUX_ID] = { .type = NLA_U16 },
48 [IFLA_RMNET_FLAGS] = { .len = sizeof(struct ifla_rmnet_flags) },
49};
50
46static int rmnet_is_real_dev_registered(const struct net_device *real_dev) 51static int rmnet_is_real_dev_registered(const struct net_device *real_dev)
47{ 52{
48 return rcu_access_pointer(real_dev->rx_handler) == rmnet_rx_handler; 53 return rcu_access_pointer(real_dev->rx_handler) == rmnet_rx_handler;
@@ -131,7 +136,7 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev,
131 struct nlattr *tb[], struct nlattr *data[], 136 struct nlattr *tb[], struct nlattr *data[],
132 struct netlink_ext_ack *extack) 137 struct netlink_ext_ack *extack)
133{ 138{
134 u32 data_format = RMNET_INGRESS_FORMAT_DEAGGREGATION; 139 u32 data_format = RMNET_FLAGS_INGRESS_DEAGGREGATION;
135 struct net_device *real_dev; 140 struct net_device *real_dev;
136 int mode = RMNET_EPMODE_VND; 141 int mode = RMNET_EPMODE_VND;
137 struct rmnet_endpoint *ep; 142 struct rmnet_endpoint *ep;
@@ -143,14 +148,14 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev,
143 if (!real_dev || !dev) 148 if (!real_dev || !dev)
144 return -ENODEV; 149 return -ENODEV;
145 150
146 if (!data[IFLA_VLAN_ID]) 151 if (!data[IFLA_RMNET_MUX_ID])
147 return -EINVAL; 152 return -EINVAL;
148 153
149 ep = kzalloc(sizeof(*ep), GFP_ATOMIC); 154 ep = kzalloc(sizeof(*ep), GFP_ATOMIC);
150 if (!ep) 155 if (!ep)
151 return -ENOMEM; 156 return -ENOMEM;
152 157
153 mux_id = nla_get_u16(data[IFLA_VLAN_ID]); 158 mux_id = nla_get_u16(data[IFLA_RMNET_MUX_ID]);
154 159
155 err = rmnet_register_real_device(real_dev); 160 err = rmnet_register_real_device(real_dev);
156 if (err) 161 if (err)
@@ -165,10 +170,10 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev,
165 170
166 hlist_add_head_rcu(&ep->hlnode, &port->muxed_ep[mux_id]); 171 hlist_add_head_rcu(&ep->hlnode, &port->muxed_ep[mux_id]);
167 172
168 if (data[IFLA_VLAN_FLAGS]) { 173 if (data[IFLA_RMNET_FLAGS]) {
169 struct ifla_vlan_flags *flags; 174 struct ifla_rmnet_flags *flags;
170 175
171 flags = nla_data(data[IFLA_VLAN_FLAGS]); 176 flags = nla_data(data[IFLA_RMNET_FLAGS]);
172 data_format = flags->flags & flags->mask; 177 data_format = flags->flags & flags->mask;
173 } 178 }
174 179
@@ -276,10 +281,10 @@ static int rmnet_rtnl_validate(struct nlattr *tb[], struct nlattr *data[],
276{ 281{
277 u16 mux_id; 282 u16 mux_id;
278 283
279 if (!data || !data[IFLA_VLAN_ID]) 284 if (!data || !data[IFLA_RMNET_MUX_ID])
280 return -EINVAL; 285 return -EINVAL;
281 286
282 mux_id = nla_get_u16(data[IFLA_VLAN_ID]); 287 mux_id = nla_get_u16(data[IFLA_RMNET_MUX_ID]);
283 if (mux_id > (RMNET_MAX_LOGICAL_EP - 1)) 288 if (mux_id > (RMNET_MAX_LOGICAL_EP - 1))
284 return -ERANGE; 289 return -ERANGE;
285 290
@@ -304,8 +309,8 @@ static int rmnet_changelink(struct net_device *dev, struct nlattr *tb[],
304 309
305 port = rmnet_get_port_rtnl(real_dev); 310 port = rmnet_get_port_rtnl(real_dev);
306 311
307 if (data[IFLA_VLAN_ID]) { 312 if (data[IFLA_RMNET_MUX_ID]) {
308 mux_id = nla_get_u16(data[IFLA_VLAN_ID]); 313 mux_id = nla_get_u16(data[IFLA_RMNET_MUX_ID]);
309 ep = rmnet_get_endpoint(port, priv->mux_id); 314 ep = rmnet_get_endpoint(port, priv->mux_id);
310 315
311 hlist_del_init_rcu(&ep->hlnode); 316 hlist_del_init_rcu(&ep->hlnode);
@@ -315,10 +320,10 @@ static int rmnet_changelink(struct net_device *dev, struct nlattr *tb[],
315 priv->mux_id = mux_id; 320 priv->mux_id = mux_id;
316 } 321 }
317 322
318 if (data[IFLA_VLAN_FLAGS]) { 323 if (data[IFLA_RMNET_FLAGS]) {
319 struct ifla_vlan_flags *flags; 324 struct ifla_rmnet_flags *flags;
320 325
321 flags = nla_data(data[IFLA_VLAN_FLAGS]); 326 flags = nla_data(data[IFLA_RMNET_FLAGS]);
322 port->data_format = flags->flags & flags->mask; 327 port->data_format = flags->flags & flags->mask;
323 } 328 }
324 329
@@ -327,13 +332,16 @@ static int rmnet_changelink(struct net_device *dev, struct nlattr *tb[],
327 332
328static size_t rmnet_get_size(const struct net_device *dev) 333static size_t rmnet_get_size(const struct net_device *dev)
329{ 334{
330 return nla_total_size(2) /* IFLA_VLAN_ID */ + 335 return
331 nla_total_size(sizeof(struct ifla_vlan_flags)); /* IFLA_VLAN_FLAGS */ 336 /* IFLA_RMNET_MUX_ID */
337 nla_total_size(2) +
338 /* IFLA_RMNET_FLAGS */
339 nla_total_size(sizeof(struct ifla_rmnet_flags));
332} 340}
333 341
334struct rtnl_link_ops rmnet_link_ops __read_mostly = { 342struct rtnl_link_ops rmnet_link_ops __read_mostly = {
335 .kind = "rmnet", 343 .kind = "rmnet",
336 .maxtype = __IFLA_VLAN_MAX, 344 .maxtype = __IFLA_RMNET_MAX,
337 .priv_size = sizeof(struct rmnet_priv), 345 .priv_size = sizeof(struct rmnet_priv),
338 .setup = rmnet_vnd_setup, 346 .setup = rmnet_vnd_setup,
339 .validate = rmnet_rtnl_validate, 347 .validate = rmnet_rtnl_validate,
@@ -341,6 +349,7 @@ struct rtnl_link_ops rmnet_link_ops __read_mostly = {
341 .dellink = rmnet_dellink, 349 .dellink = rmnet_dellink,
342 .get_size = rmnet_get_size, 350 .get_size = rmnet_get_size,
343 .changelink = rmnet_changelink, 351 .changelink = rmnet_changelink,
352 .policy = rmnet_policy,
344}; 353};
345 354
346/* Needs either rcu_read_lock() or rtnl lock */ 355/* Needs either rcu_read_lock() or rtnl lock */
diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c
index c758248bf2cd..6fcd586e9804 100644
--- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c
+++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c
@@ -70,7 +70,7 @@ __rmnet_map_ingress_handler(struct sk_buff *skb,
70 u8 mux_id; 70 u8 mux_id;
71 71
72 if (RMNET_MAP_GET_CD_BIT(skb)) { 72 if (RMNET_MAP_GET_CD_BIT(skb)) {
73 if (port->data_format & RMNET_INGRESS_FORMAT_MAP_COMMANDS) 73 if (port->data_format & RMNET_FLAGS_INGRESS_MAP_COMMANDS)
74 return rmnet_map_command(skb, port); 74 return rmnet_map_command(skb, port);
75 75
76 goto free_skb; 76 goto free_skb;
@@ -93,7 +93,7 @@ __rmnet_map_ingress_handler(struct sk_buff *skb,
93 skb_pull(skb, sizeof(struct rmnet_map_header)); 93 skb_pull(skb, sizeof(struct rmnet_map_header));
94 rmnet_set_skb_proto(skb); 94 rmnet_set_skb_proto(skb);
95 95
96 if (port->data_format & RMNET_INGRESS_FORMAT_MAP_CKSUMV4) { 96 if (port->data_format & RMNET_FLAGS_INGRESS_MAP_CKSUMV4) {
97 if (!rmnet_map_checksum_downlink_packet(skb, len + pad)) 97 if (!rmnet_map_checksum_downlink_packet(skb, len + pad))
98 skb->ip_summed = CHECKSUM_UNNECESSARY; 98 skb->ip_summed = CHECKSUM_UNNECESSARY;
99 } 99 }
@@ -121,7 +121,7 @@ rmnet_map_ingress_handler(struct sk_buff *skb,
121 skb_push(skb, ETH_HLEN); 121 skb_push(skb, ETH_HLEN);
122 } 122 }
123 123
124 if (port->data_format & RMNET_INGRESS_FORMAT_DEAGGREGATION) { 124 if (port->data_format & RMNET_FLAGS_INGRESS_DEAGGREGATION) {
125 while ((skbn = rmnet_map_deaggregate(skb, port)) != NULL) 125 while ((skbn = rmnet_map_deaggregate(skb, port)) != NULL)
126 __rmnet_map_ingress_handler(skbn, port); 126 __rmnet_map_ingress_handler(skbn, port);
127 127
@@ -141,7 +141,7 @@ static int rmnet_map_egress_handler(struct sk_buff *skb,
141 additional_header_len = 0; 141 additional_header_len = 0;
142 required_headroom = sizeof(struct rmnet_map_header); 142 required_headroom = sizeof(struct rmnet_map_header);
143 143
144 if (port->data_format & RMNET_EGRESS_FORMAT_MAP_CKSUMV4) { 144 if (port->data_format & RMNET_FLAGS_EGRESS_MAP_CKSUMV4) {
145 additional_header_len = sizeof(struct rmnet_map_ul_csum_header); 145 additional_header_len = sizeof(struct rmnet_map_ul_csum_header);
146 required_headroom += additional_header_len; 146 required_headroom += additional_header_len;
147 } 147 }
@@ -151,7 +151,7 @@ static int rmnet_map_egress_handler(struct sk_buff *skb,
151 goto fail; 151 goto fail;
152 } 152 }
153 153
154 if (port->data_format & RMNET_EGRESS_FORMAT_MAP_CKSUMV4) 154 if (port->data_format & RMNET_FLAGS_EGRESS_MAP_CKSUMV4)
155 rmnet_map_checksum_uplink_packet(skb, orig_dev); 155 rmnet_map_checksum_uplink_packet(skb, orig_dev);
156 156
157 map_header = rmnet_map_add_map_header(skb, additional_header_len, 0); 157 map_header = rmnet_map_add_map_header(skb, additional_header_len, 0);
diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c
index afa2b862515f..78fdad0c6f76 100644
--- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c
+++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c
@@ -69,7 +69,7 @@ static void rmnet_map_send_ack(struct sk_buff *skb,
69 struct rmnet_map_control_command *cmd; 69 struct rmnet_map_control_command *cmd;
70 int xmit_status; 70 int xmit_status;
71 71
72 if (port->data_format & RMNET_INGRESS_FORMAT_MAP_CKSUMV4) { 72 if (port->data_format & RMNET_FLAGS_INGRESS_MAP_CKSUMV4) {
73 if (skb->len < sizeof(struct rmnet_map_header) + 73 if (skb->len < sizeof(struct rmnet_map_header) +
74 RMNET_MAP_GET_LENGTH(skb) + 74 RMNET_MAP_GET_LENGTH(skb) +
75 sizeof(struct rmnet_map_dl_csum_trailer)) { 75 sizeof(struct rmnet_map_dl_csum_trailer)) {
diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c
index e8f6c79157be..a6ea09416f8d 100644
--- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c
+++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c
@@ -309,7 +309,7 @@ struct sk_buff *rmnet_map_deaggregate(struct sk_buff *skb,
309 maph = (struct rmnet_map_header *)skb->data; 309 maph = (struct rmnet_map_header *)skb->data;
310 packet_len = ntohs(maph->pkt_len) + sizeof(struct rmnet_map_header); 310 packet_len = ntohs(maph->pkt_len) + sizeof(struct rmnet_map_header);
311 311
312 if (port->data_format & RMNET_INGRESS_FORMAT_MAP_CKSUMV4) 312 if (port->data_format & RMNET_FLAGS_INGRESS_MAP_CKSUMV4)
313 packet_len += sizeof(struct rmnet_map_dl_csum_trailer); 313 packet_len += sizeof(struct rmnet_map_dl_csum_trailer);
314 314
315 if (((int)skb->len - (int)packet_len) < 0) 315 if (((int)skb->len - (int)packet_len) < 0)
diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_private.h b/drivers/net/ethernet/qualcomm/rmnet/rmnet_private.h
index 98365efc2d9a..b9cc4f85f229 100644
--- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_private.h
+++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_private.h
@@ -18,12 +18,6 @@
18#define RMNET_NEEDED_HEADROOM 16 18#define RMNET_NEEDED_HEADROOM 16
19#define RMNET_TX_QUEUE_LEN 1000 19#define RMNET_TX_QUEUE_LEN 1000
20 20
21/* Constants */
22#define RMNET_INGRESS_FORMAT_DEAGGREGATION BIT(0)
23#define RMNET_INGRESS_FORMAT_MAP_COMMANDS BIT(1)
24#define RMNET_INGRESS_FORMAT_MAP_CKSUMV4 BIT(2)
25#define RMNET_EGRESS_FORMAT_MAP_CKSUMV4 BIT(3)
26
27/* Replace skb->dev to a virtual rmnet device and pass up the stack */ 21/* Replace skb->dev to a virtual rmnet device and pass up the stack */
28#define RMNET_EPMODE_VND (1) 22#define RMNET_EPMODE_VND (1)
29/* Pass the frame directly to another device with dev_queue_xmit() */ 23/* Pass the frame directly to another device with dev_queue_xmit() */
diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
index 11d0c0ea2bfa..68699f654118 100644
--- a/include/uapi/linux/if_link.h
+++ b/include/uapi/linux/if_link.h
@@ -959,4 +959,25 @@ enum {
959 959
960#define IFLA_TUN_MAX (__IFLA_TUN_MAX - 1) 960#define IFLA_TUN_MAX (__IFLA_TUN_MAX - 1)
961 961
962/* rmnet section */
963
964#define RMNET_FLAGS_INGRESS_DEAGGREGATION (1U << 0)
965#define RMNET_FLAGS_INGRESS_MAP_COMMANDS (1U << 1)
966#define RMNET_FLAGS_INGRESS_MAP_CKSUMV4 (1U << 2)
967#define RMNET_FLAGS_EGRESS_MAP_CKSUMV4 (1U << 3)
968
969enum {
970 IFLA_RMNET_UNSPEC,
971 IFLA_RMNET_MUX_ID,
972 IFLA_RMNET_FLAGS,
973 __IFLA_RMNET_MAX,
974};
975
976#define IFLA_RMNET_MAX (__IFLA_RMNET_MAX - 1)
977
978struct ifla_rmnet_flags {
979 __u32 flags;
980 __u32 mask;
981};
982
962#endif /* _UAPI_LINUX_IF_LINK_H */ 983#endif /* _UAPI_LINUX_IF_LINK_H */