aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/link.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/tipc/link.c')
-rw-r--r--net/tipc/link.c171
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 {
123struct tipc_link { 123struct 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 {
196static const char *link_co_err = "Link tunneling error, "; 192static const char *link_co_err = "Link tunneling error, ";
197static const char *link_rst_msg = "Resetting link "; 193static const char *link_rst_msg = "Resetting link ";
198 194
199/* Properties valid for media, bearar and link */
200static 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 */
209enum { 197enum {
@@ -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
402static u32 link_own_addr(struct tipc_link *l)
403{
404 return msg_prevnode(l->pmsg);
405}
406
407void 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
841void tipc_link_reset(struct tipc_link *l) 813void 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 */
1267static 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
1284static void tipc_link_build_proto_msg(struct tipc_link *l, int mtyp, bool probe, 1233static 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
2024void tipc_link_set_tolerance(struct tipc_link *l, u32 tol) 1983void 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
2030void tipc_link_set_prio(struct tipc_link *l, u32 prio) 1990void 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
2036void tipc_link_set_abort_limit(struct tipc_link *l, u32 limit) 1997void tipc_link_set_abort_limit(struct tipc_link *l, u32 limit)