diff options
Diffstat (limited to 'net/tipc/node.c')
| -rw-r--r-- | net/tipc/node.c | 96 | 
1 files changed, 95 insertions, 1 deletions
| diff --git a/net/tipc/node.c b/net/tipc/node.c index 488019766433..db2a6c3e0be9 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c @@ -43,6 +43,7 @@  #include "monitor.h"  #include "discover.h"  #include "netlink.h" +#include "trace.h"  #define INVALID_NODE_SIG	0x10000  #define NODE_CLEANUP_AFTER	300000 @@ -432,6 +433,7 @@ static struct tipc_node *tipc_node_create(struct net *net, u32 addr,  			break;  	}  	list_add_tail_rcu(&n->list, &temp_node->list); +	trace_tipc_node_create(n, true, " ");  exit:  	spin_unlock_bh(&tn->node_list_lock);  	return n; @@ -459,6 +461,7 @@ static void tipc_node_delete_from_list(struct tipc_node *node)  static void tipc_node_delete(struct tipc_node *node)  { +	trace_tipc_node_delete(node, true, " ");  	tipc_node_delete_from_list(node);  	del_timer_sync(&node->timer); @@ -616,6 +619,7 @@ static void tipc_node_timeout(struct timer_list *t)  	int bearer_id;  	int rc = 0; +	trace_tipc_node_timeout(n, false, " ");  	if (!node_is_up(n) && tipc_node_cleanup(n)) {  		/*Removing the reference of Timer*/  		tipc_node_put(n); @@ -624,6 +628,12 @@ static void tipc_node_timeout(struct timer_list *t)  	__skb_queue_head_init(&xmitq); +	/* Initial node interval to value larger (10 seconds), then it will be +	 * recalculated with link lowest tolerance +	 */ +	tipc_node_read_lock(n); +	n->keepalive_intv = 10000; +	tipc_node_read_unlock(n);  	for (bearer_id = 0; remains && (bearer_id < MAX_BEARERS); bearer_id++) {  		tipc_node_read_lock(n);  		le = &n->links[bearer_id]; @@ -675,6 +685,7 @@ static void __tipc_node_link_up(struct tipc_node *n, int bearer_id,  	pr_debug("Established link <%s> on network plane %c\n",  		 tipc_link_name(nl), tipc_link_plane(nl)); +	trace_tipc_node_link_up(n, true, " ");  	/* Ensure that a STATE message goes first */  	tipc_link_build_state_msg(nl, xmitq); @@ -777,6 +788,7 @@ static void __tipc_node_link_down(struct tipc_node *n, int *bearer_id,  		if (tipc_link_peer_is_down(l))  			tipc_node_fsm_evt(n, PEER_LOST_CONTACT_EVT);  		tipc_node_fsm_evt(n, SELF_LOST_CONTACT_EVT); +		trace_tipc_link_reset(l, TIPC_DUMP_ALL, "link down!");  		tipc_link_fsm_evt(l, LINK_RESET_EVT);  		tipc_link_reset(l);  		tipc_link_build_reset_msg(l, xmitq); @@ -794,6 +806,7 @@ static void __tipc_node_link_down(struct tipc_node *n, int *bearer_id,  	tipc_node_fsm_evt(n, NODE_SYNCH_END_EVT);  	n->sync_point = tipc_link_rcv_nxt(tnl) + (U16_MAX / 2 - 1);  	tipc_link_tnl_prepare(l, tnl, FAILOVER_MSG, xmitq); +	trace_tipc_link_reset(l, TIPC_DUMP_ALL, "link down -> failover!");  	tipc_link_reset(l);  	tipc_link_fsm_evt(l, LINK_RESET_EVT);  	tipc_link_fsm_evt(l, LINK_FAILOVER_BEGIN_EVT); @@ -826,6 +839,7 @@ static void tipc_node_link_down(struct tipc_node *n, int bearer_id, bool delete)  		/* Defuse pending tipc_node_link_up() */  		tipc_link_fsm_evt(l, LINK_RESET_EVT);  	} +	trace_tipc_node_link_down(n, true, "node link down or deleted!");  	tipc_node_write_unlock(n);  	if (delete)  		tipc_mon_remove_peer(n->net, n->addr, old_bearer_id); @@ -1015,6 +1029,7 @@ void tipc_node_check_dest(struct net *net, u32 addr,  			*respond = false;  			goto exit;  		} +		trace_tipc_link_reset(l, TIPC_DUMP_ALL, "link created!");  		tipc_link_reset(l);  		tipc_link_fsm_evt(l, LINK_RESET_EVT);  		if (n->state == NODE_FAILINGOVER) @@ -1054,6 +1069,7 @@ static void tipc_node_reset_links(struct tipc_node *n)  	pr_warn("Resetting all links to %x\n", n->addr); +	trace_tipc_node_reset_links(n, true, " ");  	for (i = 0; i < MAX_BEARERS; i++) {  		tipc_node_link_down(n, i, false);  	} @@ -1229,11 +1245,13 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt)  		pr_err("Unknown node fsm state %x\n", state);  		break;  	} +	trace_tipc_node_fsm(n->peer_id, n->state, state, evt);  	n->state = state;  	return;  illegal_evt:  	pr_err("Illegal node fsm evt %x in state %x\n", evt, state); +	trace_tipc_node_fsm(n->peer_id, n->state, state, evt);  }  static void node_lost_contact(struct tipc_node *n, @@ -1247,6 +1265,7 @@ static void node_lost_contact(struct tipc_node *n,  	pr_debug("Lost contact with %x\n", n->addr);  	n->delete_at = jiffies + msecs_to_jiffies(NODE_CLEANUP_AFTER); +	trace_tipc_node_lost_contact(n, true, " ");  	/* Clean up broadcast state */  	tipc_bcast_remove_peer(n->net, n->bc_entry.link); @@ -1543,6 +1562,10 @@ static void tipc_node_bc_rcv(struct net *net, struct sk_buff *skb, int bearer_id  	if (!skb_queue_empty(&be->inputq1))  		tipc_node_mcast_rcv(n); +	/* Handle NAME_DISTRIBUTOR messages sent from 1.7 nodes */ +	if (!skb_queue_empty(&n->bc_entry.namedq)) +		tipc_named_rcv(net, &n->bc_entry.namedq); +  	/* If reassembly or retransmission failure => reset all links to peer */  	if (rc & TIPC_LINK_DOWN_EVT)  		tipc_node_reset_links(n); @@ -1571,6 +1594,10 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb,  	struct tipc_media_addr *maddr;  	int pb_id; +	if (trace_tipc_node_check_state_enabled()) { +		trace_tipc_skb_dump(skb, false, "skb for node state check"); +		trace_tipc_node_check_state(n, true, " "); +	}  	l = n->links[bearer_id].link;  	if (!l)  		return false; @@ -1588,8 +1615,11 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb,  		}  	} -	if (!tipc_link_validate_msg(l, hdr)) +	if (!tipc_link_validate_msg(l, hdr)) { +		trace_tipc_skb_dump(skb, false, "PROTO invalid (2)!"); +		trace_tipc_link_dump(l, TIPC_DUMP_NONE, "PROTO invalid (2)!");  		return false; +	}  	/* Check and update node accesibility if applicable */  	if (state == SELF_UP_PEER_COMING) { @@ -1619,6 +1649,8 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb,  		syncpt = oseqno + exp_pkts - 1;  		if (pl && tipc_link_is_up(pl)) {  			__tipc_node_link_down(n, &pb_id, xmitq, &maddr); +			trace_tipc_node_link_down(n, true, +						  "node link down <- failover!");  			tipc_skb_queue_splice_tail_init(tipc_link_inputq(pl),  							tipc_link_inputq(l));  		} @@ -2425,3 +2457,65 @@ int tipc_nl_node_dump_monitor_peer(struct sk_buff *skb,  	return skb->len;  } + +u32 tipc_node_get_addr(struct tipc_node *node) +{ +	return (node) ? node->addr : 0; +} + +/** + * tipc_node_dump - dump TIPC node data + * @n: tipc node to be dumped + * @more: dump more? + *        - false: dump only tipc node data + *        - true: dump node link data as well + * @buf: returned buffer of dump data in format + */ +int tipc_node_dump(struct tipc_node *n, bool more, char *buf) +{ +	int i = 0; +	size_t sz = (more) ? NODE_LMAX : NODE_LMIN; + +	if (!n) { +		i += scnprintf(buf, sz, "node data: (null)\n"); +		return i; +	} + +	i += scnprintf(buf, sz, "node data: %x", n->addr); +	i += scnprintf(buf + i, sz - i, " %x", n->state); +	i += scnprintf(buf + i, sz - i, " %d", n->active_links[0]); +	i += scnprintf(buf + i, sz - i, " %d", n->active_links[1]); +	i += scnprintf(buf + i, sz - i, " %x", n->action_flags); +	i += scnprintf(buf + i, sz - i, " %u", n->failover_sent); +	i += scnprintf(buf + i, sz - i, " %u", n->sync_point); +	i += scnprintf(buf + i, sz - i, " %d", n->link_cnt); +	i += scnprintf(buf + i, sz - i, " %u", n->working_links); +	i += scnprintf(buf + i, sz - i, " %x", n->capabilities); +	i += scnprintf(buf + i, sz - i, " %lu\n", n->keepalive_intv); + +	if (!more) +		return i; + +	i += scnprintf(buf + i, sz - i, "link_entry[0]:\n"); +	i += scnprintf(buf + i, sz - i, " mtu: %u\n", n->links[0].mtu); +	i += scnprintf(buf + i, sz - i, " media: "); +	i += tipc_media_addr_printf(buf + i, sz - i, &n->links[0].maddr); +	i += scnprintf(buf + i, sz - i, "\n"); +	i += tipc_link_dump(n->links[0].link, TIPC_DUMP_NONE, buf + i); +	i += scnprintf(buf + i, sz - i, " inputq: "); +	i += tipc_list_dump(&n->links[0].inputq, false, buf + i); + +	i += scnprintf(buf + i, sz - i, "link_entry[1]:\n"); +	i += scnprintf(buf + i, sz - i, " mtu: %u\n", n->links[1].mtu); +	i += scnprintf(buf + i, sz - i, " media: "); +	i += tipc_media_addr_printf(buf + i, sz - i, &n->links[1].maddr); +	i += scnprintf(buf + i, sz - i, "\n"); +	i += tipc_link_dump(n->links[1].link, TIPC_DUMP_NONE, buf + i); +	i += scnprintf(buf + i, sz - i, " inputq: "); +	i += tipc_list_dump(&n->links[1].inputq, false, buf + i); + +	i += scnprintf(buf + i, sz - i, "bclink:\n "); +	i += tipc_link_dump(n->bc_entry.link, TIPC_DUMP_NONE, buf + i); + +	return i; +} | 
