On 03/19/2018 08:10 PM, Jon Maloy wrote:
> Selecting and expicitly configuring a TIPC node identity may be unwanted

s/expicitly/explicitly

> 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.
> 

This is a good idea, which means TIPC has the capability of
self-automatic configuration and automatically building a cluster
without any manual interfering. Is my understanding right?

In addition, after a node has established links with other nodes with
the same net_id, user changes net_id through tipc_nl_net_set(). It means
the node cannot communicates with its originally linked nodes. I just
found one place in tipc_disc_rcv() where once net_id is different,
discovery message is directly dropped. But after links have been
established and then net_id is changed, I don't find where we handle the
special case. In my mind, we should first break the current links and
then launch another request to re-establish links with the new net_id.

Moreover, we should immediately drop the message in data receive path
once net_id is changed. However, it seems we don't identify whether
net_id is same in tipc_rcv(). Please confirm this.

Lastly, after zone concept is obsoleted, in the same Ethernet segment
there often exists many nodes whose net_id is different. Therefore, once
net_id is changed, we should permit the node to connect wither other nodes.


Thanks,
Ying

> Signed-off-by: Jon Maloy <[email protected]>
> ---
>  net/tipc/bearer.c    | 24 +++++++++++++++---------
>  net/tipc/net.h       |  1 +
>  net/tipc/udp_media.c | 13 +++++++++++++
>  3 files changed, 29 insertions(+), 9 deletions(-)
> 
> diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
> index ae5b44c..f7d47c8 100644
> --- a/net/tipc/bearer.c
> +++ b/net/tipc/bearer.c
> @@ -243,12 +243,6 @@ static int tipc_enable_bearer(struct net *net, const 
> char *name,
>       int res = -EINVAL;
>       char *errstr = "";
>  
> -     if (!tipc_own_id(net)) {
> -             errstr = "not supported in standalone mode";
> -             res = -ENOPROTOOPT;
> -             goto rejected;
> -     }
> -
>       if (!bearer_name_validate(name, &b_names)) {
>               errstr = "illegal name";
>               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,
>                        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;
> -     char *driver_name = strchr((const char *)b->name, ':') + 1;
>  
>       /* Find device with specified name */
> -     dev = dev_get_by_name(net, driver_name);
> +     dev = dev_get_by_name(net, dev_name);
>       if (!dev)
>               return -ENODEV;
>       if (tipc_mtu_bad(dev, 0)) {
> @@ -393,6 +389,16 @@ int tipc_enable_l2_media(struct net *net, struct 
> tipc_bearer *b,
>               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 */
>       rcu_assign_pointer(b->media_ptr, 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;
>       dev_add_pack(&b->pt);
>       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.broadcast = TIPC_BROADCAST_SUPPORT;
>       b->mtu = dev->mtu;
> diff --git a/net/tipc/net.h b/net/tipc/net.h
> index 08efa60..09ad02b 100644
> --- a/net/tipc/net.h
> +++ b/net/tipc/net.h
> @@ -41,6 +41,7 @@
>  
>  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_stop(struct net *net);
>  int tipc_nl_net_dump(struct sk_buff *skb, struct netlink_callback *cb);
> diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c
> index 3deabca..2c13b18 100644
> --- a/net/tipc/udp_media.c
> +++ b/net/tipc/udp_media.c
> @@ -47,6 +47,8 @@
>  #include <net/addrconf.h>
>  #include <linux/tipc_netlink.h>
>  #include "core.h"
> +#include "addr.h"
> +#include "net.h"
>  #include "bearer.h"
>  #include "netlink.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_tunnel_sock_cfg tuncfg = {NULL};
>       struct nlattr *opts[TIPC_NLA_UDP_MAX + 1];
> +     u8 node_id[NODE_ID_LEN] = {0,};
>  
>       ub = kzalloc(sizeof(*ub), GFP_ATOMIC);
>       if (!ub)
> @@ -677,6 +680,16 @@ static int tipc_udp_enable(struct net *net, struct 
> tipc_bearer *b,
>       if (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.broadcast = TIPC_BROADCAST_SUPPORT;
>       rcu_assign_pointer(b->media_ptr, ub);
> 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
tipc-discussion mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to