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: Wolfgang Grandegger <wg@grandegger.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
6755aebaaf
commit
53a0ef866d
@@ -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 = {
|
|||||||
.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,
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user