diff options
Diffstat (limited to 'net/tipc/node.h')
| -rw-r--r-- | net/tipc/node.h | 151 | 
1 files changed, 75 insertions, 76 deletions
diff --git a/net/tipc/node.h b/net/tipc/node.h index fff331b2d26..9087063793f 100644 --- a/net/tipc/node.h +++ b/net/tipc/node.h @@ -2,7 +2,7 @@   * net/tipc/node.h: Include file for TIPC node management routines   *   * Copyright (c) 2000-2006, Ericsson AB - * Copyright (c) 2005, Wind River Systems + * Copyright (c) 2005, 2010-2014, Wind River Systems   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -39,109 +39,108 @@  #include "node_subscr.h"  #include "addr.h" -#include "cluster.h" +#include "net.h"  #include "bearer.h" +/* + * Out-of-range value for node signature + */ +#define INVALID_NODE_SIG 0x10000 + +/* Flags used to take different actions according to flag type + * TIPC_WAIT_PEER_LINKS_DOWN: wait to see that peer's links are down + * TIPC_WAIT_OWN_LINKS_DOWN: wait until peer node is declared down + * TIPC_NOTIFY_NODE_DOWN: notify node is down + * TIPC_NOTIFY_NODE_UP: notify node is up + */ +enum { +	TIPC_WAIT_PEER_LINKS_DOWN	= (1 << 1), +	TIPC_WAIT_OWN_LINKS_DOWN	= (1 << 2), +	TIPC_NOTIFY_NODE_DOWN		= (1 << 3), +	TIPC_NOTIFY_NODE_UP		= (1 << 4) +}; + +/** + * struct tipc_node_bclink - TIPC node bclink structure + * @acked: sequence # of last outbound b'cast message acknowledged by node + * @last_in: sequence # of last in-sequence b'cast message received from node + * @last_sent: sequence # of last b'cast message sent by node + * @oos_state: state tracker for handling OOS b'cast messages + * @deferred_size: number of OOS b'cast messages in deferred queue + * @deferred_head: oldest OOS b'cast message received from node + * @deferred_tail: newest OOS b'cast message received from node + * @reasm_buf: broadcast reassembly queue head from node + * @recv_permitted: true if node is allowed to receive b'cast messages + */ +struct tipc_node_bclink { +	u32 acked; +	u32 last_in; +	u32 last_sent; +	u32 oos_state; +	u32 deferred_size; +	struct sk_buff *deferred_head; +	struct sk_buff *deferred_tail; +	struct sk_buff *reasm_buf; +	bool recv_permitted; +}; +  /**   * struct tipc_node - TIPC node structure   * @addr: network address of node   * @lock: spinlock governing access to structure - * @owner: pointer to cluster that node belongs to - * @next: pointer to next node in sorted list of cluster's nodes - * @nsub: list of "node down" subscriptions monitoring node + * @hash: links to adjacent nodes in unsorted hash chain   * @active_links: pointers to active links to node   * @links: pointers to all links to node + * @action_flags: bit mask of different types of node actions + * @bclink: broadcast-related info + * @list: links to adjacent nodes in sorted list of cluster's nodes   * @working_links: number of working links to node (both active and standby) - * @cleanup_required: non-zero if cleaning up after a prior loss of contact   * @link_cnt: number of links to node - * @permit_changeover: non-zero if node has redundant links to this system - * @routers: bitmap (used for multicluster communication) - * @last_router: (used for multicluster communication) - * @bclink: broadcast-related info - *    @supported: non-zero if node supports TIPC b'cast capability - *    @acked: sequence # of last outbound b'cast message acknowledged by node - *    @last_in: sequence # of last in-sequence b'cast message received from node - *    @gap_after: sequence # of last message not requiring a NAK request - *    @gap_to: sequence # of last message requiring a NAK request - *    @nack_sync: counter that determines when NAK requests should be sent - *    @deferred_head: oldest OOS b'cast message received from node - *    @deferred_tail: newest OOS b'cast message received from node - *    @defragm: list of partially reassembled b'cast message fragments from node + * @signature: node instance identifier + * @nsub: list of "node down" subscriptions monitoring node + * @rcu: rcu struct for tipc_node   */ -  struct tipc_node {  	u32 addr;  	spinlock_t lock; -	struct cluster *owner; -	struct tipc_node *next; -	struct list_head nsub; -	struct link *active_links[2]; -	struct link *links[MAX_BEARERS]; +	struct hlist_node hash; +	struct tipc_link *active_links[2]; +	struct tipc_link *links[MAX_BEARERS]; +	unsigned int action_flags; +	struct tipc_node_bclink bclink; +	struct list_head list;  	int link_cnt;  	int working_links; -	int cleanup_required; -	int permit_changeover; -	u32 routers[512/32]; -	int last_router; -	struct { -		int supported; -		u32 acked; -		u32 last_in; -		u32 gap_after; -		u32 gap_to; -		u32 nack_sync; -		struct sk_buff *deferred_head; -		struct sk_buff *deferred_tail; -		struct sk_buff *defragm; -	} bclink; +	u32 signature; +	struct list_head nsub; +	struct rcu_head rcu;  }; -extern u32 tipc_own_tag; +extern struct list_head tipc_node_list; +struct tipc_node *tipc_node_find(u32 addr);  struct tipc_node *tipc_node_create(u32 addr); -void tipc_node_delete(struct tipc_node *n_ptr); -struct tipc_node *tipc_node_attach_link(struct link *l_ptr); -void tipc_node_detach_link(struct tipc_node *n_ptr, struct link *l_ptr); -void tipc_node_link_down(struct tipc_node *n_ptr, struct link *l_ptr); -void tipc_node_link_up(struct tipc_node *n_ptr, struct link *l_ptr); -int tipc_node_has_active_links(struct tipc_node *n_ptr); -int tipc_node_has_redundant_links(struct tipc_node *n_ptr); -u32 tipc_node_select_router(struct tipc_node *n_ptr, u32 ref); -struct tipc_node *tipc_node_select_next_hop(u32 addr, u32 selector); +void tipc_node_stop(void); +void tipc_node_attach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr); +void tipc_node_detach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr); +void tipc_node_link_down(struct tipc_node *n_ptr, struct tipc_link *l_ptr); +void tipc_node_link_up(struct tipc_node *n_ptr, struct tipc_link *l_ptr); +int tipc_node_active_links(struct tipc_node *n_ptr);  int tipc_node_is_up(struct tipc_node *n_ptr); -void tipc_node_add_router(struct tipc_node *n_ptr, u32 router); -void tipc_node_remove_router(struct tipc_node *n_ptr, u32 router);  struct sk_buff *tipc_node_get_links(const void *req_tlv_area, int req_tlv_space);  struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space); +int tipc_node_get_linkname(u32 bearer_id, u32 node, char *linkname, size_t len); +void tipc_node_unlock(struct tipc_node *node); -static inline struct tipc_node *tipc_node_find(u32 addr) -{ -	if (likely(in_own_cluster(addr))) -		return tipc_local_nodes[tipc_node(addr)]; -	else if (tipc_addr_domain_valid(addr)) { -		struct cluster *c_ptr = tipc_cltr_find(addr); - -		if (c_ptr) -			return c_ptr->nodes[tipc_node(addr)]; -	} -	return NULL; -} - -static inline struct tipc_node *tipc_node_select(u32 addr, u32 selector) -{ -	if (likely(in_own_cluster(addr))) -		return tipc_local_nodes[tipc_node(addr)]; -	return tipc_node_select_next_hop(addr, selector); -} - -static inline void tipc_node_lock(struct tipc_node *n_ptr) +static inline void tipc_node_lock(struct tipc_node *node)  { -	spin_lock_bh(&n_ptr->lock); +	spin_lock_bh(&node->lock);  } -static inline void tipc_node_unlock(struct tipc_node *n_ptr) +static inline bool tipc_node_blocked(struct tipc_node *node)  { -	spin_unlock_bh(&n_ptr->lock); +	return (node->action_flags & (TIPC_WAIT_PEER_LINKS_DOWN | +		TIPC_NOTIFY_NODE_DOWN | TIPC_WAIT_OWN_LINKS_DOWN));  }  #endif  | 
