aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorPaul Gortmaker <paul.gortmaker@windriver.com>2010-09-08 09:31:24 -0400
committerDavid S. Miller <davem@davemloft.net>2010-09-10 00:34:14 -0400
commitb2abd4c033c3965ce670841dfb401f5f166222d5 (patch)
tree4dc7d0ac0f24001a95a9842a9c58468a343b4e08 /net/tipc
parentfb621bac21fc315af9f66a754b7abe26ded3f260 (diff)
tipc: Optimize handling excess content on incoming messages
Remove code that trimmed excess trailing info from incoming messages arriving over an Ethernet interface. TIPC now ignores the extra info while the message is being processed by the node, and only trims it off if the message is retransmitted to another node. (This latter step is done to ensure the extra info doesn't cause the sk_buff to exceed the outgoing interface's MTU limit.) The outgoing buffer is guaranteed to be linear. Signed-off-by: Allan Stephens <allan.stephens@windriver.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/eth_media.c13
-rw-r--r--net/tipc/net.c1
2 files changed, 4 insertions, 10 deletions
diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c
index 673fdf0b3222..6e988ba485fd 100644
--- a/net/tipc/eth_media.c
+++ b/net/tipc/eth_media.c
@@ -101,15 +101,12 @@ static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr,
101 * Accept only packets explicitly sent to this node, or broadcast packets; 101 * Accept only packets explicitly sent to this node, or broadcast packets;
102 * ignores packets sent using Ethernet multicast, and traffic sent to other 102 * ignores packets sent using Ethernet multicast, and traffic sent to other
103 * nodes (which can happen if interface is running in promiscuous mode). 103 * nodes (which can happen if interface is running in promiscuous mode).
104 * Routine truncates any Ethernet padding/CRC appended to the message,
105 * and ensures message size matches actual length
106 */ 104 */
107 105
108static int recv_msg(struct sk_buff *buf, struct net_device *dev, 106static int recv_msg(struct sk_buff *buf, struct net_device *dev,
109 struct packet_type *pt, struct net_device *orig_dev) 107 struct packet_type *pt, struct net_device *orig_dev)
110{ 108{
111 struct eth_bearer *eb_ptr = (struct eth_bearer *)pt->af_packet_priv; 109 struct eth_bearer *eb_ptr = (struct eth_bearer *)pt->af_packet_priv;
112 u32 size;
113 110
114 if (!net_eq(dev_net(dev), &init_net)) { 111 if (!net_eq(dev_net(dev), &init_net)) {
115 kfree_skb(buf); 112 kfree_skb(buf);
@@ -118,13 +115,9 @@ static int recv_msg(struct sk_buff *buf, struct net_device *dev,
118 115
119 if (likely(eb_ptr->bearer)) { 116 if (likely(eb_ptr->bearer)) {
120 if (likely(buf->pkt_type <= PACKET_BROADCAST)) { 117 if (likely(buf->pkt_type <= PACKET_BROADCAST)) {
121 size = msg_size((struct tipc_msg *)buf->data); 118 buf->next = NULL;
122 skb_trim(buf, size); 119 tipc_recv_msg(buf, eb_ptr->bearer);
123 if (likely(buf->len == size)) { 120 return 0;
124 buf->next = NULL;
125 tipc_recv_msg(buf, eb_ptr->bearer);
126 return 0;
127 }
128 } 121 }
129 } 122 }
130 kfree_skb(buf); 123 kfree_skb(buf);
diff --git a/net/tipc/net.c b/net/tipc/net.c
index f61b7694138b..7e05af47a196 100644
--- a/net/tipc/net.c
+++ b/net/tipc/net.c
@@ -248,6 +248,7 @@ void tipc_net_route_msg(struct sk_buff *buf)
248 248
249 /* Handle message for another node */ 249 /* Handle message for another node */
250 msg_dbg(msg, "NET>SEND>: "); 250 msg_dbg(msg, "NET>SEND>: ");
251 skb_trim(buf, msg_size(msg));
251 tipc_link_send(buf, dnode, msg_link_selector(msg)); 252 tipc_link_send(buf, dnode, msg_link_selector(msg));
252} 253}
253 254