aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2015-10-22 08:51:43 -0400
committerDavid S. Miller <davem@davemloft.net>2015-10-24 09:56:40 -0400
commit959e1781aa230aecc90e4deb80117fd9a53dede7 (patch)
tree623deab93b0a27fe2208d1c1da55741d6cd926bc /net/tipc
parentb06b281e79375fcbd9ffaec7c5fdc350b888d089 (diff)
tipc: introduce jumbo frame support for broadcast
Until now, we have only been supporting a fix MTU size of 1500 bytes for all broadcast media, irrespective of their actual capability. We now make the broadcast MTU adaptable to the carrying media, i.e., we use the smallest MTU supported by any of the interfaces attached to TIPC. Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Reviewed-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/bcast.c15
-rw-r--r--net/tipc/bcast.h2
-rw-r--r--net/tipc/bearer.c13
-rw-r--r--net/tipc/bearer.h1
-rw-r--r--net/tipc/link.c10
-rw-r--r--net/tipc/link.h2
-rw-r--r--net/tipc/socket.c2
7 files changed, 39 insertions, 6 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c
index 74ee09ac430d..d8c399d31288 100644
--- a/net/tipc/bcast.c
+++ b/net/tipc/bcast.c
@@ -148,9 +148,9 @@ void tipc_bclink_input(struct net *net)
148 tipc_sk_mcast_rcv(net, &tn->bcbase->arrvq, &tn->bcbase->inputq); 148 tipc_sk_mcast_rcv(net, &tn->bcbase->arrvq, &tn->bcbase->inputq);
149} 149}
150 150
151uint tipc_bcast_get_mtu(void) 151int tipc_bcast_get_mtu(struct net *net)
152{ 152{
153 return MAX_PKT_DEFAULT_MCAST; 153 return tipc_link_mtu(tipc_bc_sndlink(net));
154} 154}
155 155
156static u16 bcbuf_acks(struct sk_buff *skb) 156static u16 bcbuf_acks(struct sk_buff *skb)
@@ -175,7 +175,7 @@ static void tipc_bcbase_select_primary(struct net *net)
175{ 175{
176 struct tipc_bc_base *bb = tipc_bc_base(net); 176 struct tipc_bc_base *bb = tipc_bc_base(net);
177 int all_dests = tipc_link_bc_peers(bb->link); 177 int all_dests = tipc_link_bc_peers(bb->link);
178 int i; 178 int i, mtu;
179 179
180 bb->primary_bearer = INVALID_BEARER_ID; 180 bb->primary_bearer = INVALID_BEARER_ID;
181 181
@@ -183,6 +183,13 @@ static void tipc_bcbase_select_primary(struct net *net)
183 return; 183 return;
184 184
185 for (i = 0; i < MAX_BEARERS; i++) { 185 for (i = 0; i < MAX_BEARERS; i++) {
186 if (!bb->dests[i])
187 continue;
188
189 mtu = tipc_bearer_mtu(net, i);
190 if (mtu < tipc_link_mtu(bb->link))
191 tipc_link_set_mtu(bb->link, mtu);
192
186 if (bb->dests[i] < all_dests) 193 if (bb->dests[i] < all_dests)
187 continue; 194 continue;
188 195
@@ -1220,7 +1227,7 @@ int tipc_bcast_init(struct net *net)
1220 bb->node.net = net; 1227 bb->node.net = net;
1221 1228
1222 if (!tipc_link_bc_create(&bb->node, 0, 0, 1229 if (!tipc_link_bc_create(&bb->node, 0, 0,
1223 MAX_PKT_DEFAULT_MCAST, 1230 U16_MAX,
1224 BCLINK_WIN_DEFAULT, 1231 BCLINK_WIN_DEFAULT,
1225 0, 1232 0,
1226 &bb->inputq, 1233 &bb->inputq,
diff --git a/net/tipc/bcast.h b/net/tipc/bcast.h
index 76b747a73b0b..0cc72200f1cd 100644
--- a/net/tipc/bcast.h
+++ b/net/tipc/bcast.h
@@ -63,7 +63,7 @@ void tipc_bcbearer_sort(struct net *net, struct tipc_node_map *nm_ptr,
63 u32 node, bool action); 63 u32 node, bool action);
64int tipc_bclink_reset_stats(struct net *net); 64int tipc_bclink_reset_stats(struct net *net);
65int tipc_bclink_set_queue_limits(struct net *net, u32 limit); 65int tipc_bclink_set_queue_limits(struct net *net, u32 limit);
66uint tipc_bcast_get_mtu(void); 66int tipc_bcast_get_mtu(struct net *net);
67int tipc_bcast_xmit(struct net *net, struct sk_buff_head *list); 67int tipc_bcast_xmit(struct net *net, struct sk_buff_head *list);
68int tipc_bcast_rcv(struct net *net, struct tipc_link *l, struct sk_buff *skb); 68int tipc_bcast_rcv(struct net *net, struct tipc_link *l, struct sk_buff *skb);
69void tipc_bcast_ack_rcv(struct net *net, struct tipc_link *l, u32 acked); 69void tipc_bcast_ack_rcv(struct net *net, struct tipc_link *l, u32 acked);
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index 62f47ecc6b84..b39f631fd6d7 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.c
@@ -464,6 +464,19 @@ void tipc_bearer_send(struct net *net, u32 bearer_id, struct sk_buff *buf,
464 rcu_read_unlock(); 464 rcu_read_unlock();
465} 465}
466 466
467int tipc_bearer_mtu(struct net *net, u32 bearer_id)
468{
469 int mtu = 0;
470 struct tipc_bearer *b;
471
472 rcu_read_lock();
473 b = rcu_dereference_rtnl(tipc_net(net)->bearer_list[bearer_id]);
474 if (b)
475 mtu = b->mtu;
476 rcu_read_unlock();
477 return mtu;
478}
479
467/* tipc_bearer_xmit() -send buffer to destination over bearer 480/* tipc_bearer_xmit() -send buffer to destination over bearer
468 */ 481 */
469void tipc_bearer_xmit(struct net *net, u32 bearer_id, 482void tipc_bearer_xmit(struct net *net, u32 bearer_id,
diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h
index 9fc1e074f7c0..2ba8a7e274a5 100644
--- a/net/tipc/bearer.h
+++ b/net/tipc/bearer.h
@@ -218,6 +218,7 @@ void tipc_bearer_cleanup(void);
218void tipc_bearer_stop(struct net *net); 218void tipc_bearer_stop(struct net *net);
219void tipc_bearer_send(struct net *net, u32 bearer_id, struct sk_buff *buf, 219void tipc_bearer_send(struct net *net, u32 bearer_id, struct sk_buff *buf,
220 struct tipc_media_addr *dest); 220 struct tipc_media_addr *dest);
221int tipc_bearer_mtu(struct net *net, u32 bearer_id);
221void tipc_bearer_xmit(struct net *net, u32 bearer_id, 222void tipc_bearer_xmit(struct net *net, u32 bearer_id,
222 struct sk_buff_head *xmitq, 223 struct sk_buff_head *xmitq,
223 struct tipc_media_addr *dst); 224 struct tipc_media_addr *dst);
diff --git a/net/tipc/link.c b/net/tipc/link.c
index ff725c398914..3b98f8e70626 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -212,6 +212,16 @@ int tipc_link_bc_peers(struct tipc_link *l)
212 return l->ackers; 212 return l->ackers;
213} 213}
214 214
215void tipc_link_set_mtu(struct tipc_link *l, int mtu)
216{
217 l->mtu = mtu;
218}
219
220int tipc_link_mtu(struct tipc_link *l)
221{
222 return l->mtu;
223}
224
215static u32 link_own_addr(struct tipc_link *l) 225static u32 link_own_addr(struct tipc_link *l)
216{ 226{
217 return msg_prevnode(l->pmsg); 227 return msg_prevnode(l->pmsg);
diff --git a/net/tipc/link.h b/net/tipc/link.h
index 28a6396b6d31..9b5198e90fdf 100644
--- a/net/tipc/link.h
+++ b/net/tipc/link.h
@@ -281,6 +281,8 @@ void tipc_link_remove_bc_peer(struct tipc_link *snd_l,
281 struct tipc_link *rcv_l, 281 struct tipc_link *rcv_l,
282 struct sk_buff_head *xmitq); 282 struct sk_buff_head *xmitq);
283int tipc_link_bc_peers(struct tipc_link *l); 283int tipc_link_bc_peers(struct tipc_link *l);
284void tipc_link_set_mtu(struct tipc_link *l, int mtu);
285int tipc_link_mtu(struct tipc_link *l);
284void tipc_link_bc_ack_rcv(struct tipc_link *l, u16 acked, 286void tipc_link_bc_ack_rcv(struct tipc_link *l, u16 acked,
285 struct sk_buff_head *xmitq); 287 struct sk_buff_head *xmitq);
286void tipc_link_build_bc_sync_msg(struct tipc_link *l, 288void tipc_link_build_bc_sync_msg(struct tipc_link *l,
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index e2e35b7b1d09..552dbaba9cf3 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -689,7 +689,7 @@ static int tipc_sendmcast(struct socket *sock, struct tipc_name_seq *seq,
689 msg_set_hdr_sz(mhdr, MCAST_H_SIZE); 689 msg_set_hdr_sz(mhdr, MCAST_H_SIZE);
690 690
691new_mtu: 691new_mtu:
692 mtu = tipc_bcast_get_mtu(); 692 mtu = tipc_bcast_get_mtu(net);
693 rc = tipc_msg_build(mhdr, msg, 0, dsz, mtu, pktchain); 693 rc = tipc_msg_build(mhdr, msg, 0, dsz, mtu, pktchain);
694 if (unlikely(rc < 0)) 694 if (unlikely(rc < 0))
695 return rc; 695 return rc;