net: core: add ignore flag to netdev_adjacent structure
In order to link an adjacent node, netdev_upper_dev_link() is used and in order to unlink an adjacent node, netdev_upper_dev_unlink() is used. unlink operation does not fail, but link operation can fail. In order to exchange adjacent nodes, we should unlink an old adjacent node first. then, link a new adjacent node. If link operation is failed, we should link an old adjacent node again. But this link operation can fail too. It eventually breaks the adjacent link relationship. This patch adds an ignore flag into the netdev_adjacent structure. If this flag is set, netdev_upper_dev_link() ignores an old adjacent node for a moment. This patch also adds new functions for other modules. netdev_adjacent_change_prepare() netdev_adjacent_change_commit() netdev_adjacent_change_abort() netdev_adjacent_change_prepare() inserts new device into adjacent list but new device is not allowed to use immediately. If netdev_adjacent_change_prepare() fails, it internally rollbacks adjacent list so that we don't need any other action. netdev_adjacent_change_commit() deletes old device in the adjacent list and allows new device to use. netdev_adjacent_change_abort() rollbacks adjacent list. Signed-off-by: Taehee Yoo <ap420073@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
2bce1ebed1
commit
32b6d34fed
@@ -4324,6 +4324,16 @@ int netdev_master_upper_dev_link(struct net_device *dev,
|
||||
struct netlink_ext_ack *extack);
|
||||
void netdev_upper_dev_unlink(struct net_device *dev,
|
||||
struct net_device *upper_dev);
|
||||
int netdev_adjacent_change_prepare(struct net_device *old_dev,
|
||||
struct net_device *new_dev,
|
||||
struct net_device *dev,
|
||||
struct netlink_ext_ack *extack);
|
||||
void netdev_adjacent_change_commit(struct net_device *old_dev,
|
||||
struct net_device *new_dev,
|
||||
struct net_device *dev);
|
||||
void netdev_adjacent_change_abort(struct net_device *old_dev,
|
||||
struct net_device *new_dev,
|
||||
struct net_device *dev);
|
||||
void netdev_adjacent_rename_links(struct net_device *dev, char *oldname);
|
||||
void *netdev_lower_dev_get_private(struct net_device *dev,
|
||||
struct net_device *lower_dev);
|
||||
|
Reference in New Issue
Block a user