cregit-Linux how code gets into the kernel

Release 4.11 net/lapb/lapb_iface.c

Directory: net/lapb
/*
 *      LAPB release 002
 *
 *      This code REQUIRES 2.1.15 or higher/ NET3.038
 *
 *      This module:
 *              This module 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.
 *
 *      History
 *      LAPB 001        Jonathan Naylor Started Coding
 *      LAPB 002        Jonathan Naylor New timer architecture.
 *      2000-10-29      Henner Eisen    lapb_data_indication() return status.
 */


#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/module.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/socket.h>
#include <linux/in.h>
#include <linux/kernel.h>
#include <linux/jiffies.h>
#include <linux/timer.h>
#include <linux/string.h>
#include <linux/sockios.h>
#include <linux/net.h>
#include <linux/inet.h>
#include <linux/if_arp.h>
#include <linux/skbuff.h>
#include <linux/slab.h>
#include <net/sock.h>
#include <linux/uaccess.h>
#include <linux/fcntl.h>
#include <linux/mm.h>
#include <linux/interrupt.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <net/lapb.h>

static LIST_HEAD(lapb_list);
static DEFINE_RWLOCK(lapb_list_lock);

/*
 *      Free an allocated lapb control block.
 */

static void lapb_free_cb(struct lapb_cb *lapb) { kfree(lapb); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)1593.75%266.67%
Arnaldo Carvalho de Melo16.25%133.33%
Total16100.00%3100.00%


static __inline__ void lapb_hold(struct lapb_cb *lapb) { atomic_inc(&lapb->refcnt); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)1155.00%150.00%
Arnaldo Carvalho de Melo945.00%150.00%
Total20100.00%2100.00%


