Remove _PROTOCOL macros for gcc 3.2 compatibility
[people/xl0/gpxe.git] / src / include / gpxe / netdevice.h
1 #ifndef _GPXE_NETDEVICE_H
2 #define _GPXE_NETDEVICE_H
3
4 /** @file
5  *
6  * Network device management
7  *
8  */
9
10 #include <stdint.h>
11 #include <gpxe/list.h>
12 #include <gpxe/tables.h>
13
14 struct pk_buff;
15 struct net_device;
16 struct net_protocol;
17 struct ll_protocol;
18
19 /** Maximum length of a link-layer address */
20 #define MAX_LL_ADDR_LEN 6
21
22 /** Maximum length of a link-layer header */
23 #define MAX_LL_HEADER_LEN 16
24
25 /** Maximum length of a network-layer address */
26 #define MAX_NET_ADDR_LEN 4
27
28 /**
29  * A network-layer protocol
30  *
31  */
32 struct net_protocol {
33         /** Protocol name */
34         const char *name;
35         /**
36          * Process received packet
37          *
38          * @v pkb       Packet buffer
39          * @v netdev    Network device
40          * @v ll_source Link-layer source address
41          *
42          * This method takes ownership of the packet buffer.
43          */
44         int ( * rx ) ( struct pk_buff *pkb, struct net_device *netdev,
45                        const void *ll_source );
46         /**
47          * Transcribe network-layer address
48          *
49          * @v net_addr  Network-layer address
50          * @ret string  Human-readable transcription of address
51          *
52          * This method should convert the network-layer address into a
53          * human-readable format (e.g. dotted quad notation for IPv4).
54          *
55          * The buffer used to hold the transcription is statically
56          * allocated.
57          */
58         const char * ( *ntoa ) ( const void * net_addr );
59         /** Network-layer protocol
60          *
61          * This is an ETH_P_XXX constant, in network-byte order
62          */
63         uint16_t net_proto;
64         /** Network-layer address length */
65         uint8_t net_addr_len;
66 };
67
68 /**
69  * A link-layer protocol
70  *
71  */
72 struct ll_protocol {
73         /** Protocol name */
74         const char *name;
75         /**
76          * Transmit network-layer packet via network device
77          *
78          * @v pkb               Packet buffer
79          * @v netdev            Network device
80          * @v net_protocol      Network-layer protocol
81          * @v ll_dest           Link-layer destination address
82          * @ret rc              Return status code
83          *
84          * This method should prepend in the link-layer header
85          * (e.g. the Ethernet DIX header) and transmit the packet.
86          * This method takes ownership of the packet buffer.
87          */
88         int ( * tx ) ( struct pk_buff *pkb, struct net_device *netdev,
89                        struct net_protocol *net_protocol,
90                        const void *ll_dest );
91         /**
92          * Handle received packet
93          *
94          * @v pkb       Packet buffer
95          * @v netdev    Network device
96          *
97          * This method should strip off the link-layer header
98          * (e.g. the Ethernet DIX header) and pass the packet to
99          * net_rx().  This method takes ownership of the packet
100          * buffer.
101          */
102         int ( * rx ) ( struct pk_buff *pkb, struct net_device *netdev );
103         /**
104          * Transcribe link-layer address
105          *
106          * @v ll_addr   Link-layer address
107          * @ret string  Human-readable transcription of address
108          *
109          * This method should convert the link-layer address into a
110          * human-readable format.
111          *
112          * The buffer used to hold the transcription is statically
113          * allocated.
114          */
115         const char * ( * ntoa ) ( const void * ll_addr );
116         /** Link-layer protocol
117          *
118          * This is an ARPHRD_XXX constant, in network byte order.
119          */
120         uint16_t ll_proto;
121         /** Link-layer address length */
122         uint8_t ll_addr_len;
123         /** Link-layer broadcast address */
124         const uint8_t *ll_broadcast;
125 };
126
127 /**
128  * A network device
129  *
130  * This structure represents a piece of networking hardware.  It has
131  * properties such as a link-layer address and methods for
132  * transmitting and receiving raw packets.
133  *
134  * Note that this structure must represent a generic network device,
135  * not just an Ethernet device.
136  */
137 struct net_device {
138         /** List of network devices */
139         struct list_head list;
140         /** Transmit packet
141          *
142          * @v netdev    Network device
143          * @v pkb       Packet buffer
144          * @ret rc      Return status code
145          *
146          * This method should cause the hardware to initiate
147          * transmission of the packet buffer.
148          *
149          * Ownership of the packet buffer is transferred to the @c
150          * net_device, which must eventually call free_pkb() to
151          * release the buffer.
152          */
153         int ( * transmit ) ( struct net_device *netdev, struct pk_buff *pkb );
154         /** Poll for received packet
155          *
156          * @v netdev    Network device
157          *
158          * This method should cause the hardware to check for received
159          * packets.  Any received packets should be delivered via
160          * netdev_rx().
161          */
162         void ( * poll ) ( struct net_device *netdev );
163
164         /** Link-layer protocol */
165         struct ll_protocol *ll_protocol;
166         /** Link-layer address
167          *
168          * For Ethernet, this is the MAC address.
169          */
170         uint8_t ll_addr[MAX_LL_ADDR_LEN];
171
172         /** Received packet queue */
173         struct list_head rx_queue;
174
175         /** Driver private data */
176         void *priv;
177 };
178
179 /** Declare a link-layer protocol */
180 #define __ll_protocol  __table ( ll_protocols, 01 )
181
182 /** Declare a network-layer protocol */
183 #define __net_protocol __table ( net_protocols, 01 )
184
185 /**
186  * Get network device name
187  *
188  * @v netdev            Network device
189  * @ret name            Network device name
190  *
191  * The name will be the device's link-layer address.
192  */
193 static inline const char * netdev_name ( struct net_device *netdev ) {
194         return netdev->ll_protocol->ntoa ( netdev->ll_addr );
195 }
196
197 extern int netdev_tx ( struct net_device *netdev, struct pk_buff *pkb );
198 extern void netdev_rx ( struct net_device *netdev, struct pk_buff *pkb );
199 extern int net_tx ( struct pk_buff *pkb, struct net_device *netdev,
200                     struct net_protocol *net_protocol, const void *ll_dest );
201 extern int net_rx ( struct pk_buff *pkb, struct net_device *netdev,
202                     uint16_t net_proto, const void *ll_source );
203 extern int netdev_poll ( struct net_device *netdev );
204 extern struct pk_buff * netdev_rx_dequeue ( struct net_device *netdev );
205 extern struct net_device * alloc_netdev ( size_t priv_size );
206 extern int register_netdev ( struct net_device *netdev );
207 extern void unregister_netdev ( struct net_device *netdev );
208 extern void free_netdev ( struct net_device *netdev );
209 extern struct net_device * next_netdev ( void );
210
211 #endif /* _GPXE_NETDEVICE_H */