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;
 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)) {
                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;
        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;
 
 
 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);
 
 #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"
        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)
        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);