Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
802
fc.c
Go to the documentation of this file.
1
/*
2
* NET3: Fibre Channel device handling subroutines
3
*
4
* This program is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU General Public License
6
* as published by the Free Software Foundation; either version
7
* 2 of the License, or (at your option) any later version.
8
*
9
* Vineet Abraham <
[email protected]
>
10
* v 1.0 03/22/99
11
*/
12
13
#include <asm/uaccess.h>
14
#include <linux/types.h>
15
#include <linux/kernel.h>
16
#include <linux/string.h>
17
#include <
linux/mm.h
>
18
#include <linux/socket.h>
19
#include <linux/in.h>
20
#include <
linux/inet.h
>
21
#include <linux/netdevice.h>
22
#include <
linux/fcdevice.h
>
23
#include <
linux/skbuff.h
>
24
#include <linux/errno.h>
25
#include <
linux/timer.h
>
26
#include <linux/net.h>
27
#include <
linux/proc_fs.h
>
28
#include <
linux/init.h
>
29
#include <linux/export.h>
30
#include <
net/arp.h
>
31
32
/*
33
* Put the headers on a Fibre Channel packet.
34
*/
35
36
static
int
fc_header(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
,
37
unsigned
short
type
,
38
const
void
*
daddr
,
const
void
*
saddr
,
unsigned
int
len)
39
{
40
struct
fch_hdr
*fch;
41
int
hdr_len
;
42
43
/*
44
* Add the 802.2 SNAP header if IP as the IPv4 code calls
45
* dev->hard_header directly.
46
*/
47
if
(type ==
ETH_P_IP
|| type ==
ETH_P_ARP
)
48
{
49
struct
fcllc
*
fcllc
;
50
51
hdr_len =
sizeof
(
struct
fch_hdr
) +
sizeof
(
struct
fcllc);
52
fch = (
struct
fch_hdr
*)
skb_push
(skb, hdr_len);
53
fcllc = (
struct
fcllc *)(fch+1);
54
fcllc->
dsap
= fcllc->
ssap
=
EXTENDED_SAP
;
55
fcllc->
llc
=
UI_CMD
;
56
fcllc->
protid
[0] = fcllc->
protid
[1] = fcllc->
protid
[2] = 0x00;
57
fcllc->
ethertype
=
htons
(type);
58
}
59
else
60
{
61
hdr_len =
sizeof
(
struct
fch_hdr
);
62
fch = (
struct
fch_hdr
*)
skb_push
(skb, hdr_len);
63
}
64
65
if
(saddr)
66
memcpy
(fch->saddr,saddr,dev->
addr_len
);
67
else
68
memcpy
(fch->saddr,dev->
dev_addr
,dev->
addr_len
);
69
70
if
(daddr)
71
{
72
memcpy
(fch->daddr,daddr,dev->
addr_len
);
73
return
hdr_len
;
74
}
75
return
-
hdr_len
;
76
}
77
78
/*
79
* A neighbour discovery of some species (eg arp) has completed. We
80
* can now send the packet.
81
*/
82
83
static
int
fc_rebuild_header(
struct
sk_buff
*skb)
84
{
85
#ifdef CONFIG_INET
86
struct
fch_hdr
*fch=(
struct
fch_hdr
*)skb->
data
;
87
struct
fcllc *fcllc=(
struct
fcllc *)(skb->
data
+
sizeof
(
struct
fch_hdr
));
88
if
(fcllc->
ethertype
!=
htons
(
ETH_P_IP
)) {
89
printk
(
"fc_rebuild_header: Don't know how to resolve type %04X addresses ?\n"
,
ntohs
(fcllc->
ethertype
));
90
return
0;
91
}
92
return
arp_find
(fch->
daddr
, skb);
93
#else
94
return
0;
95
#endif
96
}
97
98
static
const
struct
header_ops
fc_header_ops = {
99
.create = fc_header,
100
.rebuild = fc_rebuild_header,
101
};
102
103
static
void
fc_setup(
struct
net_device
*dev)
104
{
105
dev->
header_ops
= &fc_header_ops;
106
dev->
type
=
ARPHRD_IEEE802
;
107
dev->
hard_header_len
=
FC_HLEN
;
108
dev->
mtu
= 2024;
109
dev->
addr_len
=
FC_ALEN
;
110
dev->
tx_queue_len
= 100;
/* Long queues on fc */
111
dev->
flags
=
IFF_BROADCAST
;
112
113
memset
(dev->
broadcast
, 0xFF,
FC_ALEN
);
114
}
115
127
struct
net_device
*
alloc_fcdev
(
int
sizeof_priv)
128
{
129
return
alloc_netdev
(sizeof_priv,
"fc%d"
, fc_setup);
130
}
131
EXPORT_SYMBOL
(
alloc_fcdev
);
Generated on Thu Jan 10 2013 14:56:34 for Linux Kernel by
1.8.2