Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Release 1.0
[palacios.git] / geekos / include / lwip / lwip / netif.h
1 /*
2  * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
3  * All rights reserved. 
4  * 
5  * Redistribution and use in source and binary forms, with or without modification, 
6  * are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  *    this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright notice,
11  *    this list of conditions and the following disclaimer in the documentation
12  *    and/or other materials provided with the distribution.
13  * 3. The name of the author may not be used to endorse or promote products
14  *    derived from this software without specific prior written permission. 
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
19  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
21  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
24  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
25  * OF SUCH DAMAGE.
26  *
27  * This file is part of the lwIP TCP/IP stack.
28  * 
29  * Author: Adam Dunkels <adam@sics.se>
30  *
31  */
32 #ifndef __LWIP_NETIF_H__
33 #define __LWIP_NETIF_H__
34
35 #include "lwip/opt.h"
36
37 #include "lwip/err.h"
38
39 #include "lwip/ip_addr.h"
40
41 #include "lwip/inet.h"
42 #include "lwip/pbuf.h"
43 #if LWIP_DHCP
44 struct dhcp;
45 #endif
46 #if LWIP_AUTOIP
47 struct autoip;
48 #endif
49
50 #ifdef __cplusplus
51 extern "C" {
52 #endif
53
54 /* Throughout this file, IP addresses are expected to be in
55  * the same byte order as in IP_PCB. */
56
57 /** must be the maximum of all used hardware address lengths
58     across all types of interfaces in use */
59 #define NETIF_MAX_HWADDR_LEN 6U
60
61 /** TODO: define the use (where, when, whom) of netif flags */
62
63 /** whether the network interface is 'up'. this is
64  * a software flag used to control whether this network
65  * interface is enabled and processes traffic.
66  */
67 #define NETIF_FLAG_UP           0x01U
68 /** if set, the netif has broadcast capability */
69 #define NETIF_FLAG_BROADCAST    0x02U
70 /** if set, the netif is one end of a point-to-point connection */
71 #define NETIF_FLAG_POINTTOPOINT 0x04U
72 /** if set, the interface is configured using DHCP */
73 #define NETIF_FLAG_DHCP         0x08U
74 /** if set, the interface has an active link
75  *  (set by the network interface driver) */
76 #define NETIF_FLAG_LINK_UP      0x10U
77 /** if set, the netif is an device using ARP */
78 #define NETIF_FLAG_ETHARP       0x20U
79 /** if set, the netif has IGMP capability */
80 #define NETIF_FLAG_IGMP         0x40U
81
82 /** Generic data structure used for all lwIP network interfaces.
83  *  The following fields should be filled in by the initialization
84  *  function for the device driver: hwaddr_len, hwaddr[], mtu, flags */
85
86 struct netif {
87   /** pointer to next in linked list */
88   struct netif *next;
89
90   /** IP address configuration in network byte order */
91   struct ip_addr ip_addr;
92   struct ip_addr netmask;
93   struct ip_addr gw;
94
95   /** This function is called by the network device driver
96    *  to pass a packet up the TCP/IP stack. */
97   err_t (* input)(struct pbuf *p, struct netif *inp);
98   /** This function is called by the IP module when it wants
99    *  to send a packet on the interface. This function typically
100    *  first resolves the hardware address, then sends the packet. */
101   err_t (* output)(struct netif *netif, struct pbuf *p,
102        struct ip_addr *ipaddr);
103   /** This function is called by the ARP module when it wants
104    *  to send a packet on the interface. This function outputs
105    *  the pbuf as-is on the link medium. */
106   err_t (* linkoutput)(struct netif *netif, struct pbuf *p);
107 #if LWIP_NETIF_STATUS_CALLBACK
108   /** This function is called when the netif state is set to up or down
109    */
110   void (* status_callback)(struct netif *netif);
111 #endif /* LWIP_NETIF_STATUS_CALLBACK */
112 #if LWIP_NETIF_LINK_CALLBACK
113   /** This function is called when the netif link is set to up or down
114    */
115   void (* link_callback)(struct netif *netif);
116 #endif /* LWIP_NETIF_LINK_CALLBACK */
117   /** This field can be set by the device driver and could point
118    *  to state information for the device. */
119   void *state;
120 #if LWIP_DHCP
121   /** the DHCP client state information for this netif */
122   struct dhcp *dhcp;
123 #endif /* LWIP_DHCP */
124 #if LWIP_AUTOIP
125   /** the AutoIP client state information for this netif */
126   struct autoip *autoip;
127 #endif
128 #if LWIP_NETIF_HOSTNAME
129   /* the hostname for this netif, NULL is a valid value */
130   char*  hostname;
131 #endif /* LWIP_NETIF_HOSTNAME */
132   /** number of bytes used in hwaddr */
133   u8_t hwaddr_len;
134   /** link level hardware address of this interface */
135   u8_t hwaddr[NETIF_MAX_HWADDR_LEN];
136   /** maximum transfer unit (in bytes) */
137   u16_t mtu;
138   /** flags (see NETIF_FLAG_ above) */
139   u8_t flags;
140   /** descriptive abbreviation */
141   char name[2];
142   /** number of this interface */
143   u8_t num;
144 #if LWIP_SNMP
145   /** link type (from "snmp_ifType" enum from snmp.h) */
146   u8_t link_type;
147   /** (estimate) link speed */
148   u32_t link_speed;
149   /** timestamp at last change made (up/down) */
150   u32_t ts;
151   /** counters */
152   u32_t ifinoctets;
153   u32_t ifinucastpkts;
154   u32_t ifinnucastpkts;
155   u32_t ifindiscards;
156   u32_t ifoutoctets;
157   u32_t ifoutucastpkts;
158   u32_t ifoutnucastpkts;
159   u32_t ifoutdiscards;
160 #endif /* LWIP_SNMP */
161 #if LWIP_IGMP
162   /* This function could be called to add or delete a entry in the multicast filter table of the ethernet MAC.*/
163   err_t (*igmp_mac_filter)( struct netif *netif, struct ip_addr *group, u8_t action);
164 #endif /* LWIP_IGMP */
165 #if LWIP_NETIF_HWADDRHINT
166   u8_t *addr_hint;
167 #endif /* LWIP_NETIF_HWADDRHINT */
168 };
169
170 #if LWIP_SNMP
171 #define NETIF_INIT_SNMP(netif, type, speed) \
172   /* use "snmp_ifType" enum from snmp.h for "type", snmp_ifType_ethernet_csmacd by example */ \
173   netif->link_type = type;    \
174   /* your link speed here (units: bits per second) */  \
175   netif->link_speed = speed;  \
176   netif->ts = 0;              \
177   netif->ifinoctets = 0;      \
178   netif->ifinucastpkts = 0;   \
179   netif->ifinnucastpkts = 0;  \
180   netif->ifindiscards = 0;    \
181   netif->ifoutoctets = 0;     \
182   netif->ifoutucastpkts = 0;  \
183   netif->ifoutnucastpkts = 0; \
184   netif->ifoutdiscards = 0
185 #else /* LWIP_SNMP */
186 #define NETIF_INIT_SNMP(netif, type, speed)
187 #endif /* LWIP_SNMP */
188
189
190 /** The list of network interfaces. */
191 extern struct netif *netif_list;
192 /** The default network interface. */
193 extern struct netif *netif_default;
194
195 #define netif_init() /* Compatibility define, not init needed. */
196
197 struct netif *netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask,
198       struct ip_addr *gw,
199       void *state,
200       err_t (* init)(struct netif *netif),
201       err_t (* input)(struct pbuf *p, struct netif *netif));
202
203 void
204 netif_set_addr(struct netif *netif,struct ip_addr *ipaddr, struct ip_addr *netmask,
205     struct ip_addr *gw);
206 void netif_remove(struct netif * netif);
207
208 /* Returns a network interface given its name. The name is of the form
209    "et0", where the first two letters are the "name" field in the
210    netif structure, and the digit is in the num field in the same
211    structure. */
212 struct netif *netif_find(char *name);
213
214 void netif_set_default(struct netif *netif);
215
216 void netif_set_ipaddr(struct netif *netif, struct ip_addr *ipaddr);
217 void netif_set_netmask(struct netif *netif, struct ip_addr *netmask);
218 void netif_set_gw(struct netif *netif, struct ip_addr *gw);
219
220 void netif_set_up(struct netif *netif);
221 void netif_set_down(struct netif *netif);
222 u8_t netif_is_up(struct netif *netif);
223
224 #if LWIP_NETIF_STATUS_CALLBACK
225 /*
226  * Set callback to be called when interface is brought up/down
227  */
228 void netif_set_status_callback(struct netif *netif, void (* status_callback)(struct netif *netif));
229 #endif /* LWIP_NETIF_STATUS_CALLBACK */
230
231 #if LWIP_NETIF_LINK_CALLBACK
232 void netif_set_link_up(struct netif *netif);
233 void netif_set_link_down(struct netif *netif);
234 u8_t netif_is_link_up(struct netif *netif);
235 /*
236  * Set callback to be called when link is brought up/down
237  */
238 void netif_set_link_callback(struct netif *netif, void (* link_callback)(struct netif *netif));
239 #endif /* LWIP_NETIF_LINK_CALLBACK */
240
241 #ifdef __cplusplus
242 }
243 #endif
244
245 #endif /* __LWIP_NETIF_H__ */