cregit-Linux how code gets into the kernel

Release 4.7 net/ieee802154/6lowpan/core.c

/* Copyright 2011, Siemens AG
 * written by Alexander Smirnov <alex.bluesman.smirnov@gmail.com>
 */

/* Based on patches from Jon Smirl <jonsmirl@gmail.com>
 * Copyright (c) 2011 Jon Smirl <jonsmirl@gmail.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

/* Jon's code is based on 6lowpan implementation for Contiki which is:
 * Copyright (c) 2008, Swedish Institute of Computer Science.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the Institute nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#include <linux/module.h>
#include <linux/netdevice.h>
#include <linux/ieee802154.h>

#include <net/ipv6.h>

#include "6lowpan_i.h"


static int open_count;


static struct header_ops lowpan_header_ops = {
	.create	= lowpan_header_create,
};


static struct lock_class_key lowpan_tx_busylock;

static struct lock_class_key lowpan_netdev_xmit_lock_key;


static void lowpan_set_lockdep_class_one(struct net_device *ldev, struct netdev_queue *txq, void *_unused) { lockdep_set_class(&txq->_xmit_lock, &lowpan_netdev_xmit_lock_key); }

Contributors

PersonTokensPropCommitsCommitProp
eric dumazeteric dumazet3096.77%150.00%
alexander aringalexander aring13.23%150.00%
Total31100.00%2100.00%


static int lowpan_dev_init(struct net_device *ldev) { netdev_for_each_tx_queue(ldev, lowpan_set_lockdep_class_one, NULL); ldev->qdisc_tx_busylock = &lowpan_tx_busylock; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
eric dumazeteric dumazet2790.00%150.00%
alexander aringalexander aring310.00%150.00%
Total30100.00%2100.00%


static int lowpan_open(struct net_device *dev) { if (!open_count) lowpan_rx_init(); open_count++; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
alexander aringalexander aring25100.00%1100.00%
Total25100.00%1100.00%


static int lowpan_stop(struct net_device *dev) { open_count--; if (!open_count) lowpan_rx_exit(); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
alexander aringalexander aring25100.00%1100.00%
Total25100.00%1100.00%

static const struct net_device_ops lowpan_netdev_ops = { .ndo_init = lowpan_dev_init, .ndo_start_xmit = lowpan_xmit, .ndo_open = lowpan_open, .ndo_stop = lowpan_stop, };
static void lowpan_setup(struct net_device *ldev) { memset(ldev->broadcast, 0xff, IEEE802154_ADDR_LEN); /* We need an ipv6hdr as minimum len when calling xmit */ ldev->hard_header_len = sizeof(struct ipv6hdr); ldev->flags = IFF_BROADCAST | IFF_MULTICAST; ldev->netdev_ops = &lowpan_netdev_ops; ldev->header_ops = &lowpan_header_ops; ldev->destructor = free_netdev; ldev->features |= NETIF_F_NETNS_LOCAL; }

Contributors

PersonTokensPropCommitsCommitProp
alexander aringalexander aring3653.73%450.00%
alexander smirnovalexander smirnov2232.84%112.50%
nicolas dichtelnicolas dichtel57.46%112.50%
alan ottalan ott34.48%112.50%
phoebe buckheisterphoebe buckheister11.49%112.50%
Total67100.00%8100.00%


