cregit-Linux how code gets into the kernel

Release 4.7 net/netrom/nr_dev.c

Directory: net/netrom
/*
 * 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.
 *
 * Copyright Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
 */
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/kernel.h>
#include <linux/interrupt.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/sysctl.h>
#include <linux/string.h>
#include <linux/socket.h>
#include <linux/errno.h>
#include <linux/fcntl.h>
#include <linux/in.h>
#include <linux/if_ether.h>	/* For the statistics structure. */
#include <linux/slab.h>
#include <linux/uaccess.h>

#include <asm/io.h>

#include <linux/inet.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/if_arp.h>
#include <linux/skbuff.h>

#include <net/ip.h>
#include <net/arp.h>

#include <net/ax25.h>
#include <net/netrom.h>

/*
 *      Only allow IP over NET/ROM frames through if the netrom device is up.
 */


int nr_rx_ip(struct sk_buff *skb, struct net_device *dev) { struct net_device_stats *stats = &dev->stats; if (!netif_running(dev)) { stats->rx_dropped++; return 0; } stats->rx_packets++; stats->rx_bytes += skb->len; skb->protocol = htons(ETH_P_IP); /* Spoof incoming device */ skb->dev = dev; skb->mac_header = skb->network_header; skb_reset_network_header(skb); skb->pkt_type = PACKET_HOST; netif_rx(skb); return 1; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git8585.86%758.33%
david s. millerdavid s. miller66.06%18.33%
stephen hemmingerstephen hemminger33.03%18.33%
arnaldo carvalho de meloarnaldo carvalho de melo33.03%18.33%
ralf baechleralf baechle22.02%216.67%
Total99100.00%12100.00%


static int nr_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, const void *daddr, const void *saddr, unsigned int len) { unsigned char *buff = skb_push(skb, NR_NETWORK_LEN + NR_TRANSPORT_LEN); memcpy(buff, (saddr != NULL) ? saddr : dev->dev_addr, dev->addr_len); buff[6] &= ~AX25_CBIT; buff[6] &= ~AX25_EBIT; buff[6] |= AX25_SSSID_SPARE; buff += AX25_ADDR_LEN; if (daddr != NULL) memcpy(buff, daddr, dev->addr_len); buff[6] &= ~AX25_CBIT; buff[6] |= AX25_EBIT; buff[6] |= AX25_SSSID_SPARE; buff += AX25_ADDR_LEN; *buff++ = sysctl_netrom_network_ttl_initialiser; *buff++ = NR_PROTO_IP; *buff++ = NR_PROTO_IP; *buff++ = 0; *buff++ = 0; *buff++ = NR_PROTOEXT; if (daddr != NULL) return 37; return -37; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git18598.40%250.00%
stephen hemmingerstephen hemminger21.06%125.00%
eric dumazeteric dumazet10.53%125.00%
Total188100.00%4100.00%


static int __must_check nr_set_mac_address(struct net_device *dev, void *addr) { struct sockaddr *sa = addr; int err; if (!memcmp(dev->dev_addr, sa->sa_data, dev->addr_len)) return 0; if (dev->flags & IFF_UP) { err = ax25_listen_register((ax25_address *)sa->sa_data, NULL); if (err) return err; ax25_listen_release((ax25_address *)dev->dev_addr, NULL); } memcpy(dev->dev_addr, sa->sa_data, dev->addr_len); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git5146.36%466.67%
ralf baechleralf baechle4944.55%116.67%
jeroen vreekenjeroen vreeken109.09%116.67%
Total110100.00%6100.00%


static int nr_open(struct net_device *dev) { int err; err = ax25_listen_register((ax25_address *)dev->dev_addr, NULL); if (err) return err; netif_start_queue(dev); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git2761.36%375.00%
ralf baechleralf baechle1738.64%125.00%
Total44100.00%4100.00%


static int nr_close(struct net_device *dev) { ax25_listen_release((ax25_address *)dev->dev_addr, NULL); netif_stop_queue(dev); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git2784.38%375.00%
jeroen vreekenjeroen vreeken515.62%125.00%
Total32100.00%4100.00%


static netdev_tx_t nr_xmit(struct sk_buff *skb, struct net_device *dev) { struct net_device_stats *stats = &dev->stats; unsigned int len = skb->len; if (!nr_route_frame(skb, NULL)) { kfree_skb(skb); stats->tx_errors++; return NETDEV_TX_OK; } stats->tx_packets++; stats->tx_bytes += len; return NETDEV_TX_OK; }

Contributors

PersonTokensPropCommitsCommitProp
ralf baechleralf baechle4257.53%225.00%
pre-gitpre-git2736.99%337.50%
patrick mchardypatrick mchardy22.74%112.50%
stephen hemmingerstephen hemminger22.74%225.00%
Total73100.00%8100.00%

static const struct header_ops nr_header_ops = { .create = nr_header, }; static const struct net_device_ops nr_netdev_ops = { .ndo_open = nr_open, .ndo_stop = nr_close, .ndo_start_xmit = nr_xmit, .ndo_set_mac_address = nr_set_mac_address, };
void nr_setup(struct net_device *dev) { dev->mtu = NR_MAX_PACKET_SIZE; dev->netdev_ops = &nr_netdev_ops; dev->header_ops = &nr_header_ops; dev->hard_header_len = NR_NETWORK_LEN + NR_TRANSPORT_LEN; dev->addr_len = AX25_ADDR_LEN; dev->type = ARPHRD_NETROM; /* New-style flags. */ dev->flags = IFF_NOARP; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git4884.21%450.00%
stephen hemmingerstephen hemminger814.04%337.50%
ralf baechleralf baechle11.75%112.50%
Total57100.00%8100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git52372.44%1340.62%
ralf baechleralf baechle11215.51%721.88%
stephen hemmingerstephen hemminger567.76%515.62%
jeroen vreekenjeroen vreeken152.08%13.12%
david s. millerdavid s. miller60.83%13.12%
arnaldo carvalho de meloarnaldo carvalho de melo30.42%13.12%
tejun heotejun heo30.42%13.12%
patrick mchardypatrick mchardy20.28%13.12%
fabian frederickfabian frederick10.14%13.12%
eric dumazeteric dumazet10.14%13.12%
Total722100.00%32100.00%
Directory: net/netrom
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}