diff options
Diffstat (limited to 'net/tipc/node.h')
-rw-r--r-- | net/tipc/node.h | 127 |
1 files changed, 9 insertions, 118 deletions
diff --git a/net/tipc/node.h b/net/tipc/node.h index 6734562d3c6e..f39d9d06e8bb 100644 --- a/net/tipc/node.h +++ b/net/tipc/node.h | |||
@@ -42,23 +42,6 @@ | |||
42 | #include "bearer.h" | 42 | #include "bearer.h" |
43 | #include "msg.h" | 43 | #include "msg.h" |
44 | 44 | ||
45 | /* Out-of-range value for node signature */ | ||
46 | #define INVALID_NODE_SIG 0x10000 | ||
47 | |||
48 | #define INVALID_BEARER_ID -1 | ||
49 | |||
50 | /* Flags used to take different actions according to flag type | ||
51 | * TIPC_NOTIFY_NODE_DOWN: notify node is down | ||
52 | * TIPC_NOTIFY_NODE_UP: notify node is up | ||
53 | * TIPC_DISTRIBUTE_NAME: publish or withdraw link state name type | ||
54 | */ | ||
55 | enum { | ||
56 | TIPC_NOTIFY_NODE_DOWN = (1 << 3), | ||
57 | TIPC_NOTIFY_NODE_UP = (1 << 4), | ||
58 | TIPC_NOTIFY_LINK_UP = (1 << 6), | ||
59 | TIPC_NOTIFY_LINK_DOWN = (1 << 7) | ||
60 | }; | ||
61 | |||
62 | /* Optional capabilities supported by this code version | 45 | /* Optional capabilities supported by this code version |
63 | */ | 46 | */ |
64 | enum { | 47 | enum { |
@@ -66,72 +49,8 @@ enum { | |||
66 | }; | 49 | }; |
67 | 50 | ||
68 | #define TIPC_NODE_CAPABILITIES TIPC_BCAST_SYNCH | 51 | #define TIPC_NODE_CAPABILITIES TIPC_BCAST_SYNCH |
52 | #define INVALID_BEARER_ID -1 | ||
69 | 53 | ||
70 | struct tipc_link_entry { | ||
71 | struct tipc_link *link; | ||
72 | u32 mtu; | ||
73 | struct sk_buff_head inputq; | ||
74 | struct tipc_media_addr maddr; | ||
75 | }; | ||
76 | |||
77 | struct tipc_bclink_entry { | ||
78 | struct tipc_link *link; | ||
79 | struct sk_buff_head inputq1; | ||
80 | struct sk_buff_head arrvq; | ||
81 | struct sk_buff_head inputq2; | ||
82 | struct sk_buff_head namedq; | ||
83 | }; | ||
84 | |||
85 | /** | ||
86 | * struct tipc_node - TIPC node structure | ||
87 | * @addr: network address of node | ||
88 | * @ref: reference counter to node object | ||
89 | * @lock: spinlock governing access to structure | ||
90 | * @net: the applicable net namespace | ||
91 | * @hash: links to adjacent nodes in unsorted hash chain | ||
92 | * @inputq: pointer to input queue containing messages for msg event | ||
93 | * @namedq: pointer to name table input queue with name table messages | ||
94 | * @active_links: bearer ids of active links, used as index into links[] array | ||
95 | * @links: array containing references to all links to node | ||
96 | * @action_flags: bit mask of different types of node actions | ||
97 | * @state: connectivity state vs peer node | ||
98 | * @sync_point: sequence number where synch/failover is finished | ||
99 | * @list: links to adjacent nodes in sorted list of cluster's nodes | ||
100 | * @working_links: number of working links to node (both active and standby) | ||
101 | * @link_cnt: number of links to node | ||
102 | * @capabilities: bitmap, indicating peer node's functional capabilities | ||
103 | * @signature: node instance identifier | ||
104 | * @link_id: local and remote bearer ids of changing link, if any | ||
105 | * @publ_list: list of publications | ||
106 | * @rcu: rcu struct for tipc_node | ||
107 | */ | ||
108 | struct tipc_node { | ||
109 | u32 addr; | ||
110 | struct kref kref; | ||
111 | spinlock_t lock; | ||
112 | struct net *net; | ||
113 | struct hlist_node hash; | ||
114 | int active_links[2]; | ||
115 | struct tipc_link_entry links[MAX_BEARERS]; | ||
116 | struct tipc_bclink_entry bc_entry; | ||
117 | int action_flags; | ||
118 | struct list_head list; | ||
119 | int state; | ||
120 | u16 sync_point; | ||
121 | int link_cnt; | ||
122 | u16 working_links; | ||
123 | u16 capabilities; | ||
124 | u32 signature; | ||
125 | u32 link_id; | ||
126 | struct list_head publ_list; | ||
127 | struct list_head conn_sks; | ||
128 | unsigned long keepalive_intv; | ||
129 | struct timer_list timer; | ||
130 | struct rcu_head rcu; | ||
131 | }; | ||
132 | |||
133 | struct tipc_node *tipc_node_find(struct net *net, u32 addr); | ||
134 | void tipc_node_put(struct tipc_node *node); | ||
135 | void tipc_node_stop(struct net *net); | 54 | void tipc_node_stop(struct net *net); |
136 | void tipc_node_check_dest(struct net *net, u32 onode, | 55 | void tipc_node_check_dest(struct net *net, u32 onode, |
137 | struct tipc_bearer *bearer, | 56 | struct tipc_bearer *bearer, |
@@ -139,50 +58,22 @@ void tipc_node_check_dest(struct net *net, u32 onode, | |||
139 | struct tipc_media_addr *maddr, | 58 | struct tipc_media_addr *maddr, |
140 | bool *respond, bool *dupl_addr); | 59 | bool *respond, bool *dupl_addr); |
141 | void tipc_node_delete_links(struct net *net, int bearer_id); | 60 | void tipc_node_delete_links(struct net *net, int bearer_id); |
142 | void tipc_node_attach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr); | ||
143 | void tipc_node_detach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr); | ||
144 | bool tipc_node_is_up(struct tipc_node *n); | ||
145 | int tipc_node_get_linkname(struct net *net, u32 bearer_id, u32 node, | 61 | int tipc_node_get_linkname(struct net *net, u32 bearer_id, u32 node, |
146 | char *linkname, size_t len); | 62 | char *linkname, size_t len); |
147 | void tipc_node_unlock(struct tipc_node *node); | ||
148 | int tipc_node_xmit(struct net *net, struct sk_buff_head *list, u32 dnode, | 63 | int tipc_node_xmit(struct net *net, struct sk_buff_head *list, u32 dnode, |
149 | int selector); | 64 | int selector); |
150 | int tipc_node_xmit_skb(struct net *net, struct sk_buff *skb, u32 dest, | 65 | int tipc_node_xmit_skb(struct net *net, struct sk_buff *skb, u32 dest, |
151 | u32 selector); | 66 | u32 selector); |
67 | void tipc_node_subscribe(struct net *net, struct list_head *subscr, u32 addr); | ||
68 | void tipc_node_unsubscribe(struct net *net, struct list_head *subscr, u32 addr); | ||
69 | void tipc_node_broadcast(struct net *net, struct sk_buff *skb); | ||
152 | int tipc_node_add_conn(struct net *net, u32 dnode, u32 port, u32 peer_port); | 70 | int tipc_node_add_conn(struct net *net, u32 dnode, u32 port, u32 peer_port); |
153 | void tipc_node_remove_conn(struct net *net, u32 dnode, u32 port); | 71 | void tipc_node_remove_conn(struct net *net, u32 dnode, u32 port); |
72 | int tipc_node_get_mtu(struct net *net, u32 addr, u32 sel); | ||
154 | int tipc_nl_node_dump(struct sk_buff *skb, struct netlink_callback *cb); | 73 | int tipc_nl_node_dump(struct sk_buff *skb, struct netlink_callback *cb); |
155 | 74 | int tipc_nl_node_dump_link(struct sk_buff *skb, struct netlink_callback *cb); | |
156 | static inline void tipc_node_lock(struct tipc_node *node) | 75 | int tipc_nl_node_reset_link_stats(struct sk_buff *skb, struct genl_info *info); |
157 | { | 76 | int tipc_nl_node_get_link(struct sk_buff *skb, struct genl_info *info); |
158 | spin_lock_bh(&node->lock); | 77 | int tipc_nl_node_set_link(struct sk_buff *skb, struct genl_info *info); |
159 | } | ||
160 | |||
161 | static inline struct tipc_link *node_active_link(struct tipc_node *n, int sel) | ||
162 | { | ||
163 | int bearer_id = n->active_links[sel & 1]; | ||
164 | |||
165 | if (unlikely(bearer_id == INVALID_BEARER_ID)) | ||
166 | return NULL; | ||
167 | |||
168 | return n->links[bearer_id].link; | ||
169 | } | ||
170 | |||
171 | static inline unsigned int tipc_node_get_mtu(struct net *net, u32 addr, u32 sel) | ||
172 | { | ||
173 | struct tipc_node *n; | ||
174 | int bearer_id; | ||
175 | unsigned int mtu = MAX_MSG_SIZE; | ||
176 | |||
177 | n = tipc_node_find(net, addr); | ||
178 | if (unlikely(!n)) | ||
179 | return mtu; | ||
180 | |||
181 | bearer_id = n->active_links[sel & 1]; | ||
182 | if (likely(bearer_id != INVALID_BEARER_ID)) | ||
183 | mtu = n->links[bearer_id].mtu; | ||
184 | tipc_node_put(n); | ||
185 | return mtu; | ||
186 | } | ||
187 | 78 | ||
188 | #endif | 79 | #endif |