static int lowpan_validate(struct nlattr *tb[], struct nlattr *data[]) { if (tb[IFLA_ADDRESS]) { if (nla_len(tb[IFLA_ADDRESS]) != IEEE802154_ADDR_LEN) return -EINVAL; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
alexander aringalexander aring3780.43%250.00%
alexander smirnovalexander smirnov510.87%125.00%
martin townsendmartin townsend48.70%125.00%
Total46100.00%4100.00%


static int lowpan_newlink(struct net *src_net, struct net_device *ldev, struct nlattr *tb[], struct nlattr *data[]) { struct net_device *wdev; int ret; ASSERT_RTNL(); pr_debug("adding new link\n"); if (!tb[IFLA_LINK] || !net_eq(dev_net(ldev), &init_net)) return -EINVAL; /* find and hold wpan device */ wdev = dev_get_by_index(dev_net(ldev), nla_get_u32(tb[IFLA_LINK])); if (!wdev) return -ENODEV; if (wdev->type != ARPHRD_IEEE802154) { dev_put(wdev); return -EINVAL; } if (wdev->ieee802154_ptr->lowpan_dev) { dev_put(wdev); return -EBUSY; } lowpan_802154_dev(ldev)->wdev = wdev; /* Set the lowpan hardware address to the wpan hardware address. */ memcpy(ldev->dev_addr, wdev->dev_addr, IEEE802154_ADDR_LEN); /* We need headroom for possible wpan_dev_hard_header call and tailroom * for encryption/fcs handling. The lowpan interface will replace * the IPv6 header with 6LoWPAN header. At worst case the 6LoWPAN * header has LOWPAN_IPHC_MAX_HEADER_LEN more bytes than the IPv6 * header. */ ldev->needed_headroom = LOWPAN_IPHC_MAX_HEADER_LEN + wdev->needed_headroom; ldev->needed_tailroom = wdev->needed_tailroom; ret = lowpan_register_netdevice(ldev, LOWPAN_LLTYPE_IEEE802154); if (ret < 0) { dev_put(wdev); return ret; } wdev->ieee802154_ptr->lowpan_dev = ldev; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
alexander aringalexander aring8238.68%850.00%
alexander smirnovalexander smirnov7836.79%212.50%
alan ottalan ott2210.38%212.50%
dan carpenterdan carpenter157.08%212.50%
nicolas dichtelnicolas dichtel146.60%16.25%
varka bhadramvarka bhadram10.47%16.25%
Total212100.00%16100.00%


static void lowpan_dellink(struct net_device *ldev, struct list_head *head) { struct net_device *wdev = lowpan_802154_dev(ldev)->wdev; ASSERT_RTNL(); wdev->ieee802154_ptr->lowpan_dev = NULL; lowpan_unregister_netdevice(ldev); dev_put(wdev); }

Contributors

PersonTokensPropCommitsCommitProp
alexander smirnovalexander smirnov3571.43%120.00%
alexander aringalexander aring1428.57%480.00%
Total49100.00%5100.00%

static struct rtnl_link_ops lowpan_link_ops __read_mostly = { .kind = "lowpan", .priv_size = LOWPAN_PRIV_SIZE(sizeof(struct lowpan_802154_dev)), .setup = lowpan_setup, .newlink = lowpan_newlink, .dellink = lowpan_dellink, .validate = lowpan_validate, };
static inline int __init lowpan_netlink_init(void) { return rtnl_link_register(&lowpan_link_ops); }

Contributors

PersonTokensPropCommitsCommitProp
alexander smirnovalexander smirnov17100.00%1100.00%
Total17100.00%1100.00%


static inline void lowpan_netlink_fini(void) { rtnl_link_unregister(&lowpan_link_ops); }

Contributors

PersonTokensPropCommitsCommitProp
alexander smirnovalexander smirnov15100.00%1100.00%
Total15100.00%1100.00%


static int lowpan_device_event(struct notifier_block *unused, unsigned long event, void *ptr) { struct net_device *wdev = netdev_notifier_info_to_dev(ptr); if (wdev->type != ARPHRD_IEEE802154) return NOTIFY_DONE; switch (event) { case NETDEV_UNREGISTER: /* Check if wpan interface is unregistered that we * also delete possible lowpan interfaces which belongs * to the wpan interface. */ if (wdev->ieee802154_ptr->lowpan_dev) lowpan_dellink(wdev->ieee802154_ptr->lowpan_dev, NULL); break; default: return NOTIFY_DONE; } return NOTIFY_OK; }

Contributors

PersonTokensPropCommitsCommitProp
alan ottalan ott4963.64%120.00%
alexander aringalexander aring2532.47%360.00%
jiri pirkojiri pirko33.90%120.00%
Total77100.00%5100.00%

static struct notifier_block lowpan_dev_notifier = { .notifier_call = lowpan_device_event, };
static int __init lowpan_init_module(void) { int err = 0; err = lowpan_net_frag_init(); if (err < 0) goto out; err = lowpan_netlink_init(); if (err < 0) goto out_frag; err = register_netdevice_notifier(&lowpan_dev_notifier); if (err < 0) goto out_pack; return 0; out_pack: lowpan_netlink_fini(); out_frag: lowpan_net_frag_exit(); out: return err; }

Contributors

PersonTokensPropCommitsCommitProp
alexander smirnovalexander smirnov3241.56%133.33%
alexander aringalexander aring2836.36%133.33%
alan ottalan ott1722.08%133.33%
Total77100.00%3100.00%


static void __exit lowpan_cleanup_module(void) { lowpan_netlink_fini(); lowpan_net_frag_exit(); unregister_netdevice_notifier(&lowpan_dev_notifier); }

Contributors

PersonTokensPropCommitsCommitProp
alexander smirnovalexander smirnov1257.14%133.33%
alan ottalan ott628.57%133.33%
alexander aringalexander aring314.29%133.33%
Total21100.00%3100.00%

module_init(lowpan_init_module); module_exit(lowpan_cleanup_module); MODULE_LICENSE("GPL"); MODULE_ALIAS_RTNL_LINK("lowpan");

Overall Contributors

PersonTokensPropCommitsCommitProp
alexander smirnovalexander smirnov31337.22%26.45%
alexander aringalexander aring30436.15%1754.84%
alan ottalan ott10912.96%412.90%
eric dumazeteric dumazet728.56%13.23%
nicolas dichtelnicolas dichtel192.26%13.23%
dan carpenterdan carpenter151.78%26.45%
martin townsendmartin townsend40.48%13.23%
jiri pirkojiri pirko30.36%13.23%
varka bhadramvarka bhadram10.12%13.23%
phoebe buckheisterphoebe buckheister10.12%13.23%
Total841100.00%31100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}