static __inline__ void lapb_put(struct lapb_cb *lapb) { if (atomic_dec_and_test(&lapb->refcnt)) lapb_free_cb(lapb); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo1970.37%150.00%
Linus Torvalds (pre-git)829.63%150.00%
Total27100.00%2100.00%

/* * Socket removal during an interrupt is now safe. */
static void __lapb_remove_cb(struct lapb_cb *lapb) { if (lapb->node.next) { list_del(&lapb->node); lapb_put(lapb); } }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo1955.88%150.00%
Linus Torvalds (pre-git)1544.12%150.00%
Total34100.00%2100.00%

EXPORT_SYMBOL(lapb_register); /* * Add a socket to the bound sockets list. */
static void __lapb_insert_cb(struct lapb_cb *lapb) { list_add(&lapb->node, &lapb_list); lapb_hold(lapb); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)1762.96%150.00%
Arnaldo Carvalho de Melo1037.04%150.00%
Total27100.00%2100.00%


static struct lapb_cb *__lapb_devtostruct(struct net_device *dev) { struct list_head *entry; struct lapb_cb *lapb, *use = NULL; list_for_each(entry, &lapb_list) { lapb = list_entry(entry, struct lapb_cb, node); if (lapb->dev == dev) { use = lapb; break; } } if (use) lapb_hold(use); return use; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo4864.00%125.00%
Linus Torvalds (pre-git)2128.00%250.00%
Al Viro68.00%125.00%
Total75100.00%4100.00%


static struct lapb_cb *lapb_devtostruct(struct net_device *dev) { struct lapb_cb *rc; read_lock_bh(&lapb_list_lock); rc = __lapb_devtostruct(dev); read_unlock_bh(&lapb_list_lock); return rc; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo3177.50%133.33%
Al Viro615.00%133.33%
Linus Torvalds (pre-git)37.50%133.33%
Total40100.00%3100.00%

/* * Create an empty LAPB control block. */
static struct lapb_cb *lapb_create_cb(void) { struct lapb_cb *lapb = kzalloc(sizeof(*lapb), GFP_ATOMIC); if (!lapb) goto out; skb_queue_head_init(&lapb->write_queue); skb_queue_head_init(&lapb->ack_queue); init_timer(&lapb->t1timer); init_timer(&lapb->t2timer); lapb->t1 = LAPB_DEFAULT_T1; lapb->t2 = LAPB_DEFAULT_T2; lapb->n2 = LAPB_DEFAULT_N2; lapb->mode = LAPB_DEFAULT_MODE; lapb->window = LAPB_DEFAULT_WINDOW; lapb->state = LAPB_STATE_0; atomic_set(&lapb->refcnt, 1); out: return lapb; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)9379.49%360.00%
Arnaldo Carvalho de Melo2319.66%120.00%
Panagiotis Issaris10.85%120.00%
Total117100.00%5100.00%


int lapb_register(struct net_device *dev, const struct lapb_register_struct *callbacks) { struct lapb_cb *lapb; int rc = LAPB_BADTOKEN; write_lock_bh(&lapb_list_lock); lapb = __lapb_devtostruct(dev); if (lapb) { lapb_put(lapb); goto out; } lapb = lapb_create_cb(); rc = LAPB_NOMEM; if (!lapb) goto out; lapb->dev = dev; lapb->callbacks = callbacks; __lapb_insert_cb(lapb); lapb_start_t1timer(lapb); rc = LAPB_OK; out: write_unlock_bh(&lapb_list_lock); return rc; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo5349.53%114.29%
Linus Torvalds (pre-git)4037.38%342.86%
Al Viro1312.15%228.57%
Stephen Hemminger10.93%114.29%
Total107100.00%7100.00%


int lapb_unregister(struct net_device *dev) { struct lapb_cb *lapb; int rc = LAPB_BADTOKEN; write_lock_bh(&lapb_list_lock); lapb = __lapb_devtostruct(dev); if (!lapb) goto out; lapb_stop_t1timer(lapb); lapb_stop_t2timer(lapb); lapb_clear_queues(lapb); __lapb_remove_cb(lapb); lapb_put(lapb); rc = LAPB_OK; out: write_unlock_bh(&lapb_list_lock); return rc; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)4150.62%350.00%
Arnaldo Carvalho de Melo3441.98%116.67%
Al Viro56.17%116.67%
Andrew Morton11.23%116.67%
Total81100.00%6100.00%

EXPORT_SYMBOL(lapb_unregister);
int lapb_getparms(struct net_device *dev, struct lapb_parms_struct *parms) { int rc = LAPB_BADTOKEN; struct lapb_cb *lapb = lapb_devtostruct(dev); if (!lapb) goto out; parms->t1 = lapb->t1 / HZ; parms->t2 = lapb->t2 / HZ; parms->n2 = lapb->n2; parms->n2count = lapb->n2count; parms->state = lapb->state; parms->window = lapb->window; parms->mode = lapb->mode; if (!timer_pending(&lapb->t1timer)) parms->t1timer = 0; else parms->t1timer = (lapb->t1timer.expires - jiffies) / HZ; if (!timer_pending(&lapb->t2timer)) parms->t2timer = 0; else parms->t2timer = (lapb->t2timer.expires - jiffies) / HZ; lapb_put(lapb); rc = LAPB_OK; out: return rc; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)14882.22%360.00%
Arnaldo Carvalho de Melo2715.00%120.00%
Al Viro52.78%120.00%
Total180100.00%5100.00%

EXPORT_SYMBOL(lapb_getparms);
int lapb_setparms(struct net_device *dev, struct lapb_parms_struct *parms) { int rc = LAPB_BADTOKEN; struct lapb_cb *lapb = lapb_devtostruct(dev); if (!lapb) goto out; rc = LAPB_INVALUE; if (parms->t1 < 1 || parms->t2 < 1 || parms->n2 < 1) goto out_put; if (lapb->state == LAPB_STATE_0) { if (parms->mode & LAPB_EXTENDED) { if (parms->window < 1 || parms->window > 127) goto out_put; } else { if (parms->window < 1 || parms->window > 7) goto out_put; } lapb->mode = parms->mode; lapb->window = parms->window; } lapb->t1 = parms->t1 * HZ; lapb->t2 = parms->t2 * HZ; lapb->n2 = parms->n2; rc = LAPB_OK; out_put: lapb_put(lapb); out: return rc; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)12267.03%240.00%
Arnaldo Carvalho de Melo4122.53%120.00%
Diego Calleja García147.69%120.00%
Al Viro52.75%120.00%
Total182100.00%5100.00%

EXPORT_SYMBOL(lapb_setparms);
int lapb_connect_request(struct net_device *dev) { struct lapb_cb *lapb = lapb_devtostruct(dev); int rc = LAPB_BADTOKEN; if (!lapb) goto out; rc = LAPB_OK; if (lapb->state == LAPB_STATE_1) goto out_put; rc = LAPB_CONNECTED; if (lapb->state == LAPB_STATE_3 || lapb->state == LAPB_STATE_4) goto out_put; lapb_establish_data_link(lapb); lapb_dbg(0, "(%p) S0 -> S1\n", lapb->dev); lapb->state = LAPB_STATE_1; rc = LAPB_OK; out_put: lapb_put(lapb); out: return rc; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo5551.40%120.00%
Linus Torvalds (pre-git)4239.25%120.00%
Al Viro65.61%240.00%
Joe Perches43.74%120.00%
Total107100.00%5100.00%

EXPORT_SYMBOL(lapb_connect_request);
int lapb_disconnect_request(struct net_device *dev) { struct lapb_cb *lapb = lapb_devtostruct(dev); int rc = LAPB_BADTOKEN; if (!lapb) goto out; switch (lapb->state) { case LAPB_STATE_0: rc = LAPB_NOTCONNECTED; goto out_put; case LAPB_STATE_1: lapb_dbg(1, "(%p) S1 TX DISC(1)\n", lapb->dev); lapb_dbg(0, "(%p) S1 -> S0\n", lapb->dev); lapb_send_control(lapb, LAPB_DISC, LAPB_POLLON, LAPB_COMMAND); lapb->state = LAPB_STATE_0; lapb_start_t1timer(lapb); rc = LAPB_NOTCONNECTED; goto out_put; case LAPB_STATE_2: rc = LAPB_OK; goto out_put; } lapb_clear_queues(lapb); lapb->n2count = 0; lapb_send_control(lapb, LAPB_DISC, LAPB_POLLON, LAPB_COMMAND); lapb_start_t1timer(lapb); lapb_stop_t2timer(lapb); lapb->state = LAPB_STATE_2; lapb_dbg(1, "(%p) S3 DISC(1)\n", lapb->dev); lapb_dbg(0, "(%p) S3 -> S2\n", lapb->dev); rc = LAPB_OK; out_put: lapb_put(lapb); out: return rc; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)11962.30%233.33%
Arnaldo Carvalho de Melo4724.61%116.67%
Joe Perches168.38%116.67%
Al Viro94.71%233.33%
Total191100.00%6100.00%

EXPORT_SYMBOL(lapb_disconnect_request);
int lapb_data_request(struct net_device *dev, struct sk_buff *skb) { struct lapb_cb *lapb = lapb_devtostruct(dev); int rc = LAPB_BADTOKEN; if (!lapb) goto out; rc = LAPB_NOTCONNECTED; if (lapb->state != LAPB_STATE_3 && lapb->state != LAPB_STATE_4) goto out_put; skb_queue_tail(&lapb->write_queue, skb); lapb_kick(lapb); rc = LAPB_OK; out_put: lapb_put(lapb); out: return rc; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)4954.44%133.33%
Arnaldo Carvalho de Melo3640.00%133.33%
Al Viro55.56%133.33%
Total90100.00%3100.00%

EXPORT_SYMBOL(lapb_data_request);
int lapb_data_received(struct net_device *dev, struct sk_buff *skb) { struct lapb_cb *lapb = lapb_devtostruct(dev); int rc = LAPB_BADTOKEN; if (lapb) { lapb_data_input(lapb, skb); lapb_put(lapb); rc = LAPB_OK; } return rc; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)2749.09%250.00%
Arnaldo Carvalho de Melo2341.82%125.00%
Al Viro59.09%125.00%
Total55100.00%4100.00%

EXPORT_SYMBOL(lapb_data_received);
void lapb_connect_confirmation(struct lapb_cb *lapb, int reason) { if (lapb->callbacks->connect_confirmation) lapb->callbacks->connect_confirmation(lapb->dev, reason); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)3088.24%125.00%
Stephen Hemminger25.88%125.00%
Arnaldo Carvalho de Melo12.94%125.00%
Al Viro12.94%125.00%
Total34100.00%4100.00%


void lapb_connect_indication(struct lapb_cb *lapb, int reason) { if (lapb->callbacks->connect_indication) lapb->callbacks->connect_indication(lapb->dev, reason); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)3088.24%125.00%
Stephen Hemminger25.88%125.00%
Arnaldo Carvalho de Melo12.94%125.00%
Al Viro12.94%125.00%
Total34100.00%4100.00%


void lapb_disconnect_confirmation(struct lapb_cb *lapb, int reason) { if (lapb->callbacks->disconnect_confirmation) lapb->callbacks->disconnect_confirmation(lapb->dev, reason); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)3088.24%125.00%
Stephen Hemminger25.88%125.00%
Arnaldo Carvalho de Melo12.94%125.00%
Al Viro12.94%125.00%
Total34100.00%4100.00%


void lapb_disconnect_indication(struct lapb_cb *lapb, int reason) { if (lapb->callbacks->disconnect_indication) lapb->callbacks->disconnect_indication(lapb->dev, reason); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)3088.24%125.00%
Stephen Hemminger25.88%125.00%
Al Viro12.94%125.00%
Arnaldo Carvalho de Melo12.94%125.00%
Total34100.00%4100.00%


int lapb_data_indication(struct lapb_cb *lapb, struct sk_buff *skb) { if (lapb->callbacks->data_indication) return lapb->callbacks->data_indication(lapb->dev, skb); kfree_skb(skb); return NET_RX_SUCCESS; /* For now; must be != NET_RX_DROP */ }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)4189.13%233.33%
Stephen Hemminger24.35%116.67%
Florian Westphal12.17%116.67%
Al Viro12.17%116.67%
Arnaldo Carvalho de Melo12.17%116.67%
Total46100.00%6100.00%


int lapb_data_transmit(struct lapb_cb *lapb, struct sk_buff *skb) { int used = 0; if (lapb->callbacks->data_transmit) { lapb->callbacks->data_transmit(lapb->dev, skb); used = 1; } return used; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)4692.00%125.00%
Stephen Hemminger24.00%125.00%
Arnaldo Carvalho de Melo12.00%125.00%
Al Viro12.00%125.00%
Total50100.00%4100.00%


static int __init lapb_init(void) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)12100.00%3100.00%
Total12100.00%3100.00%


static void __exit lapb_exit(void) { WARN_ON(!list_empty(&lapb_list)); }

Contributors

PersonTokensPropCommitsCommitProp
Stephen Hemminger19100.00%1100.00%
Total19100.00%1100.00%

MODULE_AUTHOR("Jonathan Naylor <g4klx@g4klx.demon.co.uk>"); MODULE_DESCRIPTION("The X.25 Link Access Procedure B link layer protocol"); MODULE_LICENSE("GPL"); module_init(lapb_init); module_exit(lapb_exit);

Overall Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)107460.68%1034.48%
Arnaldo Carvalho de Melo48727.51%13.45%
Al Viro714.01%310.34%
Fabian Frederick402.26%13.45%
Stephen Hemminger372.09%26.90%
Joe Perches271.53%13.45%
Diego Calleja García140.79%13.45%
Dave Jones50.28%13.45%
Thomas Gleixner40.23%13.45%
Tejun Heo30.17%13.45%
Cheng Renquan20.11%13.45%
Florian Westphal10.06%13.45%
Andrew Morton10.06%13.45%
Linus Torvalds10.06%13.45%
Panagiotis Issaris10.06%13.45%
Rusty Russell10.06%13.45%
Hideaki Yoshifuji / 吉藤英明10.06%13.45%
Total1770100.00%29100.00%
Directory: net/lapb
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.