Commit 959e1781 authored by Jon Paul Maloy's avatar Jon Paul Maloy Committed by David S. Miller

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: default avatarJon Maloy <jon.maloy@ericsson.com>
Reviewed-by: default avatarYing Xue <ying.xue@windriver.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b06b281e
...@@ -148,9 +148,9 @@ void tipc_bclink_input(struct net *net) ...@@ -148,9 +148,9 @@ void tipc_bclink_input(struct net *net)
tipc_sk_mcast_rcv(net, &tn->bcbase->arrvq, &tn->bcbase->inputq); tipc_sk_mcast_rcv(net, &tn->bcbase->arrvq, &tn->bcbase->inputq);
} }
uint tipc_bcast_get_mtu(void) int tipc_bcast_get_mtu(struct net *net)
{ {
return MAX_PKT_DEFAULT_MCAST; return tipc_link_mtu(tipc_bc_sndlink(net));
} }
static u16 bcbuf_acks(struct sk_buff *skb) static u16 bcbuf_acks(struct sk_buff *skb)
...@@ -175,7 +175,7 @@ static void tipc_bcbase_select_primary(struct net *net) ...@@ -175,7 +175,7 @@ static void tipc_bcbase_select_primary(struct net *net)
{ {
struct tipc_bc_base *bb = tipc_bc_base(net); struct tipc_bc_base *bb = tipc_bc_base(net);
int all_dests = tipc_link_bc_peers(bb->link); int all_dests = tipc_link_bc_peers(bb->link);
int i; int i, mtu;
bb->primary_bearer = INVALID_BEARER_ID; bb->primary_bearer = INVALID_BEARER_ID;
...@@ -183,6 +183,13 @@ static void tipc_bcbase_select_primary(struct net *net) ...@@ -183,6 +183,13 @@ static void tipc_bcbase_select_primary(struct net *net)
return; return;
for (i = 0; i < MAX_BEARERS; i++) { for (i = 0; i < MAX_BEARERS; i++) {
if (!bb->dests[i])
continue;
mtu = tipc_bearer_mtu(net, i);
if (mtu < tipc_link_mtu(bb->link))
tipc_link_set_mtu(bb->link, mtu);
if (bb->dests[i] < all_dests) if (bb->dests[i] < all_dests)
continue; continue;
...@@ -1220,7 +1227,7 @@ int tipc_bcast_init(struct net *net) ...@@ -1220,7 +1227,7 @@ int tipc_bcast_init(struct net *net)
bb->node.net = net; bb->node.net = net;
if (!tipc_link_bc_create(&bb->node, 0, 0, if (!tipc_link_bc_create(&bb->node, 0, 0,
MAX_PKT_DEFAULT_MCAST, U16_MAX,
BCLINK_WIN_DEFAULT, BCLINK_WIN_DEFAULT,
0, 0,
&bb->inputq, &bb->inputq,
......
...@@ -63,7 +63,7 @@ void tipc_bcbearer_sort(struct net *net, struct tipc_node_map *nm_ptr, ...@@ -63,7 +63,7 @@ void tipc_bcbearer_sort(struct net *net, struct tipc_node_map *nm_ptr,
u32 node, bool action); u32 node, bool action);
int tipc_bclink_reset_stats(struct net *net); int tipc_bclink_reset_stats(struct net *net);
int tipc_bclink_set_queue_limits(struct net *net, u32 limit); int tipc_bclink_set_queue_limits(struct net *net, u32 limit);
uint tipc_bcast_get_mtu(void); int tipc_bcast_get_mtu(struct net *net);
int tipc_bcast_xmit(struct net *net, struct sk_buff_head *list); int tipc_bcast_xmit(struct net *net, struct sk_buff_head *list);
int tipc_bcast_rcv(struct net *net, struct tipc_link *l, struct sk_buff *skb); int tipc_bcast_rcv(struct net *net, struct tipc_link *l, struct sk_buff *skb);
void tipc_bcast_ack_rcv(struct net *net, struct tipc_link *l, u32 acked); void tipc_bcast_ack_rcv(struct net *net, struct tipc_link *l, u32 acked);
......
...@@ -464,6 +464,19 @@ void tipc_bearer_send(struct net *net, u32 bearer_id, struct sk_buff *buf, ...@@ -464,6 +464,19 @@ void tipc_bearer_send(struct net *net, u32 bearer_id, struct sk_buff *buf,
rcu_read_unlock(); rcu_read_unlock();
} }
int tipc_bearer_mtu(struct net *net, u32 bearer_id)
{
int mtu = 0;
struct tipc_bearer *b;
rcu_read_lock();
b = rcu_dereference_rtnl(tipc_net(net)->bearer_list[bearer_id]);
if (b)
mtu = b->mtu;
rcu_read_unlock();
return mtu;
}
/* tipc_bearer_xmit() -send buffer to destination over bearer /* tipc_bearer_xmit() -send buffer to destination over bearer
*/ */
void tipc_bearer_xmit(struct net *net, u32 bearer_id, void tipc_bearer_xmit(struct net *net, u32 bearer_id,
......
...@@ -218,6 +218,7 @@ void tipc_bearer_cleanup(void); ...@@ -218,6 +218,7 @@ void tipc_bearer_cleanup(void);
void tipc_bearer_stop(struct net *net); void tipc_bearer_stop(struct net *net);
void tipc_bearer_send(struct net *net, u32 bearer_id, struct sk_buff *buf, void tipc_bearer_send(struct net *net, u32 bearer_id, struct sk_buff *buf,
struct tipc_media_addr *dest); struct tipc_media_addr *dest);
int tipc_bearer_mtu(struct net *net, u32 bearer_id);
void tipc_bearer_xmit(struct net *net, u32 bearer_id, void tipc_bearer_xmit(struct net *net, u32 bearer_id,
struct sk_buff_head *xmitq, struct sk_buff_head *xmitq,
struct tipc_media_addr *dst); struct tipc_media_addr *dst);
......
...@@ -212,6 +212,16 @@ int tipc_link_bc_peers(struct tipc_link *l) ...@@ -212,6 +212,16 @@ int tipc_link_bc_peers(struct tipc_link *l)
return l->ackers; return l->ackers;
} }
void tipc_link_set_mtu(struct tipc_link *l, int mtu)
{
l->mtu = mtu;
}
int tipc_link_mtu(struct tipc_link *l)
{
return l->mtu;
}
static u32 link_own_addr(struct tipc_link *l) static u32 link_own_addr(struct tipc_link *l)
{ {
return msg_prevnode(l->pmsg); return msg_prevnode(l->pmsg);
......
...@@ -281,6 +281,8 @@ void tipc_link_remove_bc_peer(struct tipc_link *snd_l, ...@@ -281,6 +281,8 @@ void tipc_link_remove_bc_peer(struct tipc_link *snd_l,
struct tipc_link *rcv_l, struct tipc_link *rcv_l,
struct sk_buff_head *xmitq); struct sk_buff_head *xmitq);
int tipc_link_bc_peers(struct tipc_link *l); int tipc_link_bc_peers(struct tipc_link *l);
void tipc_link_set_mtu(struct tipc_link *l, int mtu);
int tipc_link_mtu(struct tipc_link *l);
void tipc_link_bc_ack_rcv(struct tipc_link *l, u16 acked, void tipc_link_bc_ack_rcv(struct tipc_link *l, u16 acked,
struct sk_buff_head *xmitq); struct sk_buff_head *xmitq);
void tipc_link_build_bc_sync_msg(struct tipc_link *l, void tipc_link_build_bc_sync_msg(struct tipc_link *l,
......
...@@ -689,7 +689,7 @@ static int tipc_sendmcast(struct socket *sock, struct tipc_name_seq *seq, ...@@ -689,7 +689,7 @@ static int tipc_sendmcast(struct socket *sock, struct tipc_name_seq *seq,
msg_set_hdr_sz(mhdr, MCAST_H_SIZE); msg_set_hdr_sz(mhdr, MCAST_H_SIZE);
new_mtu: new_mtu:
mtu = tipc_bcast_get_mtu(); mtu = tipc_bcast_get_mtu(net);
rc = tipc_msg_build(mhdr, msg, 0, dsz, mtu, pktchain); rc = tipc_msg_build(mhdr, msg, 0, dsz, mtu, pktchain);
if (unlikely(rc < 0)) if (unlikely(rc < 0))
return rc; return rc;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment