Until now, we have tried to support both the newer, dedicated broadcast
synchronization mechanism along with the older, less safe, RESET_MSG/
ACTIVATE_MSG based one. The latter method has turned out to be a hazard
in a highly dynamic cluster, so we find it safer to disable it completely
when we find that the former mechanism is supported by the peer node.
For this purpose, we now introduce a new capabability bit,
TIPC_BCAST_SYNCH, to inform any peer nodes that dedicated broadcast
syncronization is supported by the present node. The new bit is conveyed
between peers in the 'capabilities' field of neighbor discovery messages.
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Reviewed-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
if (!tipc_link_bc_create(&bb->node,
MAX_PKT_DEFAULT_MCAST,
BCLINK_WIN_DEFAULT,
if (!tipc_link_bc_create(&bb->node,
MAX_PKT_DEFAULT_MCAST,
BCLINK_WIN_DEFAULT,
&bb->inputq,
&bb->namedq,
&l))
&bb->inputq,
&bb->namedq,
&l))
MAX_H_SIZE, dest_domain);
msg_set_non_seq(msg, 1);
msg_set_node_sig(msg, tn->random);
MAX_H_SIZE, dest_domain);
msg_set_non_seq(msg, 1);
msg_set_node_sig(msg, tn->random);
- msg_set_node_capabilities(msg, 0);
+ msg_set_node_capabilities(msg, TIPC_NODE_CAPABILITIES);
msg_set_dest_domain(msg, dest_domain);
msg_set_bc_netid(msg, tn->net_id);
b_ptr->media->addr2msg(msg_media_addr(msg), &b_ptr->addr);
msg_set_dest_domain(msg, dest_domain);
msg_set_bc_netid(msg, tn->net_id);
b_ptr->media->addr2msg(msg_media_addr(msg), &b_ptr->addr);
* @session: session to be used by link
* @ownnode: identity of own node
* @peer: node id of peer node
* @session: session to be used by link
* @ownnode: identity of own node
* @peer: node id of peer node
+ * @peer_caps: bitmap describing peer node capabilities
* @maddr: media address to be used
* @inputq: queue to put messages ready for delivery
* @namedq: queue to put binding table update messages ready for delivery
* @maddr: media address to be used
* @inputq: queue to put messages ready for delivery
* @namedq: queue to put binding table update messages ready for delivery
bool tipc_link_create(struct tipc_node *n, char *if_name, int bearer_id,
int tolerance, char net_plane, u32 mtu, int priority,
int window, u32 session, u32 ownnode, u32 peer,
bool tipc_link_create(struct tipc_node *n, char *if_name, int bearer_id,
int tolerance, char net_plane, u32 mtu, int priority,
int window, u32 session, u32 ownnode, u32 peer,
- struct tipc_media_addr *maddr,
+ u16 peer_caps, struct tipc_media_addr *maddr,
struct sk_buff_head *inputq, struct sk_buff_head *namedq,
struct tipc_link **link)
{
struct sk_buff_head *inputq, struct sk_buff_head *namedq,
struct tipc_link **link)
{
strcpy((char *)msg_data(hdr), if_name);
l->addr = peer;
strcpy((char *)msg_data(hdr), if_name);
l->addr = peer;
+ l->peer_caps = peer_caps;
l->media_addr = maddr;
l->owner = n;
l->peer_session = WILDCARD_SESSION;
l->media_addr = maddr;
l->owner = n;
l->peer_session = WILDCARD_SESSION;
* Returns true if link was created, otherwise false
*/
bool tipc_link_bc_create(struct tipc_node *n, int mtu, int window,
* Returns true if link was created, otherwise false
*/
bool tipc_link_bc_create(struct tipc_node *n, int mtu, int window,
struct sk_buff_head *inputq,
struct sk_buff_head *namedq,
struct tipc_link **link)
struct sk_buff_head *inputq,
struct sk_buff_head *namedq,
struct tipc_link **link)
struct tipc_link *l;
if (!tipc_link_create(n, "", MAX_BEARERS, 0, 'Z', mtu, 0, window,
struct tipc_link *l;
if (!tipc_link_create(n, "", MAX_BEARERS, 0, 'Z', mtu, 0, window,
- 0, 0, 0, NULL, inputq, namedq, link))
+ 0, 0, 0, peer_caps, NULL, inputq, namedq, link))
* @keepalive_intv: link keepalive timer interval
* @abort_limit: # of unacknowledged continuity probes needed to reset link
* @state: current state of link FSM
* @keepalive_intv: link keepalive timer interval
* @abort_limit: # of unacknowledged continuity probes needed to reset link
* @state: current state of link FSM
+ * @peer_caps: bitmap describing capabilities of peer node
* @silent_intv_cnt: # of timer intervals without any reception from peer
* @proto_msg: template for control messages generated by link
* @pmsg: convenience pointer to "proto_msg" field
* @silent_intv_cnt: # of timer intervals without any reception from peer
* @proto_msg: template for control messages generated by link
* @pmsg: convenience pointer to "proto_msg" field
unsigned long keepalive_intv;
u32 abort_limit;
u32 state;
unsigned long keepalive_intv;
u32 abort_limit;
u32 state;
u32 silent_intv_cnt;
struct {
unchar hdr[INT_H_SIZE];
u32 silent_intv_cnt;
struct {
unchar hdr[INT_H_SIZE];
bool tipc_link_create(struct tipc_node *n, char *if_name, int bearer_id,
int tolerance, char net_plane, u32 mtu, int priority,
int window, u32 session, u32 ownnode, u32 peer,
bool tipc_link_create(struct tipc_node *n, char *if_name, int bearer_id,
int tolerance, char net_plane, u32 mtu, int priority,
int window, u32 session, u32 ownnode, u32 peer,
- struct tipc_media_addr *maddr,
+ u16 peer_caps, struct tipc_media_addr *maddr,
struct sk_buff_head *inputq, struct sk_buff_head *namedq,
struct tipc_link **link);
bool tipc_link_bc_create(struct tipc_node *n, int mtu, int window,
struct sk_buff_head *inputq, struct sk_buff_head *namedq,
struct tipc_link **link);
bool tipc_link_bc_create(struct tipc_node *n, int mtu, int window,
- struct sk_buff_head *inputq,
+ u16 peer_caps, struct sk_buff_head *inputq,
struct sk_buff_head *namedq,
struct tipc_link **link);
void tipc_link_tnl_prepare(struct tipc_link *l, struct tipc_link *tnl,
struct sk_buff_head *namedq,
struct tipc_link **link);
void tipc_link_tnl_prepare(struct tipc_link *l, struct tipc_link *tnl,
if (!tipc_link_create(n, if_name, b->identity, b->tolerance,
b->net_plane, b->mtu, b->priority,
b->window, mod(tipc_net(net)->random),
if (!tipc_link_create(n, if_name, b->identity, b->tolerance,
b->net_plane, b->mtu, b->priority,
b->window, mod(tipc_net(net)->random),
- tipc_own_addr(net), onode, &le->maddr,
- &le->inputq, &n->bclink.namedq, &l)) {
+ tipc_own_addr(net), onode,
+ n->capabilities,
+ &le->maddr, &le->inputq,
+ &n->bclink.namedq, &l)) {
*respond = false;
goto exit;
}
*respond = false;
goto exit;
}
TIPC_BCAST_RESET = (1 << 10)
};
TIPC_BCAST_RESET = (1 << 10)
};
+/* Optional capabilities supported by this code version
+ */
+enum {
+ TIPC_BCAST_SYNCH = (1 << 1)
+};
+
+#define TIPC_NODE_CAPABILITIES TIPC_BCAST_SYNCH
+
/**
* struct tipc_node_bclink - TIPC node bclink structure
* @acked: sequence # of last outbound b'cast message acknowledged by node
/**
* struct tipc_node_bclink - TIPC node bclink structure
* @acked: sequence # of last outbound b'cast message acknowledged by node