diff options
-rw-r--r-- | net/tipc/bcast.c | 1 | ||||
-rw-r--r-- | net/tipc/link.c | 40 | ||||
-rw-r--r-- | net/tipc/msg.c | 5 | ||||
-rw-r--r-- | net/tipc/msg.h | 65 |
4 files changed, 50 insertions, 61 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c index 17cb0ff5f344..5aff0844d4d3 100644 --- a/net/tipc/bcast.c +++ b/net/tipc/bcast.c | |||
@@ -383,7 +383,6 @@ int tipc_bclink_xmit(struct net *net, struct sk_buff_head *list) | |||
383 | __skb_queue_purge(list); | 383 | __skb_queue_purge(list); |
384 | return -EHOSTUNREACH; | 384 | return -EHOSTUNREACH; |
385 | } | 385 | } |
386 | |||
387 | /* Broadcast to all nodes */ | 386 | /* Broadcast to all nodes */ |
388 | if (likely(bclink)) { | 387 | if (likely(bclink)) { |
389 | tipc_bclink_lock(net); | 388 | tipc_bclink_lock(net); |
diff --git a/net/tipc/link.c b/net/tipc/link.c index 7e0036f5a364..bc49120bfb44 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
@@ -35,6 +35,7 @@ | |||
35 | */ | 35 | */ |
36 | 36 | ||
37 | #include "core.h" | 37 | #include "core.h" |
38 | #include "subscr.h" | ||
38 | #include "link.h" | 39 | #include "link.h" |
39 | #include "bcast.h" | 40 | #include "bcast.h" |
40 | #include "socket.h" | 41 | #include "socket.h" |
@@ -305,12 +306,10 @@ struct tipc_link *tipc_link_create(struct tipc_node *n_ptr, | |||
305 | msg_set_session(msg, (tn->random & 0xffff)); | 306 | msg_set_session(msg, (tn->random & 0xffff)); |
306 | msg_set_bearer_id(msg, b_ptr->identity); | 307 | msg_set_bearer_id(msg, b_ptr->identity); |
307 | strcpy((char *)msg_data(msg), if_name); | 308 | strcpy((char *)msg_data(msg), if_name); |
308 | |||
309 | l_ptr->priority = b_ptr->priority; | ||
310 | tipc_link_set_queue_limits(l_ptr, b_ptr->window); | ||
311 | |||
312 | l_ptr->net_plane = b_ptr->net_plane; | 309 | l_ptr->net_plane = b_ptr->net_plane; |
313 | link_init_max_pkt(l_ptr); | 310 | link_init_max_pkt(l_ptr); |
311 | l_ptr->priority = b_ptr->priority; | ||
312 | tipc_link_set_queue_limits(l_ptr, b_ptr->window); | ||
314 | 313 | ||
315 | l_ptr->next_out_no = 1; | 314 | l_ptr->next_out_no = 1; |
316 | __skb_queue_head_init(&l_ptr->transmq); | 315 | __skb_queue_head_init(&l_ptr->transmq); |
@@ -708,7 +707,7 @@ static int tipc_link_cong(struct tipc_link *link, struct sk_buff_head *list) | |||
708 | { | 707 | { |
709 | struct sk_buff *skb = skb_peek(list); | 708 | struct sk_buff *skb = skb_peek(list); |
710 | struct tipc_msg *msg = buf_msg(skb); | 709 | struct tipc_msg *msg = buf_msg(skb); |
711 | uint imp = tipc_msg_tot_importance(msg); | 710 | int imp = msg_importance(msg); |
712 | u32 oport = msg_tot_origport(msg); | 711 | u32 oport = msg_tot_origport(msg); |
713 | 712 | ||
714 | if (unlikely(imp > TIPC_CRITICAL_IMPORTANCE)) { | 713 | if (unlikely(imp > TIPC_CRITICAL_IMPORTANCE)) { |
@@ -745,7 +744,7 @@ int __tipc_link_xmit(struct net *net, struct tipc_link *link, | |||
745 | { | 744 | { |
746 | struct tipc_msg *msg = buf_msg(skb_peek(list)); | 745 | struct tipc_msg *msg = buf_msg(skb_peek(list)); |
747 | unsigned int maxwin = link->window; | 746 | unsigned int maxwin = link->window; |
748 | uint imp = tipc_msg_tot_importance(msg); | 747 | unsigned int imp = msg_importance(msg); |
749 | uint mtu = link->max_pkt; | 748 | uint mtu = link->max_pkt; |
750 | uint ack = mod(link->next_in_no - 1); | 749 | uint ack = mod(link->next_in_no - 1); |
751 | uint seqno = link->next_out_no; | 750 | uint seqno = link->next_out_no; |
@@ -755,7 +754,7 @@ int __tipc_link_xmit(struct net *net, struct tipc_link *link, | |||
755 | struct sk_buff_head *backlogq = &link->backlogq; | 754 | struct sk_buff_head *backlogq = &link->backlogq; |
756 | struct sk_buff *skb, *tmp; | 755 | struct sk_buff *skb, *tmp; |
757 | 756 | ||
758 | /* Match queue limits against msg importance: */ | 757 | /* Match queue limit against msg importance: */ |
759 | if (unlikely(skb_queue_len(backlogq) >= link->queue_limit[imp])) | 758 | if (unlikely(skb_queue_len(backlogq) >= link->queue_limit[imp])) |
760 | return tipc_link_cong(link, list); | 759 | return tipc_link_cong(link, list); |
761 | 760 | ||
@@ -1811,25 +1810,16 @@ static void link_set_supervision_props(struct tipc_link *l_ptr, u32 tol) | |||
1811 | l_ptr->abort_limit = tol / (jiffies_to_msecs(l_ptr->cont_intv) / 4); | 1810 | l_ptr->abort_limit = tol / (jiffies_to_msecs(l_ptr->cont_intv) / 4); |
1812 | } | 1811 | } |
1813 | 1812 | ||
1814 | void tipc_link_set_queue_limits(struct tipc_link *l_ptr, u32 window) | 1813 | void tipc_link_set_queue_limits(struct tipc_link *l, u32 win) |
1815 | { | 1814 | { |
1816 | l_ptr->window = window; | 1815 | int max_bulk = TIPC_MAX_PUBLICATIONS / (l->max_pkt / ITEM_SIZE); |
1817 | 1816 | ||
1818 | /* Data messages from this node, inclusive FIRST_FRAGM */ | 1817 | l->window = win; |
1819 | l_ptr->queue_limit[TIPC_LOW_IMPORTANCE] = window; | 1818 | l->queue_limit[TIPC_LOW_IMPORTANCE] = win / 2; |
1820 | l_ptr->queue_limit[TIPC_MEDIUM_IMPORTANCE] = (window / 3) * 4; | 1819 | l->queue_limit[TIPC_MEDIUM_IMPORTANCE] = win; |
1821 | l_ptr->queue_limit[TIPC_HIGH_IMPORTANCE] = (window / 3) * 5; | 1820 | l->queue_limit[TIPC_HIGH_IMPORTANCE] = win / 2 * 3; |
1822 | l_ptr->queue_limit[TIPC_CRITICAL_IMPORTANCE] = (window / 3) * 6; | 1821 | l->queue_limit[TIPC_CRITICAL_IMPORTANCE] = win * 2; |
1823 | /* Transiting data messages,inclusive FIRST_FRAGM */ | 1822 | l->queue_limit[TIPC_SYSTEM_IMPORTANCE] = max_bulk; |
1824 | l_ptr->queue_limit[TIPC_LOW_IMPORTANCE + 4] = 300; | ||
1825 | l_ptr->queue_limit[TIPC_MEDIUM_IMPORTANCE + 4] = 600; | ||
1826 | l_ptr->queue_limit[TIPC_HIGH_IMPORTANCE + 4] = 900; | ||
1827 | l_ptr->queue_limit[TIPC_CRITICAL_IMPORTANCE + 4] = 1200; | ||
1828 | l_ptr->queue_limit[CONN_MANAGER] = 1200; | ||
1829 | l_ptr->queue_limit[CHANGEOVER_PROTOCOL] = 2500; | ||
1830 | l_ptr->queue_limit[NAME_DISTRIBUTOR] = 3000; | ||
1831 | /* FRAGMENT and LAST_FRAGMENT packets */ | ||
1832 | l_ptr->queue_limit[MSG_FRAGMENTER] = 4000; | ||
1833 | } | 1823 | } |
1834 | 1824 | ||
1835 | /* tipc_link_find_owner - locate owner node of link by link's name | 1825 | /* tipc_link_find_owner - locate owner node of link by link's name |
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index 47c8fd8e2fb2..0c6dad8180a0 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
@@ -272,6 +272,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m, | |||
272 | FIRST_FRAGMENT, INT_H_SIZE, msg_destnode(mhdr)); | 272 | FIRST_FRAGMENT, INT_H_SIZE, msg_destnode(mhdr)); |
273 | msg_set_size(&pkthdr, pktmax); | 273 | msg_set_size(&pkthdr, pktmax); |
274 | msg_set_fragm_no(&pkthdr, pktno); | 274 | msg_set_fragm_no(&pkthdr, pktno); |
275 | msg_set_importance(&pkthdr, msg_importance(mhdr)); | ||
275 | 276 | ||
276 | /* Prepare first fragment */ | 277 | /* Prepare first fragment */ |
277 | skb = tipc_buf_acquire(pktmax); | 278 | skb = tipc_buf_acquire(pktmax); |
@@ -467,7 +468,6 @@ bool tipc_msg_reverse(u32 own_addr, struct sk_buff *buf, u32 *dnode, | |||
467 | int err) | 468 | int err) |
468 | { | 469 | { |
469 | struct tipc_msg *msg = buf_msg(buf); | 470 | struct tipc_msg *msg = buf_msg(buf); |
470 | uint imp = msg_importance(msg); | ||
471 | struct tipc_msg ohdr; | 471 | struct tipc_msg ohdr; |
472 | uint rdsz = min_t(uint, msg_data_sz(msg), MAX_FORWARD_SIZE); | 472 | uint rdsz = min_t(uint, msg_data_sz(msg), MAX_FORWARD_SIZE); |
473 | 473 | ||
@@ -479,9 +479,6 @@ bool tipc_msg_reverse(u32 own_addr, struct sk_buff *buf, u32 *dnode, | |||
479 | if (msg_errcode(msg)) | 479 | if (msg_errcode(msg)) |
480 | goto exit; | 480 | goto exit; |
481 | memcpy(&ohdr, msg, msg_hdr_sz(msg)); | 481 | memcpy(&ohdr, msg, msg_hdr_sz(msg)); |
482 | imp = min_t(uint, imp + 1, TIPC_CRITICAL_IMPORTANCE); | ||
483 | if (msg_isdata(msg)) | ||
484 | msg_set_importance(msg, imp); | ||
485 | msg_set_errcode(msg, err); | 482 | msg_set_errcode(msg, err); |
486 | msg_set_origport(msg, msg_destport(&ohdr)); | 483 | msg_set_origport(msg, msg_destport(&ohdr)); |
487 | msg_set_destport(msg, msg_origport(&ohdr)); | 484 | msg_set_destport(msg, msg_origport(&ohdr)); |
diff --git a/net/tipc/msg.h b/net/tipc/msg.h index e5fc5fdb2ea7..bd3969a80dd4 100644 --- a/net/tipc/msg.h +++ b/net/tipc/msg.h | |||
@@ -54,6 +54,8 @@ struct plist; | |||
54 | * - TIPC_HIGH_IMPORTANCE | 54 | * - TIPC_HIGH_IMPORTANCE |
55 | * - TIPC_CRITICAL_IMPORTANCE | 55 | * - TIPC_CRITICAL_IMPORTANCE |
56 | */ | 56 | */ |
57 | #define TIPC_SYSTEM_IMPORTANCE 4 | ||
58 | |||
57 | 59 | ||
58 | /* | 60 | /* |
59 | * Payload message types | 61 | * Payload message types |
@@ -64,6 +66,19 @@ struct plist; | |||
64 | #define TIPC_DIRECT_MSG 3 | 66 | #define TIPC_DIRECT_MSG 3 |
65 | 67 | ||
66 | /* | 68 | /* |
69 | * Internal message users | ||
70 | */ | ||
71 | #define BCAST_PROTOCOL 5 | ||
72 | #define MSG_BUNDLER 6 | ||
73 | #define LINK_PROTOCOL 7 | ||
74 | #define CONN_MANAGER 8 | ||
75 | #define CHANGEOVER_PROTOCOL 10 | ||
76 | #define NAME_DISTRIBUTOR 11 | ||
77 | #define MSG_FRAGMENTER 12 | ||
78 | #define LINK_CONFIG 13 | ||
79 | #define SOCK_WAKEUP 14 /* pseudo user */ | ||
80 | |||
81 | /* | ||
67 | * Message header sizes | 82 | * Message header sizes |
68 | */ | 83 | */ |
69 | #define SHORT_H_SIZE 24 /* In-cluster basic payload message */ | 84 | #define SHORT_H_SIZE 24 /* In-cluster basic payload message */ |
@@ -170,16 +185,6 @@ static inline void msg_set_user(struct tipc_msg *m, u32 n) | |||
170 | msg_set_bits(m, 0, 25, 0xf, n); | 185 | msg_set_bits(m, 0, 25, 0xf, n); |
171 | } | 186 | } |
172 | 187 | ||
173 | static inline u32 msg_importance(struct tipc_msg *m) | ||
174 | { | ||
175 | return msg_bits(m, 0, 25, 0xf); | ||
176 | } | ||
177 | |||
178 | static inline void msg_set_importance(struct tipc_msg *m, u32 i) | ||
179 | { | ||
180 | msg_set_user(m, i); | ||
181 | } | ||
182 | |||
183 | static inline u32 msg_hdr_sz(struct tipc_msg *m) | 188 | static inline u32 msg_hdr_sz(struct tipc_msg *m) |
184 | { | 189 | { |
185 | return msg_bits(m, 0, 21, 0xf) << 2; | 190 | return msg_bits(m, 0, 21, 0xf) << 2; |
@@ -336,6 +341,25 @@ static inline void msg_set_seqno(struct tipc_msg *m, u32 n) | |||
336 | /* | 341 | /* |
337 | * Words 3-10 | 342 | * Words 3-10 |
338 | */ | 343 | */ |
344 | static inline u32 msg_importance(struct tipc_msg *m) | ||
345 | { | ||
346 | if (unlikely(msg_user(m) == MSG_FRAGMENTER)) | ||
347 | return msg_bits(m, 5, 13, 0x7); | ||
348 | if (likely(msg_isdata(m) && !msg_errcode(m))) | ||
349 | return msg_user(m); | ||
350 | return TIPC_SYSTEM_IMPORTANCE; | ||
351 | } | ||
352 | |||
353 | static inline void msg_set_importance(struct tipc_msg *m, u32 i) | ||
354 | { | ||
355 | if (unlikely(msg_user(m) == MSG_FRAGMENTER)) | ||
356 | msg_set_bits(m, 5, 13, 0x7, i); | ||
357 | else if (likely(i < TIPC_SYSTEM_IMPORTANCE)) | ||
358 | msg_set_user(m, i); | ||
359 | else | ||
360 | pr_warn("Trying to set illegal importance in message\n"); | ||
361 | } | ||
362 | |||
339 | static inline u32 msg_prevnode(struct tipc_msg *m) | 363 | static inline u32 msg_prevnode(struct tipc_msg *m) |
340 | { | 364 | { |
341 | return msg_word(m, 3); | 365 | return msg_word(m, 3); |
@@ -458,20 +482,6 @@ static inline struct tipc_msg *msg_get_wrapped(struct tipc_msg *m) | |||
458 | */ | 482 | */ |
459 | 483 | ||
460 | /* | 484 | /* |
461 | * Internal message users | ||
462 | */ | ||
463 | #define BCAST_PROTOCOL 5 | ||
464 | #define MSG_BUNDLER 6 | ||
465 | #define LINK_PROTOCOL 7 | ||
466 | #define CONN_MANAGER 8 | ||
467 | #define ROUTE_DISTRIBUTOR 9 /* obsoleted */ | ||
468 | #define CHANGEOVER_PROTOCOL 10 | ||
469 | #define NAME_DISTRIBUTOR 11 | ||
470 | #define MSG_FRAGMENTER 12 | ||
471 | #define LINK_CONFIG 13 | ||
472 | #define SOCK_WAKEUP 14 /* pseudo user */ | ||
473 | |||
474 | /* | ||
475 | * Connection management protocol message types | 485 | * Connection management protocol message types |
476 | */ | 486 | */ |
477 | #define CONN_PROBE 0 | 487 | #define CONN_PROBE 0 |
@@ -743,13 +753,6 @@ static inline void msg_set_link_tolerance(struct tipc_msg *m, u32 n) | |||
743 | msg_set_bits(m, 9, 0, 0xffff, n); | 753 | msg_set_bits(m, 9, 0, 0xffff, n); |
744 | } | 754 | } |
745 | 755 | ||
746 | static inline u32 tipc_msg_tot_importance(struct tipc_msg *m) | ||
747 | { | ||
748 | if ((msg_user(m) == MSG_FRAGMENTER) && (msg_type(m) == FIRST_FRAGMENT)) | ||
749 | return msg_importance(msg_get_wrapped(m)); | ||
750 | return msg_importance(m); | ||
751 | } | ||
752 | |||
753 | static inline u32 msg_tot_origport(struct tipc_msg *m) | 756 | static inline u32 msg_tot_origport(struct tipc_msg *m) |
754 | { | 757 | { |
755 | if ((msg_user(m) == MSG_FRAGMENTER) && (msg_type(m) == FIRST_FRAGMENT)) | 758 | if ((msg_user(m) == MSG_FRAGMENTER) && (msg_type(m) == FIRST_FRAGMENT)) |