|
@@ -1,7 +1,7 @@
|
|
|
/*
|
|
|
* net/tipc/node.c: TIPC node management routines
|
|
|
*
|
|
|
- * Copyright (c) 2000-2006, 2012-2015, Ericsson AB
|
|
|
+ * Copyright (c) 2000-2006, 2012-2016, Ericsson AB
|
|
|
* Copyright (c) 2005-2006, 2010-2014, Wind River Systems
|
|
|
* All rights reserved.
|
|
|
*
|
|
@@ -191,6 +191,20 @@ int tipc_node_get_mtu(struct net *net, u32 addr, u32 sel)
|
|
|
tipc_node_put(n);
|
|
|
return mtu;
|
|
|
}
|
|
|
+
|
|
|
+u16 tipc_node_get_capabilities(struct net *net, u32 addr)
|
|
|
+{
|
|
|
+ struct tipc_node *n;
|
|
|
+ u16 caps;
|
|
|
+
|
|
|
+ n = tipc_node_find(net, addr);
|
|
|
+ if (unlikely(!n))
|
|
|
+ return TIPC_NODE_CAPABILITIES;
|
|
|
+ caps = n->capabilities;
|
|
|
+ tipc_node_put(n);
|
|
|
+ return caps;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* A trivial power-of-two bitmask technique is used for speed, since this
|
|
|
* operation is done for every incoming TIPC packet. The number of hash table
|
|
@@ -304,8 +318,11 @@ struct tipc_node *tipc_node_create(struct net *net, u32 addr, u16 capabilities)
|
|
|
|
|
|
spin_lock_bh(&tn->node_list_lock);
|
|
|
n = tipc_node_find(net, addr);
|
|
|
- if (n)
|
|
|
+ if (n) {
|
|
|
+ /* Same node may come back with new capabilities */
|
|
|
+ n->capabilities = capabilities;
|
|
|
goto exit;
|
|
|
+ }
|
|
|
n = kzalloc(sizeof(*n), GFP_ATOMIC);
|
|
|
if (!n) {
|
|
|
pr_warn("Node creation failed, no memory\n");
|