Blame view

net/ethernet/eth.c 10.7 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
  /*
   * INET		An implementation of the TCP/IP protocol suite for the LINUX
   *		operating system.  INET is implemented using the  BSD Socket
   *		interface as the means of communication with the user level.
   *
   *		Ethernet-type device handling.
   *
   * Version:	@(#)eth.c	1.0.7	05/25/93
   *
02c30a84e   Jesper Juhl   [PATCH] update Ro...
10
   * Authors:	Ross Biro
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
13
14
   *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
   *		Mark Evans, <evansmp@uhura.aston.ac.uk>
   *		Florian  La Roche, <rzsfl@rz.uni-sb.de>
   *		Alan Cox, <gw4pts@gw4pts.ampr.org>
03d52d7cf   YOSHIFUJI Hideaki   [NET] ETHERNET: F...
15
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
17
18
19
20
21
   * Fixes:
   *		Mr Linux	: Arp problems
   *		Alan Cox	: Generic queue tidyup (very tiny here)
   *		Alan Cox	: eth_header ntohs should be htons
   *		Alan Cox	: eth_rebuild_header missing an htons and
   *				  minor other things.
03d52d7cf   YOSHIFUJI Hideaki   [NET] ETHERNET: F...
22
   *		Tegge		: Arp bug fixes.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
   *		Florian		: Removed many unnecessary functions, code cleanup
   *				  and changes for new arp and skbuff.
   *		Alan Cox	: Redid header building to reflect new format.
   *		Alan Cox	: ARP only when compiled with CONFIG_INET
   *		Greg Page	: 802.2 and SNAP stuff.
   *		Alan Cox	: MAC layer pointers/new format.
   *		Paul Gortmaker	: eth_copy_and_sum shouldn't csum padding.
   *		Alan Cox	: Protect against forwarding explosions with
   *				  older network drivers and IFF_ALLMULTI.
   *	Christer Weinigel	: Better rebuild header message.
   *             Andrew Morton    : 26Feb01: kill ether_setup() - use netdev_boot_setup().
   *
   *		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.
   */
  #include <linux/module.h>
  #include <linux/types.h>
  #include <linux/kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
44
45
46
47
48
49
50
51
52
  #include <linux/string.h>
  #include <linux/mm.h>
  #include <linux/socket.h>
  #include <linux/in.h>
  #include <linux/inet.h>
  #include <linux/ip.h>
  #include <linux/netdevice.h>
  #include <linux/etherdevice.h>
  #include <linux/skbuff.h>
  #include <linux/errno.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
  #include <linux/init.h>
46f25dffb   Kris Katterjohn   [NET]: Change 150...
54
  #include <linux/if_ether.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
56
57
58
59
  #include <net/dst.h>
  #include <net/arp.h>
  #include <net/sock.h>
  #include <net/ipv6.h>
  #include <net/ip.h>
cf85d08fd   Lennert Buytenhek   dsa: add support ...
60
  #include <net/dsa.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
62
  #include <asm/uaccess.h>
  #include <asm/system.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
64
  __setup("ether=", netdev_boot_setup);
