cregit-Linux how code gets into the kernel

Release 4.11 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 int lowpan_dev_init(struct net_device *ldev) { netdev_lockdep_set_classes(ldev); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Eric Dumazet1789.47%266.67%
Alexander Aring210.53%133.33%
Total19100.00%3100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Alexander 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 Aring25100.00%1100.00%
Total25100.00%1100.00%


static int lowpan_neigh_construct(struct net_device *dev, struct neighbour *n) { struct lowpan_802154_neigh *neigh = lowpan_802154_neigh(neighbour_priv(n)); /* default no short_addr is available for a neighbour */ neigh->short_addr = cpu_to_le16(IEEE802154_ADDR_SHORT_UNSPEC); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Alexander Aring3788.10%150.00%
Jiri Pirko511.90%150.00%
Total42100.00%2100.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, .ndo_neigh_construct = lowpan_neigh_construct, };
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 Aring3653.73%450.00%
Alexander Smirnov2232.84%112.50%
Nicolas Dichtel57.46%112.50%
Alan Ott34.48%112.50%
Phoebe 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 Aring3780.43%250.00%
Alexander Smirnov510.87%125.00%
Martin 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]) 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; ldev->neigh_priv_len = sizeof(struct lowpan_802154_neigh); 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 Aring9143.33%952.94%
Alexander Smirnov7837.14%211.76%
Alan Ott2210.48%211.76%
Dan Carpenter157.14%211.76%
Nicolas Dichtel31.43%15.88%
Varka Bhadram10.48%15.88%
Total210100.00%17100.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 Smirnov3571.43%120.00%
Alexander 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 Smirnov17100.00%1100.00%
Total17100.00%1100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Alexander 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 Ott4963.64%120.00%
Alexander Aring2532.47%360.00%
Jiri 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 Smirnov3241.56%133.33%
Alexander Aring2836.36%133.33%
Alan 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 Smirnov1257.14%133.33%
Alan Ott628.57%133.33%
Alexander 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 Aring35342.33%1852.94%
Alexander Smirnov31337.53%25.88%
Alan Ott10913.07%411.76%
Eric Dumazet222.64%25.88%
Dan Carpenter151.80%25.88%
Jiri Pirko80.96%25.88%
Nicolas Dichtel80.96%12.94%
Martin Townsend40.48%12.94%
Varka Bhadram10.12%12.94%
Phoebe Buckheister10.12%12.94%
Total834100.00%34100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.