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 Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk) 8 */ 9 #include <linux/config.h> 10 #include <linux/module.h> 11 #include <linux/proc_fs.h> 12 #include <linux/kernel.h> 13 #include <linux/sched.h> 14 #include <linux/interrupt.h> 15 #include <linux/fs.h> 16 #include <linux/types.h> 17 #include <linux/sysctl.h> 18 #include <linux/string.h> 19 #include <linux/socket.h> 20 #include <linux/errno.h> 21 #include <linux/fcntl.h> 22 #include <linux/in.h> 23 #include <linux/if_ether.h> /* For the statistics structure. */ 24 25 #include <asm/system.h> 26 #include <asm/uaccess.h> 27 #include <asm/io.h> 28 29 #include <linux/inet.h> 30 #include <linux/netdevice.h> 31 #include <linux/etherdevice.h> 32 #include <linux/if_arp.h> 33 #include <linux/skbuff.h> 34 35 #include <net/ip.h> 36 #include <net/arp.h> 37 38 #include <net/ax25.h> 39 #include <net/netrom.h> 40 41 #ifdef CONFIG_INET 42 43 /* 44 * Only allow IP over NET/ROM frames through if the netrom device is up. 45 */ 46 47 int nr_rx_ip(struct sk_buff *skb, struct net_device *dev) 48 { 49 struct net_device_stats *stats = netdev_priv(dev); 50 51 if (!netif_running(dev)) { 52 stats->rx_errors++; 53 return 0; 54 } 55 56 stats->rx_packets++; 57 stats->rx_bytes += skb->len; 58 59 skb->protocol = htons(ETH_P_IP); 60 61 /* Spoof incoming device */ 62 skb->dev = dev; 63 skb->h.raw = skb->data; 64 skb->nh.raw = skb->data; 65 skb->pkt_type = PACKET_HOST; 66 67 ip_rcv(skb, skb->dev, NULL); 68 69 return 1; 70 } 71 72 73 static int nr_rebuild_header(struct sk_buff *skb) 74 { 75 struct net_device *dev = skb->dev; 76 struct net_device_stats *stats = netdev_priv(dev); 77 struct sk_buff *skbn; 78 unsigned char *bp = skb->data; 79 int len; 80 81 if (arp_find(bp + 7, skb)) { 82 return 1; 83 } 84 85 bp[6] &= ~AX25_CBIT; 86 bp[6] &= ~AX25_EBIT; 87 bp[6] |= AX25_SSSID_SPARE; 88 bp += AX25_ADDR_LEN; 89 90 bp[6] &= ~AX25_CBIT; 91 bp[6] |= AX25_EBIT; 92 bp[6] |= AX25_SSSID_SPARE; 93 94 if ((skbn = skb_clone(skb, GFP_ATOMIC)) == NULL) { 95 kfree_skb(skb); 96 return 1; 97 } 98 99 if (skb->sk != NULL) 100 skb_set_owner_w(skbn, skb->sk); 101 102 kfree_skb(skb); 103 104 len = skbn->len; 105 106 if (!nr_route_frame(skbn, NULL)) { 107 kfree_skb(skbn); 108 stats->tx_errors++; 109 } 110 111 stats->tx_packets++; 112 stats->tx_bytes += len; 113 114 return 1; 115 } 116 117 #else 118 119 static int nr_rebuild_header(struct sk_buff *skb) 120 { 121 return 1; 122 } 123 124 #endif 125 126 static int nr_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, 127 void *daddr, void *saddr, unsigned len) 128 { 129 unsigned char *buff = skb_push(skb, NR_NETWORK_LEN + NR_TRANSPORT_LEN); 130 131 memcpy(buff, (saddr != NULL) ? saddr : dev->dev_addr, dev->addr_len); 132 buff[6] &= ~AX25_CBIT; 133 buff[6] &= ~AX25_EBIT; 134 buff[6] |= AX25_SSSID_SPARE; 135 buff += AX25_ADDR_LEN; 136 137 if (daddr != NULL) 138 memcpy(buff, daddr, dev->addr_len); 139 buff[6] &= ~AX25_CBIT; 140 buff[6] |= AX25_EBIT; 141 buff[6] |= AX25_SSSID_SPARE; 142 buff += AX25_ADDR_LEN; 143 144 *buff++ = sysctl_netrom_network_ttl_initialiser; 145 146 *buff++ = NR_PROTO_IP; 147 *buff++ = NR_PROTO_IP; 148 *buff++ = 0; 149 *buff++ = 0; 150 *buff++ = NR_PROTOEXT; 151 152 if (daddr != NULL) 153 return 37; 154 155 return -37; 156 } 157 158 static int nr_set_mac_address(struct net_device *dev, void *addr) 159 { 160 struct sockaddr *sa = addr; 161 162 if (dev->flags & IFF_UP) 163 ax25_listen_release((ax25_address *)dev->dev_addr, NULL); 164 165 memcpy(dev->dev_addr, sa->sa_data, dev->addr_len); 166 167 if (dev->flags & IFF_UP) 168 ax25_listen_register((ax25_address *)dev->dev_addr, NULL); 169 170 return 0; 171 } 172 173 static int nr_open(struct net_device *dev) 174 { 175 netif_start_queue(dev); 176 ax25_listen_register((ax25_address *)dev->dev_addr, NULL); 177 return 0; 178 } 179 180 static int nr_close(struct net_device *dev) 181 { 182 ax25_listen_release((ax25_address *)dev->dev_addr, NULL); 183 netif_stop_queue(dev); 184 return 0; 185 } 186 187 static int nr_xmit(struct sk_buff *skb, struct net_device *dev) 188 { 189 struct net_device_stats *stats = netdev_priv(dev); 190 dev_kfree_skb(skb); 191 stats->tx_errors++; 192 return 0; 193 } 194 195 static struct net_device_stats *nr_get_stats(struct net_device *dev) 196 { 197 return netdev_priv(dev); 198 } 199 200 void nr_setup(struct net_device *dev) 201 { 202 SET_MODULE_OWNER(dev); 203 dev->mtu = NR_MAX_PACKET_SIZE; 204 dev->hard_start_xmit = nr_xmit; 205 dev->open = nr_open; 206 dev->stop = nr_close; 207 208 dev->hard_header = nr_header; 209 dev->hard_header_len = NR_NETWORK_LEN + NR_TRANSPORT_LEN; 210 dev->addr_len = AX25_ADDR_LEN; 211 dev->type = ARPHRD_NETROM; 212 dev->tx_queue_len = 40; 213 dev->rebuild_header = nr_rebuild_header; 214 dev->set_mac_address = nr_set_mac_address; 215 216 /* New-style flags. */ 217 dev->flags = 0; 218 219 dev->get_stats = nr_get_stats; 220 } 221