Skip to content

Commit

Permalink
net: qualcomm: rmnet: Export mux_id and flags to netlink
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Subash Abhinov Kasiviswanathan authored and davem330 committed Mar 22, 2018
1 parent 378e253 commit 14452ca
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 29 deletions.
41 changes: 25 additions & 16 deletions drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand All @@ -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;
}

Expand Down Expand Up @@ -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;

Expand All @@ -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);
Expand All @@ -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;
}

Expand All @@ -327,20 +332,24 @@ 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,
.newlink = rmnet_newlink,
.dellink = rmnet_dellink,
.get_size = rmnet_get_size,
.changelink = rmnet_changelink,
.policy = rmnet_policy,
};

/* Needs either rcu_read_lock() or rtnl lock */
Expand Down
10 changes: 5 additions & 5 deletions drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ __rmnet_map_ingress_handler(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;
Expand All @@ -93,7 +93,7 @@ __rmnet_map_ingress_handler(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;
}
Expand Down Expand Up @@ -121,7 +121,7 @@ rmnet_map_ingress_handler(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);

Expand All @@ -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;
}
Expand All @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
6 changes: 0 additions & 6 deletions drivers/net/ethernet/qualcomm/rmnet/rmnet_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -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() */
Expand Down
21 changes: 21 additions & 0 deletions include/uapi/linux/if_link.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

0 comments on commit 14452ca

Please sign in to comment.