net: qualcomm: rmnet: Updates 2018-03-12
Subsystems (3)
v4 cover net: qualcomm: rmnet: Updates 2018-03-12
This series contains some minor updates for rmnet driver.
Patch 1 contains fixes for sparse warnings.
Patch 2 updates the copyright date to 2018.
Patch 3 is a cleanup in receive path.
Patch 4 has the new rmnet netlink attributes in uapi and updates the usage. Patch 5 has the implementation of the fill_info operation.
v1->v2: Remove the force casts since the data type is changed to __be types as mentioned by David.v2->v3: Update copyright in files which actually had changes as mentioned by Joe.v3->v4: Add new netlink attributes for mux_id and flags instead of using the the vlan attributes as mentioned by David. The rmnet specific flags are also moved to uapi. The netlink updates are done as part of #4 and #5 has the fill_info operation.
Subash Abhinov Kasiviswanathan (5):
net: qualcomm: rmnet: Fix casting issues
net: qualcomm: rmnet: Update copyright year to 2018
net: qualcomm: rmnet: Remove unnecessary device assignment
net: qualcomm: rmnet: Export mux_id and flags to netlink
net: qualcomm: rmnet: Implement fill_info
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 73 +++++++++++++++++----- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h | 2 +- .../net/ethernet/qualcomm/rmnet/rmnet_handlers.c | 12 ++-- drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h | 8 +-- .../ethernet/qualcomm/rmnet/rmnet_map_command.c | 4 +- .../net/ethernet/qualcomm/rmnet/rmnet_map_data.c | 5 +- .../net/ethernet/qualcomm/rmnet/rmnet_private.h | 8 +-- drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c | 2 +- include/uapi/linux/if_link.h | 21 +++++++ 9 files changed, 94 insertions(+), 41 deletions(-)
Signature · 1 line
1.9.1
PATCH v4 1/5 net: qualcomm: rmnet: Fix casting issues
Fix warnings which were reported when running with sparse (make C=1 CF=-D__CHECK_ENDIAN__)
drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c:81:15:
warning: cast to restricted __be16 drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c:271:37:
warning: incorrect type in assignment (different base types) expected unsigned short [unsigned] [usertype] pkt_len got restricted __be16 [usertype] <noident> drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c:287:29:
warning: incorrect type in assignment (different base types) expected unsigned short [unsigned] [usertype] pkt_len got restricted __be16 [usertype] <noident> drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c:310:22:
warning: cast to restricted __be16 drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c:319:13:
warning: cast to restricted __be16 drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c:49:18:
warning: cast to restricted __be16 drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c:50:18:
warning: cast to restricted __be32 drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c:74:21:
warning: cast to restricted __be16
--- drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h +3 -3
@@ -23,8 +23,8 @@ struct rmnet_map_control_command {struct {u16 ip_family:2 ;u16 reserved:14 ; -u16 flow_control_seq_num; -u32 qos_id; +__be16 flow_control_seq_num; +__be32 qos_id; } flow_control;u8 data[0 ]; };
@@ -44,7 +44,7 @@ struct rmnet_map_header { u8 reserved_bit:1; u8 cd_bit:1;u8 mux_id; -u16 pkt_len; +__be16 pkt_len; }__aligned(1) ;struct rmnet_map_dl_csum_trailer {
Signature · 1 line
1.9.1
PATCH v4 2/5 net: qualcomm: rmnet: Update copyright year to 2018
In reply to Subash Abhinov Kasiviswanathan--- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 2 +- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h | 2 +- drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c | 2 +- drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h | 2 +- drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c | 2 +- drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c | 2 +- drivers/net/ethernet/qualcomm/rmnet/rmnet_private.h | 2 +- drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-)
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +1 -1
@@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h +1 -1
@@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, 2016-2017 The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2014, 2016-2018 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and
drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c +1 -1
@@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and
drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h +1 -1
@@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and
drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c +1 -1
@@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and
drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c +1 -1
@@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and
drivers/net/ethernet/qualcomm/rmnet/rmnet_private.h +1 -1
@@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, 2016-2017 The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2014, 2016-2018 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and
drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c +1 -1
@@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and
Signature · 1 line
1.9.1
PATCH v4 3/5 net: qualcomm: rmnet: Remove unnecessary device assignment
In reply to Subash Abhinov KasiviswanathanDevice of the de-aggregated skb is correctly assigned after inspecting the mux_id, so remove the assignment in rmnet_map_deaggregate().
--- drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c +0 -1
@@ -323,7 +323,6 @@ struct sk_buff *rmnet_map_deaggregate(struct sk_buff *skb,if (!skbn)return NULL ; - skbn->dev = skb->dev;skb_reserve (skbn,RMNET_MAP_DEAGGR_HEADROOM );skb_put (skbn, packet_len);memcpy (skbn->data, skb->data, packet_len);
Signature · 1 line
1.9.1
PATCH v4 4/5 net: qualcomm: rmnet: Export mux_id and flags to netlink
In reply to Subash Abhinov KasiviswanathanDefine 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.
--- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 41 +++++++++++++--------- .../net/ethernet/qualcomm/rmnet/rmnet_handlers.c | 10 +++--- .../ethernet/qualcomm/rmnet/rmnet_map_command.c | 2 +- .../net/ethernet/qualcomm/rmnet/rmnet_map_data.c | 2 +- .../net/ethernet/qualcomm/rmnet/rmnet_private.h | 6 ---- include/uapi/linux/if_link.h | 21 +++++++++++ 6 files changed, 53 insertions(+), 29 deletions(-)
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +25 -16
@@ -43,6 +43,11 @@/* Local Definitions and Declarations */ +static const struct nla_policy rmnet_policy[IFLA_RMNET_MAX +1 ] = { + [IFLA_RMNET_MUX_ID ] = { .type =NLA_U16 }, + [IFLA_RMNET_FLAGS ] = { .len =sizeof (struct ifla_rmnet_flags ) }, +}; +static int rmnet_is_real_dev_registered (const struct net_device *real_dev) {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, struct nlattr *tb[], struct nlattr *data[], struct netlink_ext_ack *extack) { - u32 data_format = RMNET_INGRESS_FORMAT_DEAGGREGATION; + u32 data_format = RMNET_FLAGS_INGRESS_DEAGGREGATION;struct net_device *real_dev;int mode =RMNET_EPMODE_VND ;struct rmnet_endpoint *ep;
@@ -143,14 +148,14 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev,if (!real_dev || !dev)return -ENODEV ; -if (!data[IFLA_VLAN_ID ]) +if (!data[IFLA_RMNET_MUX_ID ])return -EINVAL ; ep =kzalloc (sizeof (*ep),GFP_ATOMIC );if (!ep)return -ENOMEM ; - mux_id =nla_get_u16 (data[IFLA_VLAN_ID ]); + mux_id =nla_get_u16 (data[IFLA_RMNET_MUX_ID ]); err =rmnet_register_real_device (real_dev);if (err)
@@ -165,10 +170,10 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev,hlist_add_head_rcu (&ep->hlnode, &port->muxed_ep[mux_id]); -if (data[IFLA_VLAN_FLAGS ]) { -struct ifla_vlan_flags *flags; +if (data[IFLA_RMNET_FLAGS ]) { +struct ifla_rmnet_flags *flags; - flags =nla_data (data[IFLA_VLAN_FLAGS ]); + flags =nla_data (data[IFLA_RMNET_FLAGS ]); data_format = flags->flags & flags->mask; }
@@ -276,10 +281,10 @@ static int rmnet_rtnl_validate(struct nlattr *tb[], struct nlattr *data[], {u16 mux_id; -if (!data || !data[IFLA_VLAN_ID ]) +if (!data || !data[IFLA_RMNET_MUX_ID ])return -EINVAL ; - mux_id =nla_get_u16 (data[IFLA_VLAN_ID ]); + mux_id =nla_get_u16 (data[IFLA_RMNET_MUX_ID ]);if (mux_id > (RMNET_MAX_LOGICAL_EP -1 ))return -ERANGE ;
@@ -304,8 +309,8 @@ static int rmnet_changelink(struct net_device *dev, struct nlattr *tb[], port =rmnet_get_port_rtnl (real_dev); -if (data[IFLA_VLAN_ID ]) { - mux_id =nla_get_u16 (data[IFLA_VLAN_ID ]); +if (data[IFLA_RMNET_MUX_ID ]) { + mux_id =nla_get_u16 (data[IFLA_RMNET_MUX_ID ]); ep =rmnet_get_endpoint (port, priv->mux_id);hlist_del_init_rcu (&ep->hlnode);
@@ -315,10 +320,10 @@ static int rmnet_changelink(struct net_device *dev, struct nlattr *tb[], priv->mux_id = mux_id; } -if (data[IFLA_VLAN_FLAGS ]) { -struct ifla_vlan_flags *flags; +if (data[IFLA_RMNET_FLAGS ]) { +struct ifla_rmnet_flags *flags; - flags =nla_data (data[IFLA_VLAN_FLAGS ]); + flags =nla_data (data[IFLA_RMNET_FLAGS ]); port->data_format = flags->flags & flags->mask; }
@@ -327,13 +332,16 @@ static int rmnet_changelink(struct net_device *dev, struct nlattr *tb[],static size_t rmnet_get_size (const struct net_device *dev) { -return nla_total_size (2 )/* IFLA_VLAN_ID */ + -nla_total_size (sizeof (struct ifla_vlan_flags ));/* IFLA_VLAN_FLAGS */ +return +/* IFLA_RMNET_MUX_ID */ +nla_total_size (2 ) + +/* IFLA_RMNET_FLAGS */ +nla_total_size (sizeof (struct ifla_rmnet_flags )); }struct rtnl_link_ops rmnet_link_ops__read_mostly = { .kind ="rmnet" , - .maxtype = __IFLA_VLAN_MAX, + .maxtype = __IFLA_RMNET_MAX, .priv_size =sizeof (struct rmnet_priv ), .setup = rmnet_vnd_setup, .validate = rmnet_rtnl_validate,
@@ -341,6 +349,7 @@ struct rtnl_link_ops rmnet_link_ops __read_mostly = { .dellink = rmnet_dellink, .get_size = rmnet_get_size, .changelink = rmnet_changelink, + .policy = rmnet_policy, };/* Needs either rcu_read_lock() or rtnl lock */
drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c +5 -5
@@ -70,7 +70,7 @@ static void rmnet_set_skb_proto(struct sk_buff *skb)u8 mux_id;if (RMNET_MAP_GET_CD_BIT (skb)) { -if (port->data_format &RMNET_INGRESS_FORMAT_MAP_COMMANDS ) +if (port->data_format &RMNET_FLAGS_INGRESS_MAP_COMMANDS )return rmnet_map_command (skb, port); goto free_skb;
@@ -93,7 +93,7 @@ static void rmnet_set_skb_proto(struct sk_buff *skb)skb_pull (skb,sizeof (struct rmnet_map_header ));rmnet_set_skb_proto (skb); -if (port->data_format &RMNET_INGRESS_FORMAT_MAP_CKSUMV4 ) { +if (port->data_format &RMNET_FLAGS_INGRESS_MAP_CKSUMV4 ) {if (!rmnet_map_checksum_downlink_packet (skb, len + pad)) skb->ip_summed =CHECKSUM_UNNECESSARY ; }
@@ -121,7 +121,7 @@ static void rmnet_set_skb_proto(struct sk_buff *skb)skb_push (skb,ETH_HLEN ); } -if (port->data_format &RMNET_INGRESS_FORMAT_DEAGGREGATION ) { +if (port->data_format &RMNET_FLAGS_INGRESS_DEAGGREGATION ) {while ((skbn =rmnet_map_deaggregate (skb, port)) !=NULL )__rmnet_map_ingress_handler (skbn, port);
@@ -141,7 +141,7 @@ static int rmnet_map_egress_handler(struct sk_buff *skb, additional_header_len =0 ; required_headroom =sizeof (struct rmnet_map_header ); -if (port->data_format &RMNET_EGRESS_FORMAT_MAP_CKSUMV4 ) { +if (port->data_format &RMNET_FLAGS_EGRESS_MAP_CKSUMV4 ) { additional_header_len =sizeof (struct rmnet_map_ul_csum_header ); required_headroom += additional_header_len; }
@@ -151,7 +151,7 @@ static int rmnet_map_egress_handler(struct sk_buff *skb, goto fail; } -if (port->data_format &RMNET_EGRESS_FORMAT_MAP_CKSUMV4 ) +if (port->data_format &RMNET_FLAGS_EGRESS_MAP_CKSUMV4 )rmnet_map_checksum_uplink_packet (skb, orig_dev); map_header =rmnet_map_add_map_header (skb, additional_header_len,0 );
drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c +1 -1
@@ -69,7 +69,7 @@ static void rmnet_map_send_ack(struct sk_buff *skb,struct rmnet_map_control_command *cmd;int xmit_status; -if (port->data_format &RMNET_INGRESS_FORMAT_MAP_CKSUMV4 ) { +if (port->data_format &RMNET_FLAGS_INGRESS_MAP_CKSUMV4 ) {if (skb->len <sizeof (struct rmnet_map_header ) +RMNET_MAP_GET_LENGTH (skb) +sizeof (struct rmnet_map_dl_csum_trailer )) {
drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c +1 -1
@@ -309,7 +309,7 @@ struct sk_buff *rmnet_map_deaggregate(struct sk_buff *skb, maph = (struct rmnet_map_header *)skb->data; packet_len =ntohs (maph->pkt_len) +sizeof (struct rmnet_map_header ); -if (port->data_format &RMNET_INGRESS_FORMAT_MAP_CKSUMV4 ) +if (port->data_format &RMNET_FLAGS_INGRESS_MAP_CKSUMV4 ) packet_len +=sizeof (struct rmnet_map_dl_csum_trailer );if (((int )skb->len - (int )packet_len) <0 )
drivers/net/ethernet/qualcomm/rmnet/rmnet_private.h +0 -6
@@ -18,12 +18,6 @@#define RMNET_NEEDED_HEADROOM 16#define RMNET_TX_QUEUE_LEN 1000 -/* Constants */ -#define RMNET_INGRESS_FORMAT_DEAGGREGATION BIT(0) -#define RMNET_INGRESS_FORMAT_MAP_COMMANDS BIT(1) -#define RMNET_INGRESS_FORMAT_MAP_CKSUMV4 BIT(2) -#define RMNET_EGRESS_FORMAT_MAP_CKSUMV4 BIT(3) -/* Replace skb->dev to a virtual rmnet device and pass up the stack */ #define RMNET_EPMODE_VND (1)/* Pass the frame directly to another device with dev_queue_xmit() */
include/uapi/linux/if_link.h +21 -0
@@ -959,4 +959,25 @@ enum {#define IFLA_TUN_MAX (__IFLA_TUN_MAX - 1) +/* rmnet section */ + +#define RMNET_FLAGS_INGRESS_DEAGGREGATION (1U << 0) +#define RMNET_FLAGS_INGRESS_MAP_COMMANDS (1U << 1) +#define RMNET_FLAGS_INGRESS_MAP_CKSUMV4 (1U << 2) +#define RMNET_FLAGS_EGRESS_MAP_CKSUMV4 (1U << 3) + +enum { +IFLA_RMNET_UNSPEC , +IFLA_RMNET_MUX_ID , +IFLA_RMNET_FLAGS , + __IFLA_RMNET_MAX, +}; + +#define IFLA_RMNET_MAX (__IFLA_RMNET_MAX - 1) + +struct ifla_rmnet_flags { +__u32 flags; +__u32 mask; +}; +#endif /* _UAPI_LINUX_IF_LINK_H */
Signature · 1 line
1.9.1
PATCH v4 5/5 net: qualcomm: rmnet: Implement fill_info
In reply to Subash Abhinov KasiviswanathanThis is needed to query the mux_id and flags of a rmnet device.
--- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 30 ++++++++++++++++++++++ 1 file changed, 30 insertions(+)
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +30 -0
@@ -339,6 +339,35 @@ static size_t rmnet_get_size(const struct net_device *dev)nla_total_size (sizeof (struct ifla_rmnet_flags )); } +static int rmnet_fill_info (struct sk_buff *skb,const struct net_device *dev) +{ +struct rmnet_priv *priv =netdev_priv (dev); +struct net_device *real_dev; +struct ifla_rmnet_flags f; +struct rmnet_port *port; + + real_dev = priv->real_dev; + +if (!rmnet_is_real_dev_registered (real_dev)) +return -ENODEV ; + +if (nla_put_u16 (skb,IFLA_RMNET_MUX_ID , priv->mux_id)) + goto nla_put_failure; + + port =rmnet_get_port_rtnl (real_dev); + + f.flags = port->data_format; + f.mask = ~0 ; + +if (nla_put (skb,IFLA_RMNET_FLAGS ,sizeof (f), &f)) + goto nla_put_failure; + +return 0 ; + +nla_put_failure: +return -EMSGSIZE ; +} +struct rtnl_link_ops rmnet_link_ops__read_mostly = { .kind ="rmnet" , .maxtype = __IFLA_RMNET_MAX,
@@ -350,6 +379,7 @@ struct rtnl_link_ops rmnet_link_ops __read_mostly = { .get_size = rmnet_get_size, .changelink = rmnet_changelink, .policy = rmnet_policy, + .fill_info = rmnet_fill_info, };/* Needs either rcu_read_lock() or rtnl lock */
Signature · 1 line
1.9.1
David Miller
maintainerFrom: Subash Abhinov Kasiviswanathan <[email protected]>
Date: Wed, 21 Mar 2018 19:48:10 -0600
Quoted 8 lines
This series contains some minor updates for rmnet driver.
Patch 1 contains fixes for sparse warnings.
Patch 2 updates the copyright date to 2018.
Patch 3 is a cleanup in receive path.
Patch 4 has the new rmnet netlink attributes in uapi and updates the usage. Patch 5 has the implementation of thefill_infooperation.
Quoted 8 lines
v1->v2: Remove the force casts since the data type is changed to__betypes as mentioned by David.v2->v3: Update copyright in files which actually had changes as mentioned by Joe.v3->v4: Add new netlink attributes formux_idand flags instead of using the the vlan attributes as mentioned by David. The rmnet specific flags are also moved to uapi. The netlink updates are done as part of #4 and #5 has thefill_infooperation.
Series applied, thanks.