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); | ||
