Blame view
net/rose/rose_dev.c
3.61 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 |
/* * 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 (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk) */ |
1da177e4c Linux-2.6.12-rc2 |
9 10 11 |
#include <linux/module.h> #include <linux/proc_fs.h> #include <linux/kernel.h> |
1da177e4c Linux-2.6.12-rc2 |
12 13 14 15 16 17 18 19 20 21 |
#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> |
5a0e3ad6a include cleanup: ... |
22 |
#include <linux/slab.h> |
1da177e4c Linux-2.6.12-rc2 |
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <asm/system.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/rose.h> |
3b04ddde0 [NET]: Move hardw... |
38 39 40 |
static int rose_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, const void *daddr, const void *saddr, unsigned len) |
1da177e4c Linux-2.6.12-rc2 |
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
{ unsigned char *buff = skb_push(skb, ROSE_MIN_LEN + 2); *buff++ = ROSE_GFI | ROSE_Q_BIT; *buff++ = 0x00; *buff++ = ROSE_DATA; *buff++ = 0x7F; *buff++ = AX25_P_IP; if (daddr != NULL) return 37; return -37; } static int rose_rebuild_header(struct sk_buff *skb) { |
78f150bf9 [ROSE]: Trivial c... |
58 |
#ifdef CONFIG_INET |
1da177e4c Linux-2.6.12-rc2 |
59 |
struct net_device *dev = skb->dev; |
d289d120b rose: convert to ... |
60 |
struct net_device_stats *stats = &dev->stats; |
1da177e4c Linux-2.6.12-rc2 |
61 62 |
unsigned char *bp = (unsigned char *)skb->data; struct sk_buff *skbn; |
8dc22d2b6 [ROSE]: Fix deref... |
63 |
unsigned int len; |
1da177e4c Linux-2.6.12-rc2 |
64 |
|
1da177e4c Linux-2.6.12-rc2 |
65 66 67 68 69 70 71 72 73 74 75 76 77 |
if (arp_find(bp + 7, skb)) { return 1; } if ((skbn = skb_clone(skb, GFP_ATOMIC)) == NULL) { kfree_skb(skb); return 1; } if (skb->sk != NULL) skb_set_owner_w(skbn, skb->sk); kfree_skb(skb); |
8dc22d2b6 [ROSE]: Fix deref... |
78 |
len = skbn->len; |
1da177e4c Linux-2.6.12-rc2 |
79 80 81 82 83 84 85 |
if (!rose_route_frame(skbn, NULL)) { kfree_skb(skbn); stats->tx_errors++; return 1; } stats->tx_packets++; |
8dc22d2b6 [ROSE]: Fix deref... |
86 |
stats->tx_bytes += len; |
1da177e4c Linux-2.6.12-rc2 |
87 88 89 90 91 92 93 |
#endif return 1; } static int rose_set_mac_address(struct net_device *dev, void *addr) { struct sockaddr *sa = addr; |
a159aaa32 [AX.25]: Fix unch... |
94 |
int err; |
1da177e4c Linux-2.6.12-rc2 |
95 |
|
a159aaa32 [AX.25]: Fix unch... |
96 97 |
if (!memcpy(dev->dev_addr, sa->sa_data, dev->addr_len)) return 0; |
1da177e4c Linux-2.6.12-rc2 |
98 |
|
a159aaa32 [AX.25]: Fix unch... |
99 100 101 102 103 104 105 |
if (dev->flags & IFF_UP) { err = rose_add_loopback_node((rose_address *)dev->dev_addr); if (err) return err; rose_del_loopback_node((rose_address *)dev->dev_addr); } |
1da177e4c Linux-2.6.12-rc2 |
106 |
|
a159aaa32 [AX.25]: Fix unch... |
107 |
memcpy(dev->dev_addr, sa->sa_data, dev->addr_len); |
1da177e4c Linux-2.6.12-rc2 |
108 109 110 111 112 113 |
return 0; } static int rose_open(struct net_device *dev) { |
a159aaa32 [AX.25]: Fix unch... |
114 115 116 117 118 |
int err; err = rose_add_loopback_node((rose_address *)dev->dev_addr); if (err) return err; |
1da177e4c Linux-2.6.12-rc2 |
119 |
netif_start_queue(dev); |
a159aaa32 [AX.25]: Fix unch... |
120 |
|
1da177e4c Linux-2.6.12-rc2 |
121 122 123 124 125 126 127 128 129 |
return 0; } static int rose_close(struct net_device *dev) { netif_stop_queue(dev); rose_del_loopback_node((rose_address *)dev->dev_addr); return 0; } |
36e4d64a8 convert hamradio ... |
130 |
static netdev_tx_t rose_xmit(struct sk_buff *skb, struct net_device *dev) |
1da177e4c Linux-2.6.12-rc2 |
131 |
{ |
d289d120b rose: convert to ... |
132 |
struct net_device_stats *stats = &dev->stats; |
1da177e4c Linux-2.6.12-rc2 |
133 134 135 136 |
if (!netif_running(dev)) { printk(KERN_ERR "ROSE: rose_xmit - called when iface is down "); |
5b5481402 net: use symbolic... |
137 |
return NETDEV_TX_BUSY; |
1da177e4c Linux-2.6.12-rc2 |
138 139 140 |
} dev_kfree_skb(skb); stats->tx_errors++; |
6ed106549 net: use NETDEV_T... |
141 |
return NETDEV_TX_OK; |
1da177e4c Linux-2.6.12-rc2 |
142 |
} |
3b04ddde0 [NET]: Move hardw... |
143 144 145 146 |
static const struct header_ops rose_header_ops = { .create = rose_header, .rebuild= rose_rebuild_header, }; |
3170c6568 rose: convert to ... |
147 148 149 150 151 152 |
static const struct net_device_ops rose_netdev_ops = { .ndo_open = rose_open, .ndo_stop = rose_close, .ndo_start_xmit = rose_xmit, .ndo_set_mac_address = rose_set_mac_address, }; |
1da177e4c Linux-2.6.12-rc2 |
153 154 |
void rose_setup(struct net_device *dev) { |
1da177e4c Linux-2.6.12-rc2 |
155 |
dev->mtu = ROSE_MAX_PACKET_SIZE - 2; |
3170c6568 rose: convert to ... |
156 |
dev->netdev_ops = &rose_netdev_ops; |
1da177e4c Linux-2.6.12-rc2 |
157 |
|
3b04ddde0 [NET]: Move hardw... |
158 |
dev->header_ops = &rose_header_ops; |
1da177e4c Linux-2.6.12-rc2 |
159 160 161 |
dev->hard_header_len = AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + ROSE_MIN_LEN; dev->addr_len = ROSE_ADDR_LEN; dev->type = ARPHRD_ROSE; |
1da177e4c Linux-2.6.12-rc2 |
162 163 |
/* New-style flags. */ |
d2ce4bc34 [ROSE]: ROSE has ... |
164 |
dev->flags = IFF_NOARP; |
1da177e4c Linux-2.6.12-rc2 |
165 |
} |