forked from Minki/linux
tipc: obtain node identity from interface by default
Selecting and explicitly configuring a TIPC node identity may be unwanted in some cases. In this commit we introduce a default setting if the identity has not been set at the moment the first bearer is enabled. We do this by using a raw copy of a unique identifier from the used interface: MAC address in the case of an L2 bearer, IPv4/IPv6 address in the case of a UDP bearer. Acked-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
25b0b9c4e8
commit
52dfae5c85
@ -243,12 +243,6 @@ static int tipc_enable_bearer(struct net *net, const char *name,
|
|||||||
int res = -EINVAL;
|
int res = -EINVAL;
|
||||||
char *errstr = "";
|
char *errstr = "";
|
||||||
|
|
||||||
if (!tipc_own_id(net)) {
|
|
||||||
errstr = "not supported in standalone mode";
|
|
||||||
res = -ENOPROTOOPT;
|
|
||||||
goto rejected;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!bearer_name_validate(name, &b_names)) {
|
if (!bearer_name_validate(name, &b_names)) {
|
||||||
errstr = "illegal name";
|
errstr = "illegal name";
|
||||||
goto rejected;
|
goto rejected;
|
||||||
@ -381,11 +375,13 @@ static void bearer_disable(struct net *net, struct tipc_bearer *b)
|
|||||||
int tipc_enable_l2_media(struct net *net, struct tipc_bearer *b,
|
int tipc_enable_l2_media(struct net *net, struct tipc_bearer *b,
|
||||||
struct nlattr *attr[])
|
struct nlattr *attr[])
|
||||||
{
|
{
|
||||||
|
char *dev_name = strchr((const char *)b->name, ':') + 1;
|
||||||
|
int hwaddr_len = b->media->hwaddr_len;
|
||||||
|
u8 node_id[NODE_ID_LEN] = {0,};
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
char *driver_name = strchr((const char *)b->name, ':') + 1;
|
|
||||||
|
|
||||||
/* Find device with specified name */
|
/* Find device with specified name */
|
||||||
dev = dev_get_by_name(net, driver_name);
|
dev = dev_get_by_name(net, dev_name);
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
if (tipc_mtu_bad(dev, 0)) {
|
if (tipc_mtu_bad(dev, 0)) {
|
||||||
@ -393,6 +389,16 @@ int tipc_enable_l2_media(struct net *net, struct tipc_bearer *b,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Autoconfigure own node identity if needed */
|
||||||
|
if (!tipc_own_id(net) && hwaddr_len <= NODE_ID_LEN) {
|
||||||
|
memcpy(node_id, dev->dev_addr, hwaddr_len);
|
||||||
|
tipc_net_init(net, node_id, 0);
|
||||||
|
}
|
||||||
|
if (!tipc_own_id(net)) {
|
||||||
|
pr_warn("Failed to obtain node identity\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Associate TIPC bearer with L2 bearer */
|
/* Associate TIPC bearer with L2 bearer */
|
||||||
rcu_assign_pointer(b->media_ptr, dev);
|
rcu_assign_pointer(b->media_ptr, dev);
|
||||||
b->pt.dev = dev;
|
b->pt.dev = dev;
|
||||||
@ -400,7 +406,7 @@ int tipc_enable_l2_media(struct net *net, struct tipc_bearer *b,
|
|||||||
b->pt.func = tipc_l2_rcv_msg;
|
b->pt.func = tipc_l2_rcv_msg;
|
||||||
dev_add_pack(&b->pt);
|
dev_add_pack(&b->pt);
|
||||||
memset(&b->bcast_addr, 0, sizeof(b->bcast_addr));
|
memset(&b->bcast_addr, 0, sizeof(b->bcast_addr));
|
||||||
memcpy(b->bcast_addr.value, dev->broadcast, b->media->hwaddr_len);
|
memcpy(b->bcast_addr.value, dev->broadcast, hwaddr_len);
|
||||||
b->bcast_addr.media_id = b->media->type_id;
|
b->bcast_addr.media_id = b->media->type_id;
|
||||||
b->bcast_addr.broadcast = TIPC_BROADCAST_SUPPORT;
|
b->bcast_addr.broadcast = TIPC_BROADCAST_SUPPORT;
|
||||||
b->mtu = dev->mtu;
|
b->mtu = dev->mtu;
|
||||||
|
@ -41,6 +41,7 @@
|
|||||||
|
|
||||||
extern const struct nla_policy tipc_nl_net_policy[];
|
extern const struct nla_policy tipc_nl_net_policy[];
|
||||||
|
|
||||||
|
int tipc_net_init(struct net *net, u8 *node_id, u32 addr);
|
||||||
void tipc_net_finalize(struct net *net, u32 addr);
|
void tipc_net_finalize(struct net *net, u32 addr);
|
||||||
void tipc_net_stop(struct net *net);
|
void tipc_net_stop(struct net *net);
|
||||||
int tipc_nl_net_dump(struct sk_buff *skb, struct netlink_callback *cb);
|
int tipc_nl_net_dump(struct sk_buff *skb, struct netlink_callback *cb);
|
||||||
|
@ -47,6 +47,8 @@
|
|||||||
#include <net/addrconf.h>
|
#include <net/addrconf.h>
|
||||||
#include <linux/tipc_netlink.h>
|
#include <linux/tipc_netlink.h>
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
|
#include "addr.h"
|
||||||
|
#include "net.h"
|
||||||
#include "bearer.h"
|
#include "bearer.h"
|
||||||
#include "netlink.h"
|
#include "netlink.h"
|
||||||
#include "msg.h"
|
#include "msg.h"
|
||||||
@ -647,6 +649,7 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
|
|||||||
struct udp_port_cfg udp_conf = {0};
|
struct udp_port_cfg udp_conf = {0};
|
||||||
struct udp_tunnel_sock_cfg tuncfg = {NULL};
|
struct udp_tunnel_sock_cfg tuncfg = {NULL};
|
||||||
struct nlattr *opts[TIPC_NLA_UDP_MAX + 1];
|
struct nlattr *opts[TIPC_NLA_UDP_MAX + 1];
|
||||||
|
u8 node_id[NODE_ID_LEN] = {0,};
|
||||||
|
|
||||||
ub = kzalloc(sizeof(*ub), GFP_ATOMIC);
|
ub = kzalloc(sizeof(*ub), GFP_ATOMIC);
|
||||||
if (!ub)
|
if (!ub)
|
||||||
@ -677,6 +680,16 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
|
|||||||
if (err)
|
if (err)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
/* Autoconfigure own node identity if needed */
|
||||||
|
if (!tipc_own_id(net)) {
|
||||||
|
memcpy(node_id, local.ipv6.in6_u.u6_addr8, 16);
|
||||||
|
tipc_net_init(net, node_id, 0);
|
||||||
|
}
|
||||||
|
if (!tipc_own_id(net)) {
|
||||||
|
pr_warn("Failed to set node id, please configure manually\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
b->bcast_addr.media_id = TIPC_MEDIA_TYPE_UDP;
|
b->bcast_addr.media_id = TIPC_MEDIA_TYPE_UDP;
|
||||||
b->bcast_addr.broadcast = TIPC_BROADCAST_SUPPORT;
|
b->bcast_addr.broadcast = TIPC_BROADCAST_SUPPORT;
|
||||||
rcu_assign_pointer(b->media_ptr, ub);
|
rcu_assign_pointer(b->media_ptr, ub);
|
||||||
|
Loading…
Reference in New Issue
Block a user