This source file includes following definitions.
- loopback_xmit
- get_stats
- loopback_open
- loopback_init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #include <linux/config.h>
25 #include <linux/kernel.h>
26 #include <linux/sched.h>
27 #include <linux/interrupt.h>
28 #include <linux/fs.h>
29 #include <linux/types.h>
30 #include <linux/string.h>
31 #include <linux/socket.h>
32 #include <linux/errno.h>
33 #include <linux/fcntl.h>
34 #include <linux/in.h>
35 #include <linux/if_ether.h>
36 #include <linux/if_arp.h>
37
38 #include <asm/system.h>
39 #include <asm/segment.h>
40 #include <asm/io.h>
41
42 #include <linux/inet.h>
43 #include <linux/netdevice.h>
44 #include <linux/etherdevice.h>
45 #include <linux/skbuff.h>
46 #include <net/sock.h>
47
48
49 static int loopback_xmit(struct sk_buff *skb, struct device *dev)
50 {
51 struct enet_statistics *stats = (struct enet_statistics *)dev->priv;
52 unsigned long flags;
53 int unlock=1;
54
55 if (skb == NULL || dev == NULL)
56 return(0);
57
58 save_flags(flags);
59 cli();
60 if (dev->tbusy != 0)
61 {
62 restore_flags(flags);
63 stats->tx_errors++;
64 return(1);
65 }
66 dev->tbusy = 1;
67 restore_flags(flags);
68
69
70
71
72
73
74 if(skb->free==0)
75 {
76 struct sk_buff *skb2=skb;
77 skb=skb_clone(skb, GFP_ATOMIC);
78 if(skb==NULL)
79 return 1;
80 dev_kfree_skb(skb2, FREE_READ);
81 unlock=0;
82 }
83 else if(skb->sk)
84 {
85
86
87
88
89 save_flags(flags);
90 cli();
91 skb->sk->wmem_alloc-=skb->truesize;
92 skb->sk->write_space(skb->sk);
93 restore_flags(flags);
94 }
95
96 skb->protocol=eth_type_trans(skb,dev);
97 skb->dev=dev;
98 save_flags(flags);
99 cli();
100 netif_rx(skb);
101 if(unlock)
102 skb_device_unlock(skb);
103 restore_flags(flags);
104
105 stats->tx_packets++;
106 stats->rx_packets++;
107
108 dev->tbusy = 0;
109
110 return(0);
111 }
112
113 static struct enet_statistics *get_stats(struct device *dev)
114 {
115 return (struct enet_statistics *)dev->priv;
116 }
117
118 static int loopback_open(struct device *dev)
119 {
120 dev->flags|=IFF_LOOPBACK;
121 return 0;
122 }
123
124
125 int loopback_init(struct device *dev)
126 {
127 int i;
128 #ifdef CONFIG_SKB_LARGE
129 dev->mtu = 7900;
130 #else
131 dev->mtu = 3800;
132 #endif
133 dev->tbusy = 0;
134 dev->hard_start_xmit = loopback_xmit;
135 dev->open = NULL;
136 dev->hard_header = eth_header;
137 dev->hard_header_len = ETH_HLEN;
138 dev->addr_len = ETH_ALEN;
139 dev->type = ARPHRD_ETHER;
140 dev->rebuild_header = eth_rebuild_header;
141 dev->open = loopback_open;
142 dev->flags = IFF_LOOPBACK|IFF_BROADCAST;
143 dev->family = AF_INET;
144 #ifdef CONFIG_INET
145 dev->pa_addr = in_aton("127.0.0.1");
146 dev->pa_brdaddr = in_aton("127.255.255.255");
147 dev->pa_mask = in_aton("255.0.0.0");
148 dev->pa_alen = 4;
149 #endif
150 dev->priv = kmalloc(sizeof(struct enet_statistics), GFP_KERNEL);
151 if (dev->priv == NULL)
152 return -ENOMEM;
153 memset(dev->priv, 0, sizeof(struct enet_statistics));
154 dev->get_stats = get_stats;
155
156
157
158
159
160 for (i = 0; i < DEV_NUMBUFFS; i++)
161 skb_queue_head_init(&dev->buffs[i]);
162
163 return(0);
164 };