Commit 53a0ef86 authored by Wolfgang Grandegger's avatar Wolfgang Grandegger Committed by David S. Miller
Browse files

can: fix WARN_ON dump in net/core/rtnetlink.c:rtmsg_ifinfo()



On older kernels, e.g. 2.6.27, a WARN_ON dump in rtmsg_ifinfo()
is thrown when the CAN device is registered due to insufficient
skb space, as reported by various users. This patch adds the
rtnl_link_ops "get_size" to fix the problem. I think this patch
is required for more recent kernels as well, even if no WARN_ON
dumps are triggered. Maybe we also need "get_xstats_size" for
the CAN xstats.
Signed-off-by: default avatarWolfgang Grandegger <wg@grandegger.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6755aeba
...@@ -589,6 +589,22 @@ static int can_changelink(struct net_device *dev, ...@@ -589,6 +589,22 @@ static int can_changelink(struct net_device *dev,
return 0; return 0;
} }
static size_t can_get_size(const struct net_device *dev)
{
struct can_priv *priv = netdev_priv(dev);
size_t size;
size = nla_total_size(sizeof(u32)); /* IFLA_CAN_STATE */
size += sizeof(struct can_ctrlmode); /* IFLA_CAN_CTRLMODE */
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_RESTART_MS */
size += sizeof(struct can_bittiming); /* IFLA_CAN_BITTIMING */
size += sizeof(struct can_clock); /* IFLA_CAN_CLOCK */
if (priv->bittiming_const) /* IFLA_CAN_BITTIMING_CONST */
size += sizeof(struct can_bittiming_const);
return size;
}
static int can_fill_info(struct sk_buff *skb, const struct net_device *dev) static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
{ {
struct can_priv *priv = netdev_priv(dev); struct can_priv *priv = netdev_priv(dev);
...@@ -639,6 +655,7 @@ static struct rtnl_link_ops can_link_ops __read_mostly = { ...@@ -639,6 +655,7 @@ static struct rtnl_link_ops can_link_ops __read_mostly = {
.setup = can_setup, .setup = can_setup,
.newlink = can_newlink, .newlink = can_newlink,
.changelink = can_changelink, .changelink = can_changelink,
.get_size = can_get_size,
.fill_info = can_fill_info, .fill_info = can_fill_info,
.fill_xstats = can_fill_xstats, .fill_xstats = can_fill_xstats,
}; };
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment