cregit-Linux how code gets into the kernel

Release 4.11 net/802/psnap.c

Directory: net/802
/*
 *      SNAP data link layer. Derived from 802.2
 *
 *              Alan Cox <alan@lxorguk.ukuu.org.uk>,
 *              from the 802.2 layer by Greg Page.
 *              Merged in additions from Greg Page's psnap.c.
 *
 *              This program is free software; you can redistribute it and/or
 *              modify it under the terms of the GNU General Public License
 *              as published by the Free Software Foundation; either version
 *              2 of the License, or (at your option) any later version.
 */

#include <linux/module.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/slab.h>
#include <net/datalink.h>
#include <net/llc.h>
#include <net/psnap.h>
#include <linux/mm.h>
#include <linux/in.h>
#include <linux/init.h>
#include <linux/rculist.h>

static LIST_HEAD(snap_list);
static DEFINE_SPINLOCK(snap_lock);

static struct llc_sap *snap_sap;

/*
 *      Find a snap client by matching the 5 bytes.
 */

static struct datalink_proto *find_snap_client(const unsigned char *desc) { struct datalink_proto *proto = NULL, *p; list_for_each_entry_rcu(p, &snap_list, node) { if (!memcmp(p->type, desc, 5)) { proto = p; break; } } return proto; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)3255.17%120.00%
Arnaldo Carvalho de Melo2136.21%240.00%
Paul E. McKenney46.90%120.00%
Stephen Hemminger11.72%120.00%
Total58100.00%5100.00%

/* * A SNAP packet has arrived */
static int snap_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) { int rc = 1; struct datalink_proto *proto; static struct packet_type snap_packet_type = { .type = cpu_to_be16(ETH_P_SNAP), }; if (unlikely(!pskb_may_pull(skb, 5))) goto drop; rcu_read_lock(); proto = find_snap_client(skb_transport_header(skb)); if (proto) { /* Pass the frame on. */ skb->transport_header += 5; skb_pull_rcsum(skb, 5); rc = proto->rcvfunc(skb, dev, &snap_packet_type, orig_dev); } rcu_read_unlock(); if (unlikely(!proto)) goto drop; out: return rc; drop: kfree_skb(skb); goto out; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo4732.41%642.86%
Herbert Xu4027.59%214.29%
Linus Torvalds (pre-git)3725.52%321.43%
Stephen Hemminger138.97%17.14%
David S. Miller74.83%17.14%
Harvey Harrison10.69%17.14%
Total145100.00%14100.00%

/* * Put a SNAP header on a frame and pass to 802.2 */
static int snap_request(struct datalink_proto *dl, struct sk_buff *skb, u8 *dest) { memcpy(skb_push(skb, 5), dl->type, 5); llc_build_and_send_ui_pkt(snap_sap, skb, dest, snap_sap->laddr.lsap); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)3259.26%360.00%
Arnaldo Carvalho de Melo2240.74%240.00%
Total54100.00%5100.00%

/* * Set up the SNAP layer */ EXPORT_SYMBOL(register_snap_client); EXPORT_SYMBOL(unregister_snap_client); static const char snap_err_msg[] __initconst = KERN_CRIT "SNAP - unable to register with 802.2\n";
static int __init snap_init(void) { snap_sap = llc_sap_open(0xAA, snap_rcv); if (!snap_sap) { printk(snap_err_msg); return -EBUSY; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)2362.16%337.50%
Arnaldo Carvalho de Melo821.62%450.00%
Stephen Hemminger616.22%112.50%
Total37100.00%8100.00%

module_init(snap_init);
static void __exit snap_exit(void) { llc_sap_put(snap_sap); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo14100.00%2100.00%
Total14100.00%2100.00%

module_exit(snap_exit); /* * Register SNAP clients. We don't yet use this for IP. */
struct datalink_proto *register_snap_client(const unsigned char *desc, int (*rcvfunc)(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *)) { struct datalink_proto *proto = NULL; spin_lock_bh(&snap_lock); if (find_snap_client(desc)) goto out; proto = kmalloc(sizeof(*proto), GFP_ATOMIC); if (proto) { memcpy(proto->type, desc, 5); proto->rcvfunc = rcvfunc; proto->header_length = 5 + 3; /* snap + 802.2 */ proto->request = snap_request; list_add_rcu(&proto->node, &snap_list); } out: spin_unlock_bh(&snap_lock); return proto; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)9773.48%228.57%
Arnaldo Carvalho de Melo2317.42%228.57%
Stephen Hemminger86.06%228.57%
David S. Miller43.03%114.29%
Total132100.00%7100.00%

/* * Unregister SNAP clients. Protocols no longer want to play with us ... */
void unregister_snap_client(struct datalink_proto *proto) { spin_lock_bh(&snap_lock); list_del_rcu(&proto->node); spin_unlock_bh(&snap_lock); synchronize_net(); kfree(proto); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)2052.63%133.33%
Stephen Hemminger1231.58%133.33%
Arnaldo Carvalho de Melo615.79%133.33%
Total38100.00%3100.00%

MODULE_LICENSE("GPL");

Overall Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)29251.14%1235.29%
Arnaldo Carvalho de Melo16729.25%1029.41%
Stephen Hemminger457.88%38.82%
Herbert Xu407.01%25.88%
David S. Miller111.93%12.94%
Thomas Gleixner40.70%12.94%
Paul E. McKenney40.70%12.94%
Tejun Heo30.53%12.94%
Franck Bui-Huu30.53%12.94%
Harvey Harrison10.18%12.94%
Alan Cox10.18%12.94%
Total571100.00%34100.00%
Directory: net/802
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.