diff options
Diffstat (limited to 'net/tipc/link.c')
-rw-r--r-- | net/tipc/link.c | 171 |
1 files changed, 66 insertions, 105 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c index 0c2944fb9ae0..7d2bb3e70baa 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * net/tipc/link.c: TIPC link code | 2 | * net/tipc/link.c: TIPC link code |
3 | * | 3 | * |
4 | * Copyright (c) 1996-2007, 2012-2015, Ericsson AB | 4 | * Copyright (c) 1996-2007, 2012-2016, Ericsson AB |
5 | * Copyright (c) 2004-2007, 2010-2013, Wind River Systems | 5 | * Copyright (c) 2004-2007, 2010-2013, Wind River Systems |
6 | * All rights reserved. | 6 | * All rights reserved. |
7 | * | 7 | * |
@@ -123,11 +123,11 @@ struct tipc_stats { | |||
123 | struct tipc_link { | 123 | struct tipc_link { |
124 | u32 addr; | 124 | u32 addr; |
125 | char name[TIPC_MAX_LINK_NAME]; | 125 | char name[TIPC_MAX_LINK_NAME]; |
126 | struct tipc_media_addr *media_addr; | ||
127 | struct net *net; | 126 | struct net *net; |
128 | 127 | ||
129 | /* Management and link supervision data */ | 128 | /* Management and link supervision data */ |
130 | u32 peer_session; | 129 | u32 peer_session; |
130 | u32 session; | ||
131 | u32 peer_bearer_id; | 131 | u32 peer_bearer_id; |
132 | u32 bearer_id; | 132 | u32 bearer_id; |
133 | u32 tolerance; | 133 | u32 tolerance; |
@@ -137,11 +137,7 @@ struct tipc_link { | |||
137 | u16 peer_caps; | 137 | u16 peer_caps; |
138 | bool active; | 138 | bool active; |
139 | u32 silent_intv_cnt; | 139 | u32 silent_intv_cnt; |
140 | struct { | 140 | char if_name[TIPC_MAX_IF_NAME]; |
141 | unchar hdr[INT_H_SIZE]; | ||
142 | unchar body[TIPC_MAX_IF_NAME]; | ||
143 | } proto_msg; | ||
144 | struct tipc_msg *pmsg; | ||
145 | u32 priority; | 141 | u32 priority; |
146 | char net_plane; | 142 | char net_plane; |
147 | 143 | ||
@@ -196,14 +192,6 @@ struct tipc_link { | |||
196 | static const char *link_co_err = "Link tunneling error, "; | 192 | static const char *link_co_err = "Link tunneling error, "; |
197 | static const char *link_rst_msg = "Resetting link "; | 193 | static const char *link_rst_msg = "Resetting link "; |
198 | 194 | ||
199 | /* Properties valid for media, bearar and link */ | ||
200 | static const struct nla_policy tipc_nl_prop_policy[TIPC_NLA_PROP_MAX + 1] = { | ||
201 | [TIPC_NLA_PROP_UNSPEC] = { .type = NLA_UNSPEC }, | ||
202 | [TIPC_NLA_PROP_PRIO] = { .type = NLA_U32 }, | ||
203 | [TIPC_NLA_PROP_TOL] = { .type = NLA_U32 }, | ||
204 | [TIPC_NLA_PROP_WIN] = { .type = NLA_U32 } | ||
205 | }; | ||
206 | |||
207 | /* Send states for broadcast NACKs | 195 | /* Send states for broadcast NACKs |
208 | */ | 196 | */ |
209 | enum { | 197 | enum { |
@@ -216,10 +204,11 @@ enum { | |||
216 | * Interval between NACKs when packets arrive out of order | 204 | * Interval between NACKs when packets arrive out of order |
217 | */ | 205 | */ |
218 | #define TIPC_NACK_INTV (TIPC_MIN_LINK_WIN * 2) | 206 | #define TIPC_NACK_INTV (TIPC_MIN_LINK_WIN * 2) |
219 | /* | 207 | |
220 | * Out-of-range value for link session numbers | 208 | /* Wildcard value for link session numbers. When it is known that |
209 | * peer endpoint is down, any session number must be accepted. | ||
221 | */ | 210 | */ |
222 | #define WILDCARD_SESSION 0x10000 | 211 | #define ANY_SESSION 0x10000 |
223 | 212 | ||
224 | /* Link FSM states: | 213 | /* Link FSM states: |
225 | */ | 214 | */ |
@@ -399,16 +388,6 @@ char *tipc_link_name(struct tipc_link *l) | |||
399 | return l->name; | 388 | return l->name; |
400 | } | 389 | } |
401 | 390 | ||
402 | static u32 link_own_addr(struct tipc_link *l) | ||
403 | { | ||
404 | return msg_prevnode(l->pmsg); | ||
405 | } | ||
406 | |||
407 | void tipc_link_reinit(struct tipc_link *l, u32 addr) | ||
408 | { | ||
409 | msg_set_prevnode(l->pmsg, addr); | ||
410 | } | ||
411 | |||
412 | /** | 391 | /** |
413 | * tipc_link_create - create a new link | 392 | * tipc_link_create - create a new link |
414 | * @n: pointer to associated node | 393 | * @n: pointer to associated node |
@@ -442,29 +421,22 @@ bool tipc_link_create(struct net *net, char *if_name, int bearer_id, | |||
442 | struct tipc_link **link) | 421 | struct tipc_link **link) |
443 | { | 422 | { |
444 | struct tipc_link *l; | 423 | struct tipc_link *l; |
445 | struct tipc_msg *hdr; | ||
446 | 424 | ||
447 | l = kzalloc(sizeof(*l), GFP_ATOMIC); | 425 | l = kzalloc(sizeof(*l), GFP_ATOMIC); |
448 | if (!l) | 426 | if (!l) |
449 | return false; | 427 | return false; |
450 | *link = l; | 428 | *link = l; |
451 | l->pmsg = (struct tipc_msg *)&l->proto_msg; | 429 | l->session = session; |
452 | hdr = l->pmsg; | ||
453 | tipc_msg_init(ownnode, hdr, LINK_PROTOCOL, RESET_MSG, INT_H_SIZE, peer); | ||
454 | msg_set_size(hdr, sizeof(l->proto_msg)); | ||
455 | msg_set_session(hdr, session); | ||
456 | msg_set_bearer_id(hdr, l->bearer_id); | ||
457 | 430 | ||
458 | /* Note: peer i/f name is completed by reset/activate message */ | 431 | /* Note: peer i/f name is completed by reset/activate message */ |
459 | sprintf(l->name, "%u.%u.%u:%s-%u.%u.%u:unknown", | 432 | sprintf(l->name, "%u.%u.%u:%s-%u.%u.%u:unknown", |
460 | tipc_zone(ownnode), tipc_cluster(ownnode), tipc_node(ownnode), | 433 | tipc_zone(ownnode), tipc_cluster(ownnode), tipc_node(ownnode), |
461 | if_name, tipc_zone(peer), tipc_cluster(peer), tipc_node(peer)); | 434 | if_name, tipc_zone(peer), tipc_cluster(peer), tipc_node(peer)); |
462 | strcpy((char *)msg_data(hdr), if_name); | 435 | strcpy(l->if_name, if_name); |
463 | |||
464 | l->addr = peer; | 436 | l->addr = peer; |
465 | l->peer_caps = peer_caps; | 437 | l->peer_caps = peer_caps; |
466 | l->net = net; | 438 | l->net = net; |
467 | l->peer_session = WILDCARD_SESSION; | 439 | l->peer_session = ANY_SESSION; |
468 | l->bearer_id = bearer_id; | 440 | l->bearer_id = bearer_id; |
469 | l->tolerance = tolerance; | 441 | l->tolerance = tolerance; |
470 | l->net_plane = net_plane; | 442 | l->net_plane = net_plane; |
@@ -791,7 +763,7 @@ static int link_schedule_user(struct tipc_link *link, struct sk_buff_head *list) | |||
791 | struct tipc_msg *msg = buf_msg(skb_peek(list)); | 763 | struct tipc_msg *msg = buf_msg(skb_peek(list)); |
792 | int imp = msg_importance(msg); | 764 | int imp = msg_importance(msg); |
793 | u32 oport = msg_origport(msg); | 765 | u32 oport = msg_origport(msg); |
794 | u32 addr = link_own_addr(link); | 766 | u32 addr = tipc_own_addr(link->net); |
795 | struct sk_buff *skb; | 767 | struct sk_buff *skb; |
796 | 768 | ||
797 | /* This really cannot happen... */ | 769 | /* This really cannot happen... */ |
@@ -840,16 +812,9 @@ void link_prepare_wakeup(struct tipc_link *l) | |||
840 | 812 | ||
841 | void tipc_link_reset(struct tipc_link *l) | 813 | void tipc_link_reset(struct tipc_link *l) |
842 | { | 814 | { |
843 | /* Link is down, accept any session */ | 815 | l->peer_session = ANY_SESSION; |
844 | l->peer_session = WILDCARD_SESSION; | 816 | l->session++; |
845 | |||
846 | /* If peer is up, it only accepts an incremented session number */ | ||
847 | msg_set_session(l->pmsg, msg_session(l->pmsg) + 1); | ||
848 | |||
849 | /* Prepare for renewed mtu size negotiation */ | ||
850 | l->mtu = l->advertised_mtu; | 817 | l->mtu = l->advertised_mtu; |
851 | |||
852 | /* Clean up all queues and counters: */ | ||
853 | __skb_queue_purge(&l->transmq); | 818 | __skb_queue_purge(&l->transmq); |
854 | __skb_queue_purge(&l->deferdq); | 819 | __skb_queue_purge(&l->deferdq); |
855 | skb_queue_splice_init(&l->wakeupq, l->inputq); | 820 | skb_queue_splice_init(&l->wakeupq, l->inputq); |
@@ -904,8 +869,10 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list, | |||
904 | if (unlikely(l->backlog[i].len >= l->backlog[i].limit)) | 869 | if (unlikely(l->backlog[i].len >= l->backlog[i].limit)) |
905 | return link_schedule_user(l, list); | 870 | return link_schedule_user(l, list); |
906 | } | 871 | } |
907 | if (unlikely(msg_size(hdr) > mtu)) | 872 | if (unlikely(msg_size(hdr) > mtu)) { |
873 | skb_queue_purge(list); | ||
908 | return -EMSGSIZE; | 874 | return -EMSGSIZE; |
875 | } | ||
909 | 876 | ||
910 | /* Prepare each packet for sending, and add to relevant queue: */ | 877 | /* Prepare each packet for sending, and add to relevant queue: */ |
911 | while (skb_queue_len(list)) { | 878 | while (skb_queue_len(list)) { |
@@ -917,8 +884,10 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list, | |||
917 | 884 | ||
918 | if (likely(skb_queue_len(transmq) < maxwin)) { | 885 | if (likely(skb_queue_len(transmq) < maxwin)) { |
919 | _skb = skb_clone(skb, GFP_ATOMIC); | 886 | _skb = skb_clone(skb, GFP_ATOMIC); |
920 | if (!_skb) | 887 | if (!_skb) { |
888 | skb_queue_purge(list); | ||
921 | return -ENOBUFS; | 889 | return -ENOBUFS; |
890 | } | ||
922 | __skb_dequeue(list); | 891 | __skb_dequeue(list); |
923 | __skb_queue_tail(transmq, skb); | 892 | __skb_queue_tail(transmq, skb); |
924 | __skb_queue_tail(xmitq, _skb); | 893 | __skb_queue_tail(xmitq, _skb); |
@@ -1153,7 +1122,7 @@ int tipc_link_build_ack_msg(struct tipc_link *l, struct sk_buff_head *xmitq) | |||
1153 | 1122 | ||
1154 | /* Broadcast ACK must be sent via a unicast link => defer to caller */ | 1123 | /* Broadcast ACK must be sent via a unicast link => defer to caller */ |
1155 | if (link_is_bc_rcvlink(l)) { | 1124 | if (link_is_bc_rcvlink(l)) { |
1156 | if (((l->rcv_nxt ^ link_own_addr(l)) & 0xf) != 0xf) | 1125 | if (((l->rcv_nxt ^ tipc_own_addr(l->net)) & 0xf) != 0xf) |
1157 | return 0; | 1126 | return 0; |
1158 | l->rcv_unacked = 0; | 1127 | l->rcv_unacked = 0; |
1159 | return TIPC_LINK_SND_BC_ACK; | 1128 | return TIPC_LINK_SND_BC_ACK; |
@@ -1261,39 +1230,34 @@ drop: | |||
1261 | return rc; | 1230 | return rc; |
1262 | } | 1231 | } |
1263 | 1232 | ||
1264 | /* | ||
1265 | * Send protocol message to the other endpoint. | ||
1266 | */ | ||
1267 | static void tipc_link_proto_xmit(struct tipc_link *l, u32 msg_typ, | ||
1268 | int probe_msg, u32 gap, u32 tolerance, | ||
1269 | u32 priority) | ||
1270 | { | ||
1271 | struct sk_buff *skb = NULL; | ||
1272 | struct sk_buff_head xmitq; | ||
1273 | |||
1274 | __skb_queue_head_init(&xmitq); | ||
1275 | tipc_link_build_proto_msg(l, msg_typ, probe_msg, gap, | ||
1276 | tolerance, priority, &xmitq); | ||
1277 | skb = __skb_dequeue(&xmitq); | ||
1278 | if (!skb) | ||
1279 | return; | ||
1280 | tipc_bearer_xmit_skb(l->net, l->bearer_id, skb, l->media_addr); | ||
1281 | l->rcv_unacked = 0; | ||
1282 | } | ||
1283 | |||
1284 | static void tipc_link_build_proto_msg(struct tipc_link *l, int mtyp, bool probe, | 1233 | static void tipc_link_build_proto_msg(struct tipc_link *l, int mtyp, bool probe, |
1285 | u16 rcvgap, int tolerance, int priority, | 1234 | u16 rcvgap, int tolerance, int priority, |
1286 | struct sk_buff_head *xmitq) | 1235 | struct sk_buff_head *xmitq) |
1287 | { | 1236 | { |
1288 | struct sk_buff *skb = NULL; | 1237 | struct sk_buff *skb; |
1289 | struct tipc_msg *hdr = l->pmsg; | 1238 | struct tipc_msg *hdr; |
1239 | struct sk_buff_head *dfq = &l->deferdq; | ||
1290 | bool node_up = link_is_up(l->bc_rcvlink); | 1240 | bool node_up = link_is_up(l->bc_rcvlink); |
1291 | 1241 | ||
1292 | /* Don't send protocol message during reset or link failover */ | 1242 | /* Don't send protocol message during reset or link failover */ |
1293 | if (tipc_link_is_blocked(l)) | 1243 | if (tipc_link_is_blocked(l)) |
1294 | return; | 1244 | return; |
1295 | 1245 | ||
1296 | msg_set_type(hdr, mtyp); | 1246 | if (!tipc_link_is_up(l) && (mtyp == STATE_MSG)) |
1247 | return; | ||
1248 | |||
1249 | if (!skb_queue_empty(dfq)) | ||
1250 | rcvgap = buf_seqno(skb_peek(dfq)) - l->rcv_nxt; | ||
1251 | |||
1252 | skb = tipc_msg_create(LINK_PROTOCOL, mtyp, INT_H_SIZE, | ||
1253 | TIPC_MAX_IF_NAME, l->addr, | ||
1254 | tipc_own_addr(l->net), 0, 0, 0); | ||
1255 | if (!skb) | ||
1256 | return; | ||
1257 | |||
1258 | hdr = buf_msg(skb); | ||
1259 | msg_set_session(hdr, l->session); | ||
1260 | msg_set_bearer_id(hdr, l->bearer_id); | ||
1297 | msg_set_net_plane(hdr, l->net_plane); | 1261 | msg_set_net_plane(hdr, l->net_plane); |
1298 | msg_set_next_sent(hdr, l->snd_nxt); | 1262 | msg_set_next_sent(hdr, l->snd_nxt); |
1299 | msg_set_ack(hdr, l->rcv_nxt - 1); | 1263 | msg_set_ack(hdr, l->rcv_nxt - 1); |
@@ -1303,36 +1267,23 @@ static void tipc_link_build_proto_msg(struct tipc_link *l, int mtyp, bool probe, | |||
1303 | msg_set_linkprio(hdr, priority); | 1267 | msg_set_linkprio(hdr, priority); |
1304 | msg_set_redundant_link(hdr, node_up); | 1268 | msg_set_redundant_link(hdr, node_up); |
1305 | msg_set_seq_gap(hdr, 0); | 1269 | msg_set_seq_gap(hdr, 0); |
1306 | |||
1307 | /* Compatibility: created msg must not be in sequence with pkt flow */ | ||
1308 | msg_set_seqno(hdr, l->snd_nxt + U16_MAX / 2); | 1270 | msg_set_seqno(hdr, l->snd_nxt + U16_MAX / 2); |
1309 | 1271 | ||
1310 | if (mtyp == STATE_MSG) { | 1272 | if (mtyp == STATE_MSG) { |
1311 | if (!tipc_link_is_up(l)) | 1273 | msg_set_seq_gap(hdr, rcvgap); |
1312 | return; | 1274 | msg_set_size(hdr, INT_H_SIZE); |
1313 | |||
1314 | /* Override rcvgap if there are packets in deferred queue */ | ||
1315 | if (!skb_queue_empty(&l->deferdq)) | ||
1316 | rcvgap = buf_seqno(skb_peek(&l->deferdq)) - l->rcv_nxt; | ||
1317 | if (rcvgap) { | ||
1318 | msg_set_seq_gap(hdr, rcvgap); | ||
1319 | l->stats.sent_nacks++; | ||
1320 | } | ||
1321 | msg_set_probe(hdr, probe); | 1275 | msg_set_probe(hdr, probe); |
1322 | if (probe) | ||
1323 | l->stats.sent_probes++; | ||
1324 | l->stats.sent_states++; | 1276 | l->stats.sent_states++; |
1325 | l->rcv_unacked = 0; | 1277 | l->rcv_unacked = 0; |
1326 | } else { | 1278 | } else { |
1327 | /* RESET_MSG or ACTIVATE_MSG */ | 1279 | /* RESET_MSG or ACTIVATE_MSG */ |
1328 | msg_set_max_pkt(hdr, l->advertised_mtu); | 1280 | msg_set_max_pkt(hdr, l->advertised_mtu); |
1329 | msg_set_ack(hdr, l->rcv_nxt - 1); | 1281 | strcpy(msg_data(hdr), l->if_name); |
1330 | msg_set_next_sent(hdr, 1); | ||
1331 | } | 1282 | } |
1332 | skb = tipc_buf_acquire(msg_size(hdr)); | 1283 | if (probe) |
1333 | if (!skb) | 1284 | l->stats.sent_probes++; |
1334 | return; | 1285 | if (rcvgap) |
1335 | skb_copy_to_linear_data(skb, hdr, msg_size(hdr)); | 1286 | l->stats.sent_nacks++; |
1336 | skb->priority = TC_PRIO_CONTROL; | 1287 | skb->priority = TC_PRIO_CONTROL; |
1337 | __skb_queue_tail(xmitq, skb); | 1288 | __skb_queue_tail(xmitq, skb); |
1338 | } | 1289 | } |
@@ -1357,7 +1308,7 @@ void tipc_link_tnl_prepare(struct tipc_link *l, struct tipc_link *tnl, | |||
1357 | 1308 | ||
1358 | /* At least one packet required for safe algorithm => add dummy */ | 1309 | /* At least one packet required for safe algorithm => add dummy */ |
1359 | skb = tipc_msg_create(TIPC_LOW_IMPORTANCE, TIPC_DIRECT_MSG, | 1310 | skb = tipc_msg_create(TIPC_LOW_IMPORTANCE, TIPC_DIRECT_MSG, |
1360 | BASIC_H_SIZE, 0, l->addr, link_own_addr(l), | 1311 | BASIC_H_SIZE, 0, l->addr, tipc_own_addr(l->net), |
1361 | 0, 0, TIPC_ERR_NO_PORT); | 1312 | 0, 0, TIPC_ERR_NO_PORT); |
1362 | if (!skb) { | 1313 | if (!skb) { |
1363 | pr_warn("%sunable to create tunnel packet\n", link_co_err); | 1314 | pr_warn("%sunable to create tunnel packet\n", link_co_err); |
@@ -1368,7 +1319,7 @@ void tipc_link_tnl_prepare(struct tipc_link *l, struct tipc_link *tnl, | |||
1368 | __skb_queue_purge(&tmpxq); | 1319 | __skb_queue_purge(&tmpxq); |
1369 | 1320 | ||
1370 | /* Initialize reusable tunnel packet header */ | 1321 | /* Initialize reusable tunnel packet header */ |
1371 | tipc_msg_init(link_own_addr(l), &tnlhdr, TUNNEL_PROTOCOL, | 1322 | tipc_msg_init(tipc_own_addr(l->net), &tnlhdr, TUNNEL_PROTOCOL, |
1372 | mtyp, INT_H_SIZE, l->addr); | 1323 | mtyp, INT_H_SIZE, l->addr); |
1373 | pktcnt = skb_queue_len(&l->transmq) + skb_queue_len(&l->backlogq); | 1324 | pktcnt = skb_queue_len(&l->transmq) + skb_queue_len(&l->backlogq); |
1374 | msg_set_msgcnt(&tnlhdr, pktcnt); | 1325 | msg_set_msgcnt(&tnlhdr, pktcnt); |
@@ -1427,7 +1378,7 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb, | |||
1427 | if (tipc_link_is_blocked(l) || !xmitq) | 1378 | if (tipc_link_is_blocked(l) || !xmitq) |
1428 | goto exit; | 1379 | goto exit; |
1429 | 1380 | ||
1430 | if (link_own_addr(l) > msg_prevnode(hdr)) | 1381 | if (tipc_own_addr(l->net) > msg_prevnode(hdr)) |
1431 | l->net_plane = msg_net_plane(hdr); | 1382 | l->net_plane = msg_net_plane(hdr); |
1432 | 1383 | ||
1433 | switch (mtyp) { | 1384 | switch (mtyp) { |
@@ -1435,7 +1386,7 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb, | |||
1435 | 1386 | ||
1436 | /* Ignore duplicate RESET with old session number */ | 1387 | /* Ignore duplicate RESET with old session number */ |
1437 | if ((less_eq(msg_session(hdr), l->peer_session)) && | 1388 | if ((less_eq(msg_session(hdr), l->peer_session)) && |
1438 | (l->peer_session != WILDCARD_SESSION)) | 1389 | (l->peer_session != ANY_SESSION)) |
1439 | break; | 1390 | break; |
1440 | /* fall thru' */ | 1391 | /* fall thru' */ |
1441 | 1392 | ||
@@ -1479,6 +1430,12 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb, | |||
1479 | if (in_range(peers_tol, TIPC_MIN_LINK_TOL, TIPC_MAX_LINK_TOL)) | 1430 | if (in_range(peers_tol, TIPC_MIN_LINK_TOL, TIPC_MAX_LINK_TOL)) |
1480 | l->tolerance = peers_tol; | 1431 | l->tolerance = peers_tol; |
1481 | 1432 | ||
1433 | if (peers_prio && in_range(peers_prio, TIPC_MIN_LINK_PRI, | ||
1434 | TIPC_MAX_LINK_PRI)) { | ||
1435 | l->priority = peers_prio; | ||
1436 | rc = tipc_link_fsm_evt(l, LINK_FAILURE_EVT); | ||
1437 | } | ||
1438 | |||
1482 | l->silent_intv_cnt = 0; | 1439 | l->silent_intv_cnt = 0; |
1483 | l->stats.recv_states++; | 1440 | l->stats.recv_states++; |
1484 | if (msg_probe(hdr)) | 1441 | if (msg_probe(hdr)) |
@@ -1526,7 +1483,7 @@ static bool tipc_link_build_bc_proto_msg(struct tipc_link *l, bool bcast, | |||
1526 | u16 gap_to = peers_snd_nxt - 1; | 1483 | u16 gap_to = peers_snd_nxt - 1; |
1527 | 1484 | ||
1528 | skb = tipc_msg_create(BCAST_PROTOCOL, STATE_MSG, INT_H_SIZE, | 1485 | skb = tipc_msg_create(BCAST_PROTOCOL, STATE_MSG, INT_H_SIZE, |
1529 | 0, l->addr, link_own_addr(l), 0, 0, 0); | 1486 | 0, l->addr, tipc_own_addr(l->net), 0, 0, 0); |
1530 | if (!skb) | 1487 | if (!skb) |
1531 | return false; | 1488 | return false; |
1532 | hdr = buf_msg(skb); | 1489 | hdr = buf_msg(skb); |
@@ -1681,7 +1638,7 @@ int tipc_link_bc_nack_rcv(struct tipc_link *l, struct sk_buff *skb, | |||
1681 | if (mtyp != STATE_MSG) | 1638 | if (mtyp != STATE_MSG) |
1682 | return 0; | 1639 | return 0; |
1683 | 1640 | ||
1684 | if (dnode == link_own_addr(l)) { | 1641 | if (dnode == tipc_own_addr(l->net)) { |
1685 | tipc_link_bc_ack_rcv(l, acked, xmitq); | 1642 | tipc_link_bc_ack_rcv(l, acked, xmitq); |
1686 | rc = tipc_link_retrans(l->bc_sndlink, from, to, xmitq); | 1643 | rc = tipc_link_retrans(l->bc_sndlink, from, to, xmitq); |
1687 | l->stats.recv_nacks++; | 1644 | l->stats.recv_nacks++; |
@@ -1973,8 +1930,10 @@ int tipc_nl_add_bc_link(struct net *net, struct tipc_nl_msg *msg) | |||
1973 | 1930 | ||
1974 | hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family, | 1931 | hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family, |
1975 | NLM_F_MULTI, TIPC_NL_LINK_GET); | 1932 | NLM_F_MULTI, TIPC_NL_LINK_GET); |
1976 | if (!hdr) | 1933 | if (!hdr) { |
1934 | tipc_bcast_unlock(net); | ||
1977 | return -EMSGSIZE; | 1935 | return -EMSGSIZE; |
1936 | } | ||
1978 | 1937 | ||
1979 | attrs = nla_nest_start(msg->skb, TIPC_NLA_LINK); | 1938 | attrs = nla_nest_start(msg->skb, TIPC_NLA_LINK); |
1980 | if (!attrs) | 1939 | if (!attrs) |
@@ -2021,16 +1980,18 @@ msg_full: | |||
2021 | return -EMSGSIZE; | 1980 | return -EMSGSIZE; |
2022 | } | 1981 | } |
2023 | 1982 | ||
2024 | void tipc_link_set_tolerance(struct tipc_link *l, u32 tol) | 1983 | void tipc_link_set_tolerance(struct tipc_link *l, u32 tol, |
1984 | struct sk_buff_head *xmitq) | ||
2025 | { | 1985 | { |
2026 | l->tolerance = tol; | 1986 | l->tolerance = tol; |
2027 | tipc_link_proto_xmit(l, STATE_MSG, 0, 0, tol, 0); | 1987 | tipc_link_build_proto_msg(l, STATE_MSG, 0, 0, tol, 0, xmitq); |
2028 | } | 1988 | } |
2029 | 1989 | ||
2030 | void tipc_link_set_prio(struct tipc_link *l, u32 prio) | 1990 | void tipc_link_set_prio(struct tipc_link *l, u32 prio, |
1991 | struct sk_buff_head *xmitq) | ||
2031 | { | 1992 | { |
2032 | l->priority = prio; | 1993 | l->priority = prio; |
2033 | tipc_link_proto_xmit(l, STATE_MSG, 0, 0, 0, prio); | 1994 | tipc_link_build_proto_msg(l, STATE_MSG, 0, 0, 0, prio, xmitq); |
2034 | } | 1995 | } |
2035 | 1996 | ||
2036 | void tipc_link_set_abort_limit(struct tipc_link *l, u32 limit) | 1997 | void tipc_link_set_abort_limit(struct tipc_link *l, u32 limit) |