d3e01f718   Stephen Hemminger   [ETH]: docbook co...
65
66
67
68
69
70
71
72
  /**
   * eth_header - create the Ethernet header
   * @skb:	buffer to alter
   * @dev:	source device
   * @type:	Ethernet type field
   * @daddr: destination address (NULL leave destination address)
   * @saddr: source address (NULL use device source address)
   * @len:   packet length (<= skb->len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
   *
d3e01f718   Stephen Hemminger   [ETH]: docbook co...
74
   *
bf9ae5386   Octavian Purdila   llc: use dev_hard...
75
76
   * Set the protocol type. For a packet of type ETH_P_802_3/2 we put the length
   * in here instead.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77
   */
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
78
79
80
  int eth_header(struct sk_buff *skb, struct net_device *dev,
  	       unsigned short type,
  	       const void *daddr, const void *saddr, unsigned len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
  {
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
82
  	struct ethhdr *eth = (struct ethhdr *)skb_push(skb, ETH_HLEN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83

bf9ae5386   Octavian Purdila   llc: use dev_hard...
84
  	if (type != ETH_P_802_3 && type != ETH_P_802_2)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
86
87
88
89
  		eth->h_proto = htons(type);
  	else
  		eth->h_proto = htons(len);
  
  	/*
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
90
  	 *      Set the source hardware address.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91
  	 */
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
92
93
  
  	if (!saddr)
ff593c592   Denis Vlasenko   [NET]: Micro opti...
94
  		saddr = dev->dev_addr;
23f1f4eff   Stephen Hemminger   [NET] ethernet: o...
95
  	memcpy(eth->h_source, saddr, ETH_ALEN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96

2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
97
  	if (daddr) {
23f1f4eff   Stephen Hemminger   [NET] ethernet: o...
98
  		memcpy(eth->h_dest, daddr, ETH_ALEN);
f8d0e3f11   Jamal Hadi Salim   [NET] ethernet: F...
99
100
  		return ETH_HLEN;
  	}
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
101

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
102
  	/*
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
103
  	 *      Anyway, the loopback-device should never use this function...
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104
  	 */
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
105
  	if (dev->flags & (IFF_LOOPBACK | IFF_NOARP)) {
23f1f4eff   Stephen Hemminger   [NET] ethernet: o...
106
  		memset(eth->h_dest, 0, ETH_ALEN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
108
  		return ETH_HLEN;
  	}
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
109

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
  	return -ETH_HLEN;
  }
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
112
  EXPORT_SYMBOL(eth_header);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113

d3e01f718   Stephen Hemminger   [ETH]: docbook co...
114
115
116
117
118
119
  /**
   * eth_rebuild_header- rebuild the Ethernet MAC header.
   * @skb: socket buffer to update
   *
   * This is called after an ARP or IPV6 ndisc it's resolution on this
   * sk_buff. We now let protocol (ARP) fill in the other fields.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
   *
d3e01f718   Stephen Hemminger   [ETH]: docbook co...
121
122
   * This routine CANNOT use cached dst->neigh!
   * Really, it is used only when dst->neigh is wrong.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
124
125
126
127
  int eth_rebuild_header(struct sk_buff *skb)
  {
  	struct ethhdr *eth = (struct ethhdr *)skb->data;
  	struct net_device *dev = skb->dev;
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
128
  	switch (eth->h_proto) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
  #ifdef CONFIG_INET
606780404   Arnaldo Carvalho de Melo   net: Use hton[sl]...
130
  	case htons(ETH_P_IP):
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
131
132
  		return arp_find(eth->h_dest, skb);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
134
  	default:
  		printk(KERN_DEBUG
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
135
136
  		       "%s: unable to resolve type %X addresses.
  ",
b002a8610   Johannes Berg   ethernet: print p...
137
  		       dev->name, ntohs(eth->h_proto));
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
138

23f1f4eff   Stephen Hemminger   [NET] ethernet: o...
139
  		memcpy(eth->h_source, dev->dev_addr, ETH_ALEN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140
141
142
143
144
  		break;
  	}
  
  	return 0;
  }
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
145
  EXPORT_SYMBOL(eth_rebuild_header);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
146

d3e01f718   Stephen Hemminger   [ETH]: docbook co...
147
148
149
150
151
152
153
154
  /**
   * eth_type_trans - determine the packet's protocol ID.
   * @skb: received socket data
   * @dev: receiving network device
   *
   * The rule here is that we
   * assume 802.3 if the type field is short enough to be a length.
   * This is normal practice and works for any 'now in use' protocol.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
155
   */
ab611487d   Alexey Dobriyan   [NET]: __be'ify *...
156
  __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
158
  {
  	struct ethhdr *eth;
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
159

4c13eb665   Arnaldo Carvalho de Melo   [ETH]: Make eth_t...
160
  	skb->dev = dev;
459a98ed8   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
161
  	skb_reset_mac_header(skb);
47d29646a   David S. Miller   net: Inline skb_p...
162
  	skb_pull_inline(skb, ETH_HLEN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
163
  	eth = eth_hdr(skb);
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
164

1f87e235e   Eric Dumazet   eth: Declare an o...
165
166
  	if (unlikely(is_multicast_ether_addr(eth->h_dest))) {
  		if (!compare_ether_addr_64bits(eth->h_dest, dev->broadcast))
ba645c160   David S. Miller   [NET]: Slightly o...
167
  			skb->pkt_type = PACKET_BROADCAST;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
168
  		else
ba645c160   David S. Miller   [NET]: Slightly o...
169
  			skb->pkt_type = PACKET_MULTICAST;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
170
  	}
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
171

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
172
  	/*
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
173
174
  	 *      This ALLMULTI check should be redundant by 1.4
  	 *      so don't forget to remove it.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
175
  	 *
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
176
177
  	 *      Seems, you forgot to remove it. All silly devices
  	 *      seems to set IFF_PROMISC.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178
  	 */
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
179
180
  
  	else if (1 /*dev->flags&IFF_PROMISC */ ) {
1f87e235e   Eric Dumazet   eth: Declare an o...
181
  		if (unlikely(compare_ether_addr_64bits(eth->h_dest, dev->dev_addr)))
ba645c160   David S. Miller   [NET]: Slightly o...
182
  			skb->pkt_type = PACKET_OTHERHOST;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
  	}
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
184

cf85d08fd   Lennert Buytenhek   dsa: add support ...
185
186
187
188
189
190
191
192
  	/*
  	 * Some variants of DSA tagging don't have an ethertype field
  	 * at all, so we check here whether one of those tagging
  	 * variants has been configured on the receiving interface,
  	 * and if so, set skb->protocol without looking at the packet.
  	 */
  	if (netdev_uses_dsa_tags(dev))
  		return htons(ETH_P_DSA);
396138f03   Lennert Buytenhek   dsa: add support ...
193
194
  	if (netdev_uses_trailer_tags(dev))
  		return htons(ETH_P_TRAILER);
cf85d08fd   Lennert Buytenhek   dsa: add support ...
195

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
196
197
  	if (ntohs(eth->h_proto) >= 1536)
  		return eth->h_proto;
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
198

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
199
  	/*
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
200
201
202
203
  	 *      This is a magic hack to spot IPX packets. Older Novell breaks
  	 *      the protocol design and runs IPX over 802.3 without an 802.2 LLC
  	 *      layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This
  	 *      won't work for fault tolerant netware but does for the rest.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
204
  	 */
d8d1f30b9   Changli Gao   net-next: remove ...
205
  	if (skb->len >= 2 && *(unsigned short *)(skb->data) == 0xFFFF)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
  		return htons(ETH_P_802_3);
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
207

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208
  	/*
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
209
  	 *      Real 802.2 LLC
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
210
211
212
  	 */
  	return htons(ETH_P_802_2);
  }
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
213
  EXPORT_SYMBOL(eth_type_trans);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
214

d3e01f718   Stephen Hemminger   [ETH]: docbook co...
215
216
217
218
219
  /**
   * eth_header_parse - extract hardware address from packet
   * @skb: packet to extract header from
   * @haddr: destination buffer
   */
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
220
  int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221
  {
b95cce357   Stephen Hemminger   [NET]: Wrap hard_...
222
  	const struct ethhdr *eth = eth_hdr(skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
223
224
225
  	memcpy(haddr, eth->h_source, ETH_ALEN);
  	return ETH_ALEN;
  }
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
226
  EXPORT_SYMBOL(eth_header_parse);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
227

d3e01f718   Stephen Hemminger   [ETH]: docbook co...
228
229
230
231
  /**
   * eth_header_cache - fill cache entry from neighbour
   * @neigh: source neighbour
   * @hh: destination cache entry
48daec034   Randy Dunlap   net: fix eth.c ke...
232
   * @type: Ethernet type field
d3e01f718   Stephen Hemminger   [ETH]: docbook co...
233
234
   * Create an Ethernet header template from the neighbour.
   */
e69dd336e   David S. Miller   net: Push protoco...
235
  int eth_header_cache(const struct neighbour *neigh, struct hh_cache *hh, __be16 type)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
236
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
237
  	struct ethhdr *eth;
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
238
  	const struct net_device *dev = neigh->dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
239

2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
240
241
  	eth = (struct ethhdr *)
  	    (((u8 *) hh->hh_data) + (HH_DATA_OFF(sizeof(*eth))));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242

f576e24ff   YOSHIFUJI Hideaki   [NET] ETHERNET: U...
243
  	if (type == htons(ETH_P_802_3))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
244
245
246
  		return -1;
  
  	eth->h_proto = type;
23f1f4eff   Stephen Hemminger   [NET] ethernet: o...
247
248
  	memcpy(eth->h_source, dev->dev_addr, ETH_ALEN);
  	memcpy(eth->h_dest, neigh->ha, ETH_ALEN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
249
250
251
  	hh->hh_len = ETH_HLEN;
  	return 0;
  }
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
252
  EXPORT_SYMBOL(eth_header_cache);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
253

d3e01f718   Stephen Hemminger   [ETH]: docbook co...
254
255
256
257
258
259
  /**
   * eth_header_cache_update - update cache entry
   * @hh: destination cache entry
   * @dev: network device
   * @haddr: new hardware address
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
260
261
   * Called by Address Resolution module to notify changes in address.
   */
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
262
263
264
  void eth_header_cache_update(struct hh_cache *hh,
  			     const struct net_device *dev,
  			     const unsigned char *haddr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
265
  {
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
266
  	memcpy(((u8 *) hh->hh_data) + HH_DATA_OFF(sizeof(struct ethhdr)),
23f1f4eff   Stephen Hemminger   [NET] ethernet: o...
267
  	       haddr, ETH_ALEN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
268
  }
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
269
  EXPORT_SYMBOL(eth_header_cache_update);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
270

d3e01f718   Stephen Hemminger   [ETH]: docbook co...
271
272
273
274
275
276
277
278
279
  /**
   * eth_mac_addr - set new Ethernet hardware address
   * @dev: network device
   * @p: socket address
   * Change hardware address of device.
   *
   * This doesn't change hardware matching, so needs to be overridden
   * for most real devices.
   */
ccad637b0   Stephen Hemminger   netdev: expose et...
280
  int eth_mac_addr(struct net_device *dev, void *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
281
  {
2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
282
  	struct sockaddr *addr = p;
71bffe556   Patrick McHardy   [ETH]: Validate a...
283

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284
285
  	if (netif_running(dev))
  		return -EBUSY;
71bffe556   Patrick McHardy   [ETH]: Validate a...
286
287
  	if (!is_valid_ether_addr(addr->sa_data))
  		return -EADDRNOTAVAIL;
23f1f4eff   Stephen Hemminger   [NET] ethernet: o...
288
  	memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
289
290
  	return 0;
  }
ccad637b0   Stephen Hemminger   netdev: expose et...
291
  EXPORT_SYMBOL(eth_mac_addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292

d3e01f718   Stephen Hemminger   [ETH]: docbook co...
293
294
295
296
297
298
299
300
  /**
   * eth_change_mtu - set new MTU size
   * @dev: network device
   * @new_mtu: new Maximum Transfer Unit
   *
   * Allow changing MTU size. Needs to be overridden for devices
   * supporting jumbo frames.
   */
ccad637b0   Stephen Hemminger   netdev: expose et...
301
  int eth_change_mtu(struct net_device *dev, int new_mtu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
302
  {
46f25dffb   Kris Katterjohn   [NET]: Change 150...
303
  	if (new_mtu < 68 || new_mtu > ETH_DATA_LEN)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
304
305
306
307
  		return -EINVAL;
  	dev->mtu = new_mtu;
  	return 0;
  }
ccad637b0   Stephen Hemminger   netdev: expose et...
308
  EXPORT_SYMBOL(eth_change_mtu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
309

ccad637b0   Stephen Hemminger   netdev: expose et...
310
  int eth_validate_addr(struct net_device *dev)
bada339ba   Jeff Garzik   [NET]: Validate d...
311
312
  {
  	if (!is_valid_ether_addr(dev->dev_addr))
2ed9926e1   Patrick McHardy   [NET]: Return mor...
313
  		return -EADDRNOTAVAIL;
bada339ba   Jeff Garzik   [NET]: Validate d...
314
315
316
  
  	return 0;
  }
ccad637b0   Stephen Hemminger   netdev: expose et...
317
  EXPORT_SYMBOL(eth_validate_addr);
bada339ba   Jeff Garzik   [NET]: Validate d...
318

3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
319
320
321
322
323
324
325
  const struct header_ops eth_header_ops ____cacheline_aligned = {
  	.create		= eth_header,
  	.parse		= eth_header_parse,
  	.rebuild	= eth_rebuild_header,
  	.cache		= eth_header_cache,
  	.cache_update	= eth_header_cache_update,
  };
d3e01f718   Stephen Hemminger   [ETH]: docbook co...
326
327
328
329
  /**
   * ether_setup - setup Ethernet network device
   * @dev: network device
   * Fill in the fields of the device structure with Ethernet-generic values.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
330
331
332
   */
  void ether_setup(struct net_device *dev)
  {
3b04ddde0   Stephen Hemminger   [NET]: Move hardw...
333
  	dev->header_ops		= &eth_header_ops;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
334
335
  	dev->type		= ARPHRD_ETHER;
  	dev->hard_header_len 	= ETH_HLEN;
46f25dffb   Kris Katterjohn   [NET]: Change 150...
336
  	dev->mtu		= ETH_DATA_LEN;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
337
  	dev->addr_len		= ETH_ALEN;
03d52d7cf   YOSHIFUJI Hideaki   [NET] ETHERNET: F...
338
  	dev->tx_queue_len	= 1000;	/* Ethernet wants good queues */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
339
  	dev->flags		= IFF_BROADCAST|IFF_MULTICAST;
31dda0ae9   nhorman   net: don't clear ...
340
  	dev->priv_flags		|= IFF_TX_SKB_SHARING;
03d52d7cf   YOSHIFUJI Hideaki   [NET] ETHERNET: F...
341

2e4ca75b3   Stephen Hemminger   [ETH]: indentatio...
342
  	memset(dev->broadcast, 0xFF, ETH_ALEN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
343
344
345
346
347
  
  }
  EXPORT_SYMBOL(ether_setup);
  
  /**
36909ea43   Tom Herbert   net: Add alloc_ne...
348
   * alloc_etherdev_mqs - Allocates and sets up an Ethernet device
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
349
   * @sizeof_priv: Size of additional driver-private structure to be allocated
d3e01f718   Stephen Hemminger   [ETH]: docbook co...
350
   *	for this Ethernet device
36909ea43   Tom Herbert   net: Add alloc_ne...
351
   * @txqs: The number of TX queues this device has.
3806b4f3b   Randy Dunlap   eth: fix new kern...
352
   * @rxqs: The number of RX queues this device has.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
353
   *
d3e01f718   Stephen Hemminger   [ETH]: docbook co...
354
   * Fill in the fields of the device structure with Ethernet-generic
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
355
356
357
   * values. Basically does everything except registering the device.
   *
   * Constructs a new net device, complete with a private data area of
d3e01f718   Stephen Hemminger   [ETH]: docbook co...
358
   * size (sizeof_priv).  A 32-byte (not bit) alignment is enforced for
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
359
360
   * this private data area.
   */
36909ea43   Tom Herbert   net: Add alloc_ne...
361
362
  struct net_device *alloc_etherdev_mqs(int sizeof_priv, unsigned int txqs,
  				      unsigned int rxqs)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
363
  {
36909ea43   Tom Herbert   net: Add alloc_ne...
364
  	return alloc_netdev_mqs(sizeof_priv, "eth%d", ether_setup, txqs, rxqs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
365
  }
36909ea43   Tom Herbert   net: Add alloc_ne...
366
  EXPORT_SYMBOL(alloc_etherdev_mqs);
0795af572   Joe Perches   [NET]: Introduce ...
367

7ffc49a6e   Michael Chan   [ETH]: Combine fo...
368
  static size_t _format_mac_addr(char *buf, int buflen,
53f91dc1f   Changli Gao   net: use scnprint...
369
  			       const unsigned char *addr, int len)
0795af572   Joe Perches   [NET]: Introduce ...
370
  {
7ffc49a6e   Michael Chan   [ETH]: Combine fo...
371
372
373
374
375
376
377
  	int i;
  	char *cp = buf;
  
  	for (i = 0; i < len; i++) {
  		cp += scnprintf(cp, buflen - (cp - buf), "%02x", addr[i]);
  		if (i == len - 1)
  			break;
53f91dc1f   Changli Gao   net: use scnprint...
378
  		cp += scnprintf(cp, buflen - (cp - buf), ":");
7ffc49a6e   Michael Chan   [ETH]: Combine fo...
379
380
381
382
383
384
385
386
387
  	}
  	return cp - buf;
  }
  
  ssize_t sysfs_format_mac(char *buf, const unsigned char *addr, int len)
  {
  	size_t l;
  
  	l = _format_mac_addr(buf, PAGE_SIZE, addr, len);
53f91dc1f   Changli Gao   net: use scnprint...
388
389
  	l += scnprintf(buf + l, PAGE_SIZE - l, "
  ");
a02cec215   Eric Dumazet   net: return opera...
390
  	return (ssize_t)l;
7ffc49a6e   Michael Chan   [ETH]: Combine fo...
391
392
  }
  EXPORT_SYMBOL(sysfs_format_mac);