summaryrefslogtreecommitdiffstats
path: root/net/tipc/bearer.c
diff options
context:
space:
mode:
authorYing Xue <ying.xue@windriver.com>2013-12-10 23:45:43 -0500
committerDavid S. Miller <davem@davemloft.net>2013-12-11 00:17:43 -0500
commite4d050cbf7720d8bcc781f4ef557d37ed148a5c4 (patch)
tree57e491fae1ead5a0c587c1085266dbdbb9d30f45 /net/tipc/bearer.c
parent6e967adf798ae5066488fd0c2b2466d06c642f23 (diff)
tipc: eliminate code duplication in media layer
Currently TIPC supports two L2 media types, Ethernet and Infiniband. Because both these media are accessed through the common net_device API, several functions in the two media adaptation files turn out to be fully or almost identical, leading to unnecessary code duplication. In this commit we extract this common code from the two media files and move them to the generic bearer.c. Additionally, we change the function names to reflect their real role: to access L2 media, irrespective of type. Signed-off-by: Ying Xue <ying.xue@windriver.com> Cc: Patrick McHardy <kaber@trash.net> Reviewed-by: Paul Gortmaker <paul.gortmaker@windriver.com> Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/bearer.c')
-rw-r--r--net/tipc/bearer.c106
1 files changed, 104 insertions, 2 deletions
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index e95e0b91ef30..3bb5f266b0eb 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.c
@@ -2,7 +2,7 @@
2 * net/tipc/bearer.c: TIPC bearer code 2 * net/tipc/bearer.c: TIPC bearer code
3 * 3 *
4 * Copyright (c) 1996-2006, 2013, Ericsson AB 4 * Copyright (c) 1996-2006, 2013, Ericsson AB
5 * Copyright (c) 2004-2006, 2010-2011, Wind River Systems 5 * Copyright (c) 2004-2006, 2010-2013, Wind River Systems
6 * All rights reserved. 6 * All rights reserved.
7 * 7 *
8 * Redistribution and use in source and binary forms, with or without 8 * Redistribution and use in source and binary forms, with or without
@@ -332,6 +332,7 @@ restart:
332 332
333 b_ptr = &tipc_bearers[bearer_id]; 333 b_ptr = &tipc_bearers[bearer_id];
334 strcpy(b_ptr->name, name); 334 strcpy(b_ptr->name, name);
335 b_ptr->media = m_ptr;
335 res = m_ptr->enable_media(b_ptr); 336 res = m_ptr->enable_media(b_ptr);
336 if (res) { 337 if (res) {
337 pr_warn("Bearer <%s> rejected, enable failure (%d)\n", 338 pr_warn("Bearer <%s> rejected, enable failure (%d)\n",
@@ -340,7 +341,6 @@ restart:
340 } 341 }
341 342
342 b_ptr->identity = bearer_id; 343 b_ptr->identity = bearer_id;
343 b_ptr->media = m_ptr;
344 b_ptr->tolerance = m_ptr->tolerance; 344 b_ptr->tolerance = m_ptr->tolerance;
345 b_ptr->window = m_ptr->window; 345 b_ptr->window = m_ptr->window;
346 b_ptr->net_plane = bearer_id + 'A'; 346 b_ptr->net_plane = bearer_id + 'A';
@@ -432,6 +432,108 @@ int tipc_disable_bearer(const char *name)
432 return res; 432 return res;
433} 433}
434 434
435
436/* tipc_l2_media_addr_set - initialize Ethernet media address structure
437 *
438 * Media-dependent "value" field stores MAC address in first 6 bytes
439 * and zeroes out the remaining bytes.
440 */
441void tipc_l2_media_addr_set(const struct tipc_bearer *b,
442 struct tipc_media_addr *a, char *mac)
443{
444 int len = b->media->hwaddr_len;
445
446 if (unlikely(sizeof(a->value) < len)) {
447 WARN_ONCE(1, "Media length invalid\n");
448 return;
449 }
450
451 memcpy(a->value, mac, len);
452 memset(a->value + len, 0, sizeof(a->value) - len);
453 a->media_id = b->media->type_id;
454 a->broadcast = !memcmp(mac, b->bcast_addr.value, len);
455}
456
457int tipc_enable_l2_media(struct tipc_bearer *b)
458{
459 struct net_device *dev;
460 char *driver_name = strchr((const char *)b->name, ':') + 1;
461
462 /* Find device with specified name */
463 dev = dev_get_by_name(&init_net, driver_name);
464 if (!dev)
465 return -ENODEV;
466
467 /* Associate TIPC bearer with Ethernet bearer */
468 b->media_ptr = dev;
469 memset(b->bcast_addr.value, 0, sizeof(b->bcast_addr.value));
470 memcpy(b->bcast_addr.value, dev->broadcast, b->media->hwaddr_len);
471 b->bcast_addr.media_id = b->media->type_id;
472 b->bcast_addr.broadcast = 1;
473 b->mtu = dev->mtu;
474 tipc_l2_media_addr_set(b, &b->addr, (char *)dev->dev_addr);
475 rcu_assign_pointer(dev->tipc_ptr, b);
476 return 0;
477}
478
479/* tipc_disable_l2_media - detach TIPC bearer from an Ethernet interface
480 *
481 * Mark Ethernet bearer as inactive so that incoming buffers are thrown away,
482 * then get worker thread to complete bearer cleanup. (Can't do cleanup
483 * here because cleanup code needs to sleep and caller holds spinlocks.)
484 */
485void tipc_disable_l2_media(struct tipc_bearer *b)
486{
487 struct net_device *dev = (struct net_device *)b->media_ptr;
488 RCU_INIT_POINTER(dev->tipc_ptr, NULL);
489 dev_put(dev);
490}
491
492/**
493 * tipc_l2_send_msg - send a TIPC packet out over an Ethernet interface
494 * @buf: the packet to be sent
495 * @b_ptr: the bearer throught which the packet is to be sent
496 * @dest: peer destination address
497 */
498int tipc_l2_send_msg(struct sk_buff *buf, struct tipc_bearer *b,
499 struct tipc_media_addr *dest)
500{
501 struct sk_buff *clone;
502 int delta;
503 struct net_device *dev = (struct net_device *)b->media_ptr;
504
505 clone = skb_clone(buf, GFP_ATOMIC);
506 if (!clone)
507 return 0;
508
509 delta = dev->hard_header_len - skb_headroom(buf);
510 if ((delta > 0) &&
511 pskb_expand_head(clone, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC)) {
512 kfree_skb(clone);
513 return 0;
514 }
515
516 skb_reset_network_header(clone);
517 clone->dev = dev;
518 clone->protocol = htons(ETH_P_TIPC);
519 dev_hard_header(clone, dev, ETH_P_TIPC, dest->value,
520 dev->dev_addr, clone->len);
521 dev_queue_xmit(clone);
522 return 0;
523}
524
525/* tipc_bearer_send- sends buffer to destination over bearer
526 *
527 * IMPORTANT:
528 * The media send routine must not alter the buffer being passed in
529 * as it may be needed for later retransmission!
530 */
531void tipc_bearer_send(struct tipc_bearer *b, struct sk_buff *buf,
532 struct tipc_media_addr *dest)
533{
534 b->media->send_msg(buf, b, dest);
535}
536
435/** 537/**
436 * tipc_l2_rcv_msg - handle incoming TIPC message from an interface 538 * tipc_l2_rcv_msg - handle incoming TIPC message from an interface
437 * @buf: the received packet 539 * @buf: the received packet