dev: introduce dev_get_iflink()
The goal of this patch is to prepare the removal of the iflink field. It introduces a new ndo function, which will be implemented by virtual interfaces. There is no functional change into this patch. All readers of iflink field now call dev_get_iflink(). Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
033f46b3c1
commit
a54acb3a6f
11 changed files with 48 additions and 18 deletions
|
@ -330,7 +330,7 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb)
|
||||||
struct rtable *rt;
|
struct rtable *rt;
|
||||||
int err, ret = NET_XMIT_DROP;
|
int err, ret = NET_XMIT_DROP;
|
||||||
struct flowi4 fl4 = {
|
struct flowi4 fl4 = {
|
||||||
.flowi4_oif = dev->iflink,
|
.flowi4_oif = dev_get_iflink(dev),
|
||||||
.flowi4_tos = RT_TOS(ip4h->tos),
|
.flowi4_tos = RT_TOS(ip4h->tos),
|
||||||
.flowi4_flags = FLOWI_FLAG_ANYSRC,
|
.flowi4_flags = FLOWI_FLAG_ANYSRC,
|
||||||
.daddr = ip4h->daddr,
|
.daddr = ip4h->daddr,
|
||||||
|
|
|
@ -1030,6 +1030,8 @@ typedef u16 (*select_queue_fallback_t)(struct net_device *dev,
|
||||||
* int queue_index, u32 maxrate);
|
* int queue_index, u32 maxrate);
|
||||||
* Called when a user wants to set a max-rate limitation of specific
|
* Called when a user wants to set a max-rate limitation of specific
|
||||||
* TX queue.
|
* TX queue.
|
||||||
|
* int (*ndo_get_iflink)(const struct net_device *dev);
|
||||||
|
* Called to get the iflink value of this device.
|
||||||
*/
|
*/
|
||||||
struct net_device_ops {
|
struct net_device_ops {
|
||||||
int (*ndo_init)(struct net_device *dev);
|
int (*ndo_init)(struct net_device *dev);
|
||||||
|
@ -1191,6 +1193,7 @@ struct net_device_ops {
|
||||||
int (*ndo_set_tx_maxrate)(struct net_device *dev,
|
int (*ndo_set_tx_maxrate)(struct net_device *dev,
|
||||||
int queue_index,
|
int queue_index,
|
||||||
u32 maxrate);
|
u32 maxrate);
|
||||||
|
int (*ndo_get_iflink)(const struct net_device *dev);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2149,6 +2152,7 @@ void __dev_remove_pack(struct packet_type *pt);
|
||||||
void dev_add_offload(struct packet_offload *po);
|
void dev_add_offload(struct packet_offload *po);
|
||||||
void dev_remove_offload(struct packet_offload *po);
|
void dev_remove_offload(struct packet_offload *po);
|
||||||
|
|
||||||
|
int dev_get_iflink(const struct net_device *dev);
|
||||||
struct net_device *__dev_get_by_flags(struct net *net, unsigned short flags,
|
struct net_device *__dev_get_by_flags(struct net *net, unsigned short flags,
|
||||||
unsigned short mask);
|
unsigned short mask);
|
||||||
struct net_device *dev_get_by_name(struct net *net, const char *name);
|
struct net_device *dev_get_by_name(struct net *net, const char *name);
|
||||||
|
|
|
@ -83,11 +83,12 @@ static bool batadv_is_on_batman_iface(const struct net_device *net_dev)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
/* no more parents..stop recursion */
|
/* no more parents..stop recursion */
|
||||||
if (net_dev->iflink == 0 || net_dev->iflink == net_dev->ifindex)
|
if (dev_get_iflink(net_dev) == 0 ||
|
||||||
|
dev_get_iflink(net_dev) == net_dev->ifindex)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* recurse over the parent device */
|
/* recurse over the parent device */
|
||||||
parent_dev = __dev_get_by_index(&init_net, net_dev->iflink);
|
parent_dev = __dev_get_by_index(&init_net, dev_get_iflink(net_dev));
|
||||||
/* if we got a NULL parent_dev there is something broken.. */
|
/* if we got a NULL parent_dev there is something broken.. */
|
||||||
if (WARN(!parent_dev, "Cannot find parent device"))
|
if (WARN(!parent_dev, "Cannot find parent device"))
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -305,8 +305,8 @@ static int br_fill_ifinfo(struct sk_buff *skb,
|
||||||
nla_put_u8(skb, IFLA_OPERSTATE, operstate) ||
|
nla_put_u8(skb, IFLA_OPERSTATE, operstate) ||
|
||||||
(dev->addr_len &&
|
(dev->addr_len &&
|
||||||
nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr)) ||
|
nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr)) ||
|
||||||
(dev->ifindex != dev->iflink &&
|
(dev->ifindex != dev_get_iflink(dev) &&
|
||||||
nla_put_u32(skb, IFLA_LINK, dev->iflink)))
|
nla_put_u32(skb, IFLA_LINK, dev_get_iflink(dev))))
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
|
||||||
if (event == RTM_NEWLINK && port) {
|
if (event == RTM_NEWLINK && port) {
|
||||||
|
|
|
@ -659,6 +659,23 @@ __setup("netdev=", netdev_boot_setup);
|
||||||
|
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dev_get_iflink - get 'iflink' value of a interface
|
||||||
|
* @dev: targeted interface
|
||||||
|
*
|
||||||
|
* Indicates the ifindex the interface is linked to.
|
||||||
|
* Physical interfaces have the same 'ifindex' and 'iflink' values.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int dev_get_iflink(const struct net_device *dev)
|
||||||
|
{
|
||||||
|
if (dev->netdev_ops && dev->netdev_ops->ndo_get_iflink)
|
||||||
|
return dev->netdev_ops->ndo_get_iflink(dev);
|
||||||
|
|
||||||
|
return dev->iflink;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(dev_get_iflink);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __dev_get_by_name - find a device by its name
|
* __dev_get_by_name - find a device by its name
|
||||||
* @net: the applicable net namespace
|
* @net: the applicable net namespace
|
||||||
|
@ -6345,7 +6362,7 @@ int register_netdevice(struct net_device *dev)
|
||||||
else if (__dev_get_by_index(net, dev->ifindex))
|
else if (__dev_get_by_index(net, dev->ifindex))
|
||||||
goto err_uninit;
|
goto err_uninit;
|
||||||
|
|
||||||
if (dev->iflink == -1)
|
if (dev_get_iflink(dev) == -1)
|
||||||
dev->iflink = dev->ifindex;
|
dev->iflink = dev->ifindex;
|
||||||
|
|
||||||
/* Transfer changeable features to wanted_features and enable
|
/* Transfer changeable features to wanted_features and enable
|
||||||
|
@ -7061,7 +7078,7 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
|
||||||
|
|
||||||
/* If there is an ifindex conflict assign a new one */
|
/* If there is an ifindex conflict assign a new one */
|
||||||
if (__dev_get_by_index(net, dev->ifindex)) {
|
if (__dev_get_by_index(net, dev->ifindex)) {
|
||||||
int iflink = (dev->iflink == dev->ifindex);
|
int iflink = (dev_get_iflink(dev) == dev->ifindex);
|
||||||
dev->ifindex = dev_new_index(net);
|
dev->ifindex = dev_new_index(net);
|
||||||
if (iflink)
|
if (iflink)
|
||||||
dev->iflink = dev->ifindex;
|
dev->iflink = dev->ifindex;
|
||||||
|
|
|
@ -40,7 +40,7 @@ static DEFINE_SPINLOCK(lweventlist_lock);
|
||||||
static unsigned char default_operstate(const struct net_device *dev)
|
static unsigned char default_operstate(const struct net_device *dev)
|
||||||
{
|
{
|
||||||
if (!netif_carrier_ok(dev))
|
if (!netif_carrier_ok(dev))
|
||||||
return (dev->ifindex != dev->iflink ?
|
return (dev->ifindex != dev_get_iflink(dev) ?
|
||||||
IF_OPER_LOWERLAYERDOWN : IF_OPER_DOWN);
|
IF_OPER_LOWERLAYERDOWN : IF_OPER_DOWN);
|
||||||
|
|
||||||
if (netif_dormant(dev))
|
if (netif_dormant(dev))
|
||||||
|
@ -89,7 +89,7 @@ static bool linkwatch_urgent_event(struct net_device *dev)
|
||||||
if (!netif_running(dev))
|
if (!netif_running(dev))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (dev->ifindex != dev->iflink)
|
if (dev->ifindex != dev_get_iflink(dev))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (dev->priv_flags & IFF_TEAM_PORT)
|
if (dev->priv_flags & IFF_TEAM_PORT)
|
||||||
|
|
|
@ -109,11 +109,19 @@ NETDEVICE_SHOW_RO(dev_id, fmt_hex);
|
||||||
NETDEVICE_SHOW_RO(dev_port, fmt_dec);
|
NETDEVICE_SHOW_RO(dev_port, fmt_dec);
|
||||||
NETDEVICE_SHOW_RO(addr_assign_type, fmt_dec);
|
NETDEVICE_SHOW_RO(addr_assign_type, fmt_dec);
|
||||||
NETDEVICE_SHOW_RO(addr_len, fmt_dec);
|
NETDEVICE_SHOW_RO(addr_len, fmt_dec);
|
||||||
NETDEVICE_SHOW_RO(iflink, fmt_dec);
|
|
||||||
NETDEVICE_SHOW_RO(ifindex, fmt_dec);
|
NETDEVICE_SHOW_RO(ifindex, fmt_dec);
|
||||||
NETDEVICE_SHOW_RO(type, fmt_dec);
|
NETDEVICE_SHOW_RO(type, fmt_dec);
|
||||||
NETDEVICE_SHOW_RO(link_mode, fmt_dec);
|
NETDEVICE_SHOW_RO(link_mode, fmt_dec);
|
||||||
|
|
||||||
|
static ssize_t iflink_show(struct device *dev, struct device_attribute *attr,
|
||||||
|
char *buf)
|
||||||
|
{
|
||||||
|
struct net_device *ndev = to_net_dev(dev);
|
||||||
|
|
||||||
|
return sprintf(buf, fmt_dec, dev_get_iflink(ndev));
|
||||||
|
}
|
||||||
|
static DEVICE_ATTR_RO(iflink);
|
||||||
|
|
||||||
static ssize_t format_name_assign_type(const struct net_device *dev, char *buf)
|
static ssize_t format_name_assign_type(const struct net_device *dev, char *buf)
|
||||||
{
|
{
|
||||||
return sprintf(buf, fmt_dec, dev->name_assign_type);
|
return sprintf(buf, fmt_dec, dev->name_assign_type);
|
||||||
|
|
|
@ -1055,8 +1055,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
||||||
#ifdef CONFIG_RPS
|
#ifdef CONFIG_RPS
|
||||||
nla_put_u32(skb, IFLA_NUM_RX_QUEUES, dev->num_rx_queues) ||
|
nla_put_u32(skb, IFLA_NUM_RX_QUEUES, dev->num_rx_queues) ||
|
||||||
#endif
|
#endif
|
||||||
(dev->ifindex != dev->iflink &&
|
(dev->ifindex != dev_get_iflink(dev) &&
|
||||||
nla_put_u32(skb, IFLA_LINK, dev->iflink)) ||
|
nla_put_u32(skb, IFLA_LINK, dev_get_iflink(dev))) ||
|
||||||
(upper_dev &&
|
(upper_dev &&
|
||||||
nla_put_u32(skb, IFLA_MASTER, upper_dev->ifindex)) ||
|
nla_put_u32(skb, IFLA_MASTER, upper_dev->ifindex)) ||
|
||||||
nla_put_u8(skb, IFLA_CARRIER, netif_carrier_ok(dev)) ||
|
nla_put_u8(skb, IFLA_CARRIER, netif_carrier_ok(dev)) ||
|
||||||
|
@ -2863,8 +2863,8 @@ int ndo_dflt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
|
||||||
nla_put_u32(skb, IFLA_MASTER, br_dev->ifindex)) ||
|
nla_put_u32(skb, IFLA_MASTER, br_dev->ifindex)) ||
|
||||||
(dev->addr_len &&
|
(dev->addr_len &&
|
||||||
nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr)) ||
|
nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr)) ||
|
||||||
(dev->ifindex != dev->iflink &&
|
(dev->ifindex != dev_get_iflink(dev) &&
|
||||||
nla_put_u32(skb, IFLA_LINK, dev->iflink)))
|
nla_put_u32(skb, IFLA_LINK, dev_get_iflink(dev))))
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
|
||||||
br_afspec = nla_nest_start(skb, IFLA_AF_SPEC);
|
br_afspec = nla_nest_start(skb, IFLA_AF_SPEC);
|
||||||
|
|
|
@ -801,7 +801,7 @@ static int vif_add(struct net *net, struct mr_table *mrt,
|
||||||
v->pkt_out = 0;
|
v->pkt_out = 0;
|
||||||
v->link = dev->ifindex;
|
v->link = dev->ifindex;
|
||||||
if (v->flags & (VIFF_TUNNEL | VIFF_REGISTER))
|
if (v->flags & (VIFF_TUNNEL | VIFF_REGISTER))
|
||||||
v->link = dev->iflink;
|
v->link = dev_get_iflink(dev);
|
||||||
|
|
||||||
/* And finish update writing critical data */
|
/* And finish update writing critical data */
|
||||||
write_lock_bh(&mrt_lock);
|
write_lock_bh(&mrt_lock);
|
||||||
|
|
|
@ -4858,8 +4858,8 @@ static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,
|
||||||
(dev->addr_len &&
|
(dev->addr_len &&
|
||||||
nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr)) ||
|
nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr)) ||
|
||||||
nla_put_u32(skb, IFLA_MTU, dev->mtu) ||
|
nla_put_u32(skb, IFLA_MTU, dev->mtu) ||
|
||||||
(dev->ifindex != dev->iflink &&
|
(dev->ifindex != dev_get_iflink(dev) &&
|
||||||
nla_put_u32(skb, IFLA_LINK, dev->iflink)))
|
nla_put_u32(skb, IFLA_LINK, dev_get_iflink(dev))))
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
protoinfo = nla_nest_start(skb, IFLA_PROTINFO);
|
protoinfo = nla_nest_start(skb, IFLA_PROTINFO);
|
||||||
if (!protoinfo)
|
if (!protoinfo)
|
||||||
|
|
|
@ -992,7 +992,7 @@ static int mif6_add(struct net *net, struct mr6_table *mrt,
|
||||||
v->pkt_out = 0;
|
v->pkt_out = 0;
|
||||||
v->link = dev->ifindex;
|
v->link = dev->ifindex;
|
||||||
if (v->flags & MIFF_REGISTER)
|
if (v->flags & MIFF_REGISTER)
|
||||||
v->link = dev->iflink;
|
v->link = dev_get_iflink(dev);
|
||||||
|
|
||||||
/* And finish update writing critical data */
|
/* And finish update writing critical data */
|
||||||
write_lock_bh(&mrt_lock);
|
write_lock_bh(&mrt_lock);
|
||||||
|
|
Loading…
Reference in a new issue