~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/rose/rose_dev.c

Version: ~ [ linux-5.12 ] ~ [ linux-5.11.16 ] ~ [ linux-5.10.32 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.114 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.188 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.231 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.267 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.267 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * This program is free software; you can redistribute it and/or modify
  3  * it under the terms of the GNU General Public License as published by
  4  * the Free Software Foundation; either version 2 of the License, or
  5  * (at your option) any later version.
  6  *
  7  * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
  8  */
  9 #include <linux/module.h>
 10 #include <linux/proc_fs.h>
 11 #include <linux/kernel.h>
 12 #include <linux/interrupt.h>
 13 #include <linux/fs.h>
 14 #include <linux/types.h>
 15 #include <linux/sysctl.h>
 16 #include <linux/string.h>
 17 #include <linux/socket.h>
 18 #include <linux/errno.h>
 19 #include <linux/fcntl.h>
 20 #include <linux/in.h>
 21 #include <linux/if_ether.h>
 22 #include <linux/slab.h>
 23 
 24 #include <asm/io.h>
 25 
 26 #include <linux/inet.h>
 27 #include <linux/netdevice.h>
 28 #include <linux/etherdevice.h>
 29 #include <linux/if_arp.h>
 30 #include <linux/skbuff.h>
 31 
 32 #include <net/ip.h>
 33 #include <net/arp.h>
 34 
 35 #include <net/ax25.h>
 36 #include <net/rose.h>
 37 
 38 static int rose_header(struct sk_buff *skb, struct net_device *dev,
 39                        unsigned short type,
 40                        const void *daddr, const void *saddr, unsigned int len)
 41 {
 42         unsigned char *buff = skb_push(skb, ROSE_MIN_LEN + 2);
 43 
 44         if (daddr)
 45                 memcpy(buff + 7, daddr, dev->addr_len);
 46 
 47         *buff++ = ROSE_GFI | ROSE_Q_BIT;
 48         *buff++ = 0x00;
 49         *buff++ = ROSE_DATA;
 50         *buff++ = 0x7F;
 51         *buff++ = AX25_P_IP;
 52 
 53         if (daddr != NULL)
 54                 return 37;
 55 
 56         return -37;
 57 }
 58 
 59 static int rose_set_mac_address(struct net_device *dev, void *addr)
 60 {
 61         struct sockaddr *sa = addr;
 62         int err;
 63 
 64         if (!memcmp(dev->dev_addr, sa->sa_data, dev->addr_len))
 65                 return 0;
 66 
 67         if (dev->flags & IFF_UP) {
 68                 err = rose_add_loopback_node((rose_address *)sa->sa_data);
 69                 if (err)
 70                         return err;
 71 
 72                 rose_del_loopback_node((rose_address *)dev->dev_addr);
 73         }
 74 
 75         memcpy(dev->dev_addr, sa->sa_data, dev->addr_len);
 76 
 77         return 0;
 78 }
 79 
 80 static int rose_open(struct net_device *dev)
 81 {
 82         int err;
 83 
 84         err = rose_add_loopback_node((rose_address *)dev->dev_addr);
 85         if (err)
 86                 return err;
 87 
 88         netif_start_queue(dev);
 89 
 90         return 0;
 91 }
 92 
 93 static int rose_close(struct net_device *dev)
 94 {
 95         netif_stop_queue(dev);
 96         rose_del_loopback_node((rose_address *)dev->dev_addr);
 97         return 0;
 98 }
 99 
100 static netdev_tx_t rose_xmit(struct sk_buff *skb, struct net_device *dev)
101 {
102         struct net_device_stats *stats = &dev->stats;
103         unsigned int len = skb->len;
104 
105         if (!netif_running(dev)) {
106                 printk(KERN_ERR "ROSE: rose_xmit - called when iface is down\n");
107                 return NETDEV_TX_BUSY;
108         }
109 
110         if (!rose_route_frame(skb, NULL)) {
111                 dev_kfree_skb(skb);
112                 stats->tx_errors++;
113                 return NETDEV_TX_OK;
114         }
115 
116         stats->tx_packets++;
117         stats->tx_bytes += len;
118         return NETDEV_TX_OK;
119 }
120 
121 static const struct header_ops rose_header_ops = {
122         .create = rose_header,
123 };
124 
125 static const struct net_device_ops rose_netdev_ops = {
126         .ndo_open               = rose_open,
127         .ndo_stop               = rose_close,
128         .ndo_start_xmit         = rose_xmit,
129         .ndo_set_mac_address    = rose_set_mac_address,
130 };
131 
132 void rose_setup(struct net_device *dev)
133 {
134         dev->mtu                = ROSE_MAX_PACKET_SIZE - 2;
135         dev->netdev_ops         = &rose_netdev_ops;
136 
137         dev->header_ops         = &rose_header_ops;
138         dev->hard_header_len    = AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + ROSE_MIN_LEN;
139         dev->addr_len           = ROSE_ADDR_LEN;
140         dev->type               = ARPHRD_ROSE;
141 
142         /* New-style flags. */
143         dev->flags              = IFF_NOARP;
144 }
145 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp