iPXE
Functions | Variables
ipv4.c File Reference

IPv4 protocol. More...

#include <string.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <byteswap.h>
#include <ipxe/list.h>
#include <ipxe/in.h>
#include <ipxe/arp.h>
#include <ipxe/if_ether.h>
#include <ipxe/iobuf.h>
#include <ipxe/netdevice.h>
#include <ipxe/ip.h>
#include <ipxe/tcpip.h>
#include <ipxe/dhcp.h>
#include <ipxe/settings.h>
#include <ipxe/fragment.h>
#include <ipxe/ipstat.h>
#include <ipxe/profile.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
struct ip_statistics_family ipv4_stats_family __ip_statistics_family (IP_STATISTICS_IPV4)
 IPv4 statistics family. More...
 
static int ipv4_add_miniroute (struct net_device *netdev, struct in_addr address, struct in_addr network, struct in_addr netmask, struct in_addr gateway)
 Add IPv4 minirouting table entry. More...
 
static int ipv4_add_static (struct net_device *netdev, struct in_addr address, const void *routes, size_t len)
 Add static route minirouting table entries. More...
 
static int ipv4_add_miniroutes (struct net_device *netdev, struct in_addr address)
 Add IPv4 minirouting table entries. More...
 
static void ipv4_del_miniroute (struct ipv4_miniroute *miniroute)
 Delete IPv4 minirouting table entry. More...
 
static void ipv4_del_miniroutes (void)
 Delete IPv4 minirouting table entries. More...
 
struct ipv4_minirouteipv4_route (unsigned int scope_id, struct in_addr *dest)
 Perform IPv4 routing. More...
 
static struct net_deviceipv4_netdev (struct sockaddr_tcpip *st_dest)
 Determine transmitting network device. More...
 
static int ipv4_is_fragment (struct fragment *fragment, struct io_buffer *iobuf, size_t hdrlen __unused)
 Check if IPv4 fragment matches fragment reassembly buffer. More...
 
static size_t ipv4_fragment_offset (struct io_buffer *iobuf, size_t hdrlen __unused)
 Get IPv4 fragment offset. More...
 
static int ipv4_more_fragments (struct io_buffer *iobuf, size_t hdrlen __unused)
 Check if more fragments exist. More...
 
static uint16_t ipv4_pshdr_chksum (struct io_buffer *iobuf, uint16_t csum)
 Add IPv4 pseudo-header checksum to existing checksum. More...
 
static int ipv4_tx (struct io_buffer *iobuf, struct tcpip_protocol *tcpip_protocol, struct sockaddr_tcpip *st_src, struct sockaddr_tcpip *st_dest, struct net_device *netdev, uint16_t *trans_csum)
 Transmit IP packet. More...
 
int ipv4_has_any_addr (struct net_device *netdev)
 Check if network device has any IPv4 address. More...
 
static int ipv4_has_addr (struct net_device *netdev, struct in_addr addr)
 Check if network device has a specific IPv4 address. More...
 
static int ipv4_rx (struct io_buffer *iobuf, struct net_device *netdev, const void *ll_dest __unused, const void *ll_source __unused, unsigned int flags)
 Process incoming packets. More...
 
static int ipv4_arp_check (struct net_device *netdev, const void *net_addr)
 Check existence of IPv4 address for ARP. More...
 
int inet_aton (const char *string, struct in_addr *in)
 Parse IPv4 address. More...
 
char * inet_ntoa (struct in_addr in)
 Convert IPv4 address to dotted-quad notation. More...
 
static const char * ipv4_ntoa (const void *net_addr)
 Transcribe IPv4 address. More...
 
static const char * ipv4_sock_ntoa (struct sockaddr *sa)
 Transcribe IPv4 socket address. More...
 
static int ipv4_sock_aton (const char *string, struct sockaddr *sa)
 Parse IPv4 socket address. More...
 
int parse_ipv4_setting (const struct setting_type *type __unused, const char *value, void *buf, size_t len)
 Parse IPv4 address setting value. More...
 
int format_ipv4_setting (const struct setting_type *type __unused, const void *raw, size_t raw_len, char *buf, size_t len)
 Format IPv4 address setting value. More...
 
const struct setting ip_setting __setting (SETTING_IP4, ip)
 IPv4 address setting. More...
 
const struct setting netmask_setting __setting (SETTING_IP4, netmask)
 IPv4 subnet mask setting. More...
 
const struct setting gateway_setting __setting (SETTING_IP4, gateway)
 Default gateway setting. More...
 
const struct setting static_route_setting __setting (SETTING_IP4, static_routes)
 Classless static routes setting. More...
 
static int ipv4_gratuitous_arp (struct net_device *netdev, struct in_addr address)
 Send gratuitous ARP, if applicable. More...
 
static int ipv4_settings (int(*apply)(struct net_device *netdev, struct in_addr address))
 Process IPv4 network device settings. More...
 
static int ipv4_apply_routes (void)
 Create IPv4 routing table based on configured settings. More...
 
 REQUIRING_SYMBOL (ipv4_protocol)
 
 REQUIRE_OBJECT (icmpv4)
 

Variables

static uint8_t next_ident_high = 0
 
struct list_head ipv4_miniroutes = LIST_HEAD_INIT ( ipv4_miniroutes )
 List of IPv4 miniroutes. More...
 
static struct ip_statistics ipv4_stats
 IPv4 statistics. More...
 
static struct profiler ipv4_tx_profiler __profiler = { .name = "ipv4.tx" }
 Transmit profiler. More...
 
static struct fragment_reassembler ipv4_reassembler
 IPv4 fragment reassembler. More...
 
struct net_protocol ipv4_protocol __net_protocol
 IPv4 protocol. More...
 
struct tcpip_net_protocol ipv4_tcpip_protocol __tcpip_net_protocol
 IPv4 TCPIP net protocol. More...
 
struct arp_net_protocol ipv4_arp_protocol __arp_net_protocol
 IPv4 ARP protocol. More...
 
struct sockaddr_converter ipv4_sockaddr_converter __sockaddr_converter
 IPv4 socket address converter. More...
 
struct settings_applicator ipv4_settings_applicator __settings_applicator
 IPv4 settings applicator. More...
 

Detailed Description

IPv4 protocol.

Definition in file ipv4.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ __ip_statistics_family()

struct ip_statistics_family ipv4_stats_family __ip_statistics_family ( IP_STATISTICS_IPV4  )

IPv4 statistics family.

◆ ipv4_add_miniroute()

static int ipv4_add_miniroute ( struct net_device netdev,
struct in_addr  address,
struct in_addr  network,
struct in_addr  netmask,
struct in_addr  gateway 
)
static

Add IPv4 minirouting table entry.

Parameters
netdevNetwork device
addressIPv4 address
networkSubnet address
netmaskSubnet mask
gatewayGateway address (if any)
Return values
rcReturn status code

Definition at line 85 of file ipv4.c.

89  {
90  struct ipv4_miniroute *miniroute;
91  struct ipv4_miniroute *before;
92  struct in_addr hostmask;
93  struct in_addr broadcast;
94 
95  /* Calculate host mask */
96  if ( gateway.s_addr || IN_IS_SMALL ( netmask.s_addr ) ) {
97  hostmask.s_addr = INADDR_NONE;
98  } else {
99  hostmask.s_addr = ~netmask.s_addr;
100  }
101  broadcast.s_addr = ( network.s_addr | hostmask.s_addr );
102 
103  /* Print debugging information */
104  DBGC ( netdev, "IPv4 add %s", inet_ntoa ( address ) );
105  DBGC ( netdev, " for %s", inet_ntoa ( network ) );
106  DBGC ( netdev, "/%s ", inet_ntoa ( netmask ) );
107  DBGC ( netdev, "bc %s ", inet_ntoa ( broadcast ) );
108  if ( gateway.s_addr )
109  DBGC ( netdev, "gw %s ", inet_ntoa ( gateway ) );
110  DBGC ( netdev, "via %s\n", netdev->name );
111 
112  /* Allocate and populate miniroute structure */
113  miniroute = malloc ( sizeof ( *miniroute ) );
114  if ( ! miniroute ) {
115  DBGC ( netdev, "IPv4 could not add miniroute\n" );
116  return -ENOMEM;
117  }
118 
119  /* Record routing information */
120  miniroute->netdev = netdev_get ( netdev );
121  miniroute->address = address;
122  miniroute->network = network;
123  miniroute->netmask = netmask;
124  miniroute->hostmask = hostmask;
125  miniroute->gateway = gateway;
126 
127  /* Add to routing table ahead of any less specific routes */
129  if ( netmask.s_addr & ~before->netmask.s_addr )
130  break;
131  }
132  list_add_tail ( &miniroute->list, &before->list );
133 
134  return 0;
135 }
struct in_addr netmask
Subnet mask.
Definition: ip.h:98
struct list_head list
List of miniroutes.
Definition: ip.h:65
uint64_t address
Base address.
Definition: ena.h:24
struct net_device * netdev
Network device.
Definition: ip.h:72
#define DBGC(...)
Definition: compiler.h:505
int32_t before
Initial microcode version.
Definition: ucode.h:16
struct in_addr address
IPv4 address.
Definition: ip.h:83
struct in_addr hostmask
Host mask.
Definition: ip.h:133
#define IN_IS_SMALL(mask)
Definition: in.h:36
#define ENOMEM
Not enough space.
Definition: errno.h:534
An IPv4 address/routing table entry.
Definition: ip.h:63
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
struct in_addr gateway
Gateway address, or zero.
Definition: ip.h:108
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
static struct net_device * netdev
Definition: gdbudp.c:52
IP address structure.
Definition: in.h:41
char * inet_ntoa(struct in_addr in)
Convert IPv4 address to dotted-quad notation.
Definition: ipv4.c:813
static struct net_device * netdev_get(struct net_device *netdev)
Get reference to network device.
Definition: netdevice.h:564
struct in_addr network
Subnet network address.
Definition: ip.h:92
void * malloc(size_t size)
Allocate memory.
Definition: malloc.c:620
struct list_head ipv4_miniroutes
List of IPv4 miniroutes.
Definition: ipv4.c:57
uint32_t s_addr
Definition: in.h:42
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
#define INADDR_NONE
Definition: in.h:19

References address, ipv4_miniroute::address, before, DBGC, ENOMEM, ipv4_miniroute::gateway, ipv4_miniroute::hostmask, IN_IS_SMALL, INADDR_NONE, inet_ntoa(), ipv4_miniroutes, ipv4_miniroute::list, list_add_tail, list_for_each_entry, malloc(), net_device::name, netdev, ipv4_miniroute::netdev, netdev_get(), ipv4_miniroute::netmask, ipv4_miniroute::network, and in_addr::s_addr.

Referenced by ipv4_add_miniroutes(), and ipv4_add_static().

◆ ipv4_add_static()

static int ipv4_add_static ( struct net_device netdev,
struct in_addr  address,
const void *  routes,
size_t  len 
)
static

Add static route minirouting table entries.

Parameters
netdevNetwork device
addressIPv4 address
routesStatic routes
lenLength of static routes
Return values
rcReturn status code

Definition at line 146 of file ipv4.c.

147  {
148  const struct {
149  struct in_addr address;
150  } __attribute__ (( packed )) *encoded;
151  struct in_addr netmask;
152  struct in_addr network;
153  struct in_addr gateway;
154  unsigned int width;
155  unsigned int masklen;
156  size_t remaining;
157  const void *data;
158  int rc;
159 
160  /* Parse and add static routes */
161  for ( data = routes, remaining = len ; remaining ; ) {
162 
163  /* Extract subnet mask width */
164  width = *( ( uint8_t * ) data );
165  data++;
166  remaining--;
167  masklen = ( ( width + 7 ) / 8 );
168 
169  /* Check remaining length */
170  if ( ( masklen + sizeof ( gateway ) ) > remaining ) {
171  DBGC ( netdev, "IPv4 invalid static route:\n" );
172  DBGC_HDA ( netdev, 0, routes, len );
173  return -EINVAL;
174  }
175 
176  /* Calculate subnet mask */
177  if ( width ) {
178  netmask.s_addr = htonl ( -1UL << ( 32 - width ) );
179  } else {
180  netmask.s_addr = 0;
181  }
182 
183  /* Extract network address */
184  encoded = data;
185  network.s_addr = ( encoded->address.s_addr & netmask.s_addr );
186  data += masklen;
187  remaining -= masklen;
188 
189  /* Extract gateway address */
190  encoded = data;
191  gateway.s_addr = encoded->address.s_addr;
192  data += sizeof ( gateway );
193  remaining -= sizeof ( gateway );
194 
195  /* Add route */
196  if ( ( rc = ipv4_add_miniroute ( netdev, address, network,
197  netmask, gateway ) ) != 0 )
198  return rc;
199  }
200 
201  return 0;
202 }
#define __attribute__(x)
Definition: compiler.h:10
#define EINVAL
Invalid argument.
Definition: errno.h:428
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
uint64_t address
Base address.
Definition: ena.h:24
#define DBGC(...)
Definition: compiler.h:505
#define htonl(value)
Definition: byteswap.h:133
#define DBGC_HDA(...)
Definition: compiler.h:506
ring len
Length.
Definition: dwmac.h:231
static struct net_device * netdev
Definition: gdbudp.c:52
IP address structure.
Definition: in.h:41
unsigned char uint8_t
Definition: stdint.h:10
static int ipv4_add_miniroute(struct net_device *netdev, struct in_addr address, struct in_addr network, struct in_addr netmask, struct in_addr gateway)
Add IPv4 minirouting table entry.
Definition: ipv4.c:85
uint8_t data[48]
Additional event data.
Definition: ena.h:22

References __attribute__, address, data, DBGC, DBGC_HDA, EINVAL, htonl, ipv4_add_miniroute(), len, netdev, rc, and in_addr::s_addr.

Referenced by ipv4_add_miniroutes().

◆ ipv4_add_miniroutes()

static int ipv4_add_miniroutes ( struct net_device netdev,
struct in_addr  address 
)
static

Add IPv4 minirouting table entries.

Parameters
netdevNetwork device
addressIPv4 address
Return values
rcReturn status code

Definition at line 211 of file ipv4.c.

212  {
213  struct settings *settings = netdev_settings ( netdev );
214  struct in_addr none = { 0 };
215  struct in_addr netmask;
216  struct in_addr gateway;
217  struct in_addr network;
218  void *routes;
219  int len;
220  int rc;
221 
222  /* Get subnet mask */
223  fetch_ipv4_setting ( settings, &netmask_setting, &netmask );
224 
225  /* Calculate default netmask, if necessary */
226  if ( ! netmask.s_addr ) {
227  if ( IN_IS_CLASSA ( address.s_addr ) ) {
228  netmask.s_addr = INADDR_NET_CLASSA;
229  } else if ( IN_IS_CLASSB ( address.s_addr ) ) {
230  netmask.s_addr = INADDR_NET_CLASSB;
231  } else if ( IN_IS_CLASSC ( address.s_addr ) ) {
232  netmask.s_addr = INADDR_NET_CLASSC;
233  }
234  }
235 
236  /* Get default gateway, if present */
237  fetch_ipv4_setting ( settings, &gateway_setting, &gateway );
238 
239  /* Get static routes, if present */
240  len = fetch_raw_setting_copy ( settings, &static_route_setting,
241  &routes );
242 
243  /* Add local address */
244  network.s_addr = ( address.s_addr & netmask.s_addr );
245  if ( ( rc = ipv4_add_miniroute ( netdev, address, network, netmask,
246  none ) ) != 0 )
247  goto done;
248 
249  /* Add static routes or default gateway, as applicable */
250  if ( len >= 0 ) {
251  if ( ( rc = ipv4_add_static ( netdev, address, routes,
252  len ) ) != 0 )
253  goto done;
254  } else if ( gateway.s_addr ) {
256  gateway ) ) != 0 )
257  goto done;
258  }
259 
260  done:
261  free ( routes );
262  return rc;
263 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define IN_IS_CLASSA(addr)
Definition: in.h:27
int fetch_raw_setting_copy(struct settings *settings, const struct setting *setting, void **data)
Fetch value of setting.
Definition: settings.c:821
int fetch_ipv4_setting(struct settings *settings, const struct setting *setting, struct in_addr *inp)
Fetch value of IPv4 address setting.
Definition: settings.c:912
uint64_t address
Base address.
Definition: ena.h:24
#define IN_IS_CLASSB(addr)
Definition: in.h:29
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition: netdevice.h:586
static int ipv4_add_static(struct net_device *netdev, struct in_addr address, const void *routes, size_t len)
Add static route minirouting table entries.
Definition: ipv4.c:146
ring len
Length.
Definition: dwmac.h:231
#define INADDR_NET_CLASSC
Definition: in.h:25
static struct net_device * netdev
Definition: gdbudp.c:52
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
IP address structure.
Definition: in.h:41
A settings block.
Definition: settings.h:132
static int ipv4_add_miniroute(struct net_device *netdev, struct in_addr address, struct in_addr network, struct in_addr netmask, struct in_addr gateway)
Add IPv4 minirouting table entry.
Definition: ipv4.c:85
#define INADDR_NET_CLASSA
Definition: in.h:23
#define INADDR_NET_CLASSB
Definition: in.h:24
#define IN_IS_CLASSC(addr)
Definition: in.h:31
Definition: 3c5x9.c:35
struct bofm_section_header done
Definition: bofm_test.c:46

References address, done, fetch_ipv4_setting(), fetch_raw_setting_copy(), free, IN_IS_CLASSA, IN_IS_CLASSB, IN_IS_CLASSC, INADDR_NET_CLASSA, INADDR_NET_CLASSB, INADDR_NET_CLASSC, ipv4_add_miniroute(), ipv4_add_static(), len, netdev, netdev_settings(), none, rc, and in_addr::s_addr.

Referenced by ipv4_apply_routes().

◆ ipv4_del_miniroute()

static void ipv4_del_miniroute ( struct ipv4_miniroute miniroute)
static

Delete IPv4 minirouting table entry.

Parameters
minirouteRouting table entry

Definition at line 270 of file ipv4.c.

270  {
271  struct net_device *netdev = miniroute->netdev;
272 
273  DBGC ( netdev, "IPv4 del %s", inet_ntoa ( miniroute->address ) );
274  DBGC ( netdev, " for %s", inet_ntoa ( miniroute->network ) );
275  DBGC ( netdev, "/%s ", inet_ntoa ( miniroute->netmask ) );
276  if ( miniroute->gateway.s_addr )
277  DBGC ( netdev, "gw %s ", inet_ntoa ( miniroute->gateway ) );
278  DBGC ( netdev, "via %s\n", miniroute->netdev->name );
279 
280  netdev_put ( miniroute->netdev );
281  list_del ( &miniroute->list );
282  free ( miniroute );
283 }
struct in_addr netmask
Subnet mask.
Definition: ip.h:98
struct list_head list
List of miniroutes.
Definition: ip.h:65
struct net_device * netdev
Network device.
Definition: ip.h:72
#define DBGC(...)
Definition: compiler.h:505
struct in_addr address
IPv4 address.
Definition: ip.h:83
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:575
struct in_addr gateway
Gateway address, or zero.
Definition: ip.h:108
static struct net_device * netdev
Definition: gdbudp.c:52
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
A network device.
Definition: netdevice.h:352
char * inet_ntoa(struct in_addr in)
Convert IPv4 address to dotted-quad notation.
Definition: ipv4.c:813
struct in_addr network
Subnet network address.
Definition: ip.h:92
uint32_t s_addr
Definition: in.h:42
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362

References ipv4_miniroute::address, DBGC, free, ipv4_miniroute::gateway, inet_ntoa(), ipv4_miniroute::list, list_del, net_device::name, netdev, ipv4_miniroute::netdev, netdev_put(), ipv4_miniroute::netmask, ipv4_miniroute::network, and in_addr::s_addr.

Referenced by ipv4_del_miniroutes().

◆ ipv4_del_miniroutes()

static void ipv4_del_miniroutes ( void  )
static

Delete IPv4 minirouting table entries.

Definition at line 289 of file ipv4.c.

289  {
290  struct ipv4_miniroute *miniroute;
291  struct ipv4_miniroute *tmp;
292 
293  /* Delete all existing routes */
295  ipv4_del_miniroute ( miniroute );
296 }
static void ipv4_del_miniroute(struct ipv4_miniroute *miniroute)
Delete IPv4 minirouting table entry.
Definition: ipv4.c:270
struct list_head list
List of miniroutes.
Definition: ip.h:65
unsigned long tmp
Definition: linux_pci.h:64
An IPv4 address/routing table entry.
Definition: ip.h:63
#define list_for_each_entry_safe(pos, tmp, head, member)
Iterate over entries in a list, safe against deletion of the current entry.
Definition: list.h:458
struct list_head ipv4_miniroutes
List of IPv4 miniroutes.
Definition: ipv4.c:57

References ipv4_del_miniroute(), ipv4_miniroutes, ipv4_miniroute::list, list_for_each_entry_safe, and tmp.

Referenced by ipv4_apply_routes().

◆ ipv4_route()

struct ipv4_miniroute* ipv4_route ( unsigned int  scope_id,
struct in_addr dest 
)

Perform IPv4 routing.

Parameters
scope_idDestination address scope ID
destFinal destination address
Return values
destNext hop destination address
minirouteRouting table entry to use, or NULL if no route

If the route requires use of a gateway, the next hop destination address will be overwritten with the gateway address.

Definition at line 309 of file ipv4.c.

310  {
311  struct ipv4_miniroute *miniroute;
312 
313  /* Find first usable route in routing table */
314  list_for_each_entry ( miniroute, &ipv4_miniroutes, list ) {
315 
316  /* Skip closed network devices */
317  if ( ! netdev_is_open ( miniroute->netdev ) )
318  continue;
319 
320  if ( IN_IS_MULTICAST ( dest->s_addr ) ) {
321 
322  /* If destination is non-global, and the scope
323  * ID matches this network device, then use
324  * the first matching route.
325  */
326  if ( miniroute->netdev->scope_id == scope_id )
327  return miniroute;
328 
329  } else {
330 
331  /* If destination is global, then use the
332  * first matching route (via its gateway if
333  * specified).
334  */
335  if ( ( ( dest->s_addr ^ miniroute->network.s_addr )
336  & miniroute->netmask.s_addr ) == 0 ) {
337  if ( miniroute->gateway.s_addr )
338  *dest = miniroute->gateway;
339  return miniroute;
340  }
341  }
342  }
343 
344  return NULL;
345 }
struct in_addr netmask
Subnet mask.
Definition: ip.h:98
struct list_head list
List of miniroutes.
Definition: ip.h:65
struct net_device * netdev
Network device.
Definition: ip.h:72
unsigned int scope_id
Scope ID.
Definition: netdevice.h:360
static int netdev_is_open(struct net_device *netdev)
Check whether or not network device is open.
Definition: netdevice.h:661
An IPv4 address/routing table entry.
Definition: ip.h:63
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
struct in_addr gateway
Gateway address, or zero.
Definition: ip.h:108
struct in_addr network
Subnet network address.
Definition: ip.h:92
struct list_head ipv4_miniroutes
List of IPv4 miniroutes.
Definition: ipv4.c:57
uint32_t s_addr
Definition: in.h:42
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" return dest
Definition: string.h:150
#define IN_IS_MULTICAST(addr)
Definition: in.h:33
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References dest, ipv4_miniroute::gateway, IN_IS_MULTICAST, ipv4_miniroutes, ipv4_miniroute::list, list_for_each_entry, ipv4_miniroute::netdev, netdev_is_open(), ipv4_miniroute::netmask, ipv4_miniroute::network, NULL, in_addr::s_addr, and net_device::scope_id.

Referenced by ipv4_netdev(), ipv4_route_okx(), and ipv4_tx().

◆ ipv4_netdev()

static struct net_device* ipv4_netdev ( struct sockaddr_tcpip st_dest)
static

Determine transmitting network device.

Parameters
st_destDestination network-layer address
Return values
netdevTransmitting network device, or NULL

Definition at line 353 of file ipv4.c.

353  {
354  struct sockaddr_in *sin_dest = ( ( struct sockaddr_in * ) st_dest );
355  struct in_addr dest = sin_dest->sin_addr;
356  struct ipv4_miniroute *miniroute;
357 
358  /* Find routing table entry */
359  miniroute = ipv4_route ( sin_dest->sin_scope_id, &dest );
360  if ( ! miniroute )
361  return NULL;
362 
363  return miniroute->netdev;
364 }
struct net_device * netdev
Network device.
Definition: ip.h:72
IPv4 socket address.
Definition: in.h:84
uint16_t sin_scope_id
Scope ID (part of struct sockaddr_tcpip)
Definition: in.h:98
An IPv4 address/routing table entry.
Definition: ip.h:63
struct ipv4_miniroute * ipv4_route(unsigned int scope_id, struct in_addr *dest)
Perform IPv4 routing.
Definition: ipv4.c:309
IP address structure.
Definition: in.h:41
struct in_addr sin_addr
IPv4 address.
Definition: in.h:100
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" return dest
Definition: string.h:150
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References dest, ipv4_route(), ipv4_miniroute::netdev, NULL, sockaddr_in::sin_addr, and sockaddr_in::sin_scope_id.

◆ ipv4_is_fragment()

static int ipv4_is_fragment ( struct fragment fragment,
struct io_buffer iobuf,
size_t hdrlen  __unused 
)
static

Check if IPv4 fragment matches fragment reassembly buffer.

Parameters
fragmentFragment reassembly buffer
iobufI/O buffer
hdrlenLength of non-fragmentable potion of I/O buffer
Return values
is_fragmentFragment matches this reassembly buffer

Definition at line 374 of file ipv4.c.

376  {
377  struct iphdr *frag_iphdr = fragment->iobuf->data;
378  struct iphdr *iphdr = iobuf->data;
379 
380  return ( ( iphdr->src.s_addr == frag_iphdr->src.s_addr ) &&
381  ( iphdr->ident == frag_iphdr->ident ) );
382 }
struct in_addr src
Definition: ip.h:44
A fragment reassembly buffer.
Definition: fragment.h:21
uint16_t ident
Definition: ip.h:39
An IPv4 packet header.
Definition: ip.h:35
struct io_buffer * iobuf
Reassembled packet.
Definition: fragment.h:25
uint32_t s_addr
Definition: in.h:42
void * data
Start of data.
Definition: iobuf.h:52

References io_buffer::data, iphdr::ident, fragment::iobuf, in_addr::s_addr, and iphdr::src.

◆ ipv4_fragment_offset()

static size_t ipv4_fragment_offset ( struct io_buffer iobuf,
size_t hdrlen  __unused 
)
static

Get IPv4 fragment offset.

Parameters
iobufI/O buffer
hdrlenLength of non-fragmentable potion of I/O buffer
Return values
offsetOffset

Definition at line 391 of file ipv4.c.

392  {
393  struct iphdr *iphdr = iobuf->data;
394 
395  return ( ( ntohs ( iphdr->frags ) & IP_MASK_OFFSET ) << 3 );
396 }
#define ntohs(value)
Definition: byteswap.h:136
uint16_t frags
Definition: ip.h:40
An IPv4 packet header.
Definition: ip.h:35
#define IP_MASK_OFFSET
Definition: ip.h:25
void * data
Start of data.
Definition: iobuf.h:52

References io_buffer::data, iphdr::frags, IP_MASK_OFFSET, and ntohs.

◆ ipv4_more_fragments()

static int ipv4_more_fragments ( struct io_buffer iobuf,
size_t hdrlen  __unused 
)
static

Check if more fragments exist.

Parameters
iobufI/O buffer
hdrlenLength of non-fragmentable potion of I/O buffer
Return values
more_fragsMore fragments exist

Definition at line 405 of file ipv4.c.

406  {
407  struct iphdr *iphdr = iobuf->data;
408 
409  return ( iphdr->frags & htons ( IP_MASK_MOREFRAGS ) );
410 }
uint16_t frags
Definition: ip.h:40
An IPv4 packet header.
Definition: ip.h:35
#define IP_MASK_MOREFRAGS
Definition: ip.h:27
void * data
Start of data.
Definition: iobuf.h:52
#define htons(value)
Definition: byteswap.h:135

References io_buffer::data, iphdr::frags, htons, and IP_MASK_MOREFRAGS.

◆ ipv4_pshdr_chksum()

static uint16_t ipv4_pshdr_chksum ( struct io_buffer iobuf,
uint16_t  csum 
)
static

Add IPv4 pseudo-header checksum to existing checksum.

Parameters
iobufI/O buffer
csumExisting checksum
Return values
csumUpdated checksum

Definition at line 428 of file ipv4.c.

428  {
429  struct ipv4_pseudo_header pshdr;
430  struct iphdr *iphdr = iobuf->data;
431  size_t hdrlen = ( ( iphdr->verhdrlen & IP_MASK_HLEN ) * 4 );
432 
433  /* Build pseudo-header */
434  pshdr.src = iphdr->src;
435  pshdr.dest = iphdr->dest;
436  pshdr.zero_padding = 0x00;
437  pshdr.protocol = iphdr->protocol;
438  pshdr.len = htons ( iob_len ( iobuf ) - hdrlen );
439 
440  /* Update the checksum value */
441  return tcpip_continue_chksum ( csum, &pshdr, sizeof ( pshdr ) );
442 }
struct in_addr src
Definition: ip.h:44
An IPv4 packet header.
Definition: ip.h:35
uint8_t verhdrlen
Definition: ip.h:36
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:159
struct in_addr dest
Definition: ip.h:45
An IPv4 pseudo header.
Definition: ip.h:49
#define IP_MASK_HLEN
Definition: ip.h:24
uint8_t protocol
Definition: ip.h:42
void * data
Start of data.
Definition: iobuf.h:52
#define htons(value)
Definition: byteswap.h:135
uint16_t tcpip_continue_chksum(uint16_t partial, const void *data, size_t len)
Calculate continued TCP/IP checkum.
Definition: x86_tcpip.c:45

References io_buffer::data, ipv4_pseudo_header::dest, iphdr::dest, htons, iob_len(), IP_MASK_HLEN, ipv4_pseudo_header::len, iphdr::protocol, ipv4_pseudo_header::protocol, ipv4_pseudo_header::src, iphdr::src, tcpip_continue_chksum(), iphdr::verhdrlen, and ipv4_pseudo_header::zero_padding.

Referenced by ipv4_rx(), and ipv4_tx().

◆ ipv4_tx()

static int ipv4_tx ( struct io_buffer iobuf,
struct tcpip_protocol tcpip_protocol,
struct sockaddr_tcpip st_src,
struct sockaddr_tcpip st_dest,
struct net_device netdev,
uint16_t trans_csum 
)
static

Transmit IP packet.

Parameters
iobufI/O buffer
tcpipTransport-layer protocol
st_srcSource network-layer address
st_destDestination network-layer address
netdevNetwork device to use if no route found, or NULL
trans_csumTransport-layer checksum to complete, or NULL
Return values
rcStatus

This function expects a transport-layer segment and prepends the IP header

Definition at line 457 of file ipv4.c.

462  {
463  struct iphdr *iphdr = iob_push ( iobuf, sizeof ( *iphdr ) );
464  struct sockaddr_in *sin_src = ( ( struct sockaddr_in * ) st_src );
465  struct sockaddr_in *sin_dest = ( ( struct sockaddr_in * ) st_dest );
466  struct ipv4_miniroute *miniroute;
467  struct in_addr next_hop;
468  struct in_addr hostmask = { .s_addr = INADDR_NONE };
469  uint8_t ll_dest_buf[MAX_LL_ADDR_LEN];
470  const void *ll_dest;
471  int rc;
472 
473  /* Start profiling */
474  profile_start ( &ipv4_tx_profiler );
475 
476  /* Update statistics */
478 
479  /* Fill up the IP header, except source address */
480  memset ( iphdr, 0, sizeof ( *iphdr ) );
481  iphdr->verhdrlen = ( IP_VER | ( sizeof ( *iphdr ) / 4 ) );
482  iphdr->service = IP_TOS;
483  iphdr->len = htons ( iob_len ( iobuf ) );
484  iphdr->ttl = IP_TTL;
486  iphdr->dest = sin_dest->sin_addr;
487 
488  /* Use routing table to identify next hop and transmitting netdev */
489  next_hop = iphdr->dest;
490  if ( sin_src )
491  iphdr->src = sin_src->sin_addr;
492  if ( ( next_hop.s_addr != INADDR_BROADCAST ) &&
493  ( ( miniroute = ipv4_route ( sin_dest->sin_scope_id,
494  &next_hop ) ) != NULL ) ) {
495  iphdr->src = miniroute->address;
496  hostmask = miniroute->hostmask;
497  netdev = miniroute->netdev;
498  }
499  if ( ! netdev ) {
500  DBGC ( sin_dest->sin_addr, "IPv4 has no route to %s\n",
501  inet_ntoa ( iphdr->dest ) );
503  rc = -ENETUNREACH;
504  goto err;
505  }
506 
507  /* (Ab)use the "ident" field to convey metadata about the
508  * network device statistics into packet traces. Useful for
509  * extracting debug information from non-debug builds.
510  */
511  iphdr->ident = htons ( ( (++next_ident_high) << 8 ) |
512  ( ( netdev->rx_stats.bad & 0xf ) << 4 ) |
513  ( ( netdev->rx_stats.good & 0xf ) << 0 ) );
514 
515  /* Fix up checksums */
516  if ( trans_csum ) {
517  *trans_csum = ipv4_pshdr_chksum ( iobuf, *trans_csum );
518  if ( ! *trans_csum )
519  *trans_csum = tcpip_protocol->zero_csum;
520  }
521  iphdr->chksum = tcpip_chksum ( iphdr, sizeof ( *iphdr ) );
522 
523  /* Print IP4 header for debugging */
524  DBGC2 ( sin_dest->sin_addr, "IPv4 TX %s->", inet_ntoa ( iphdr->src ) );
525  DBGC2 ( sin_dest->sin_addr, "%s len %d proto %d id %04x csum %04x\n",
526  inet_ntoa ( iphdr->dest ), ntohs ( iphdr->len ),
527  iphdr->protocol, ntohs ( iphdr->ident ),
528  ntohs ( iphdr->chksum ) );
529 
530  /* Calculate link-layer destination address, if possible */
531  if ( ( ( ~next_hop.s_addr ) & hostmask.s_addr ) == 0 ) {
532  /* Broadcast address */
534  ll_dest = netdev->ll_broadcast;
535  } else if ( IN_IS_MULTICAST ( next_hop.s_addr ) ) {
536  /* Multicast address */
538  if ( ( rc = netdev->ll_protocol->mc_hash ( AF_INET, &next_hop,
539  ll_dest_buf ) ) !=0){
540  DBGC ( sin_dest->sin_addr, "IPv4 could not hash "
541  "multicast %s: %s\n",
542  inet_ntoa ( next_hop ), strerror ( rc ) );
543  goto err;
544  }
545  ll_dest = ll_dest_buf;
546  } else {
547  /* Unicast address */
548  ll_dest = NULL;
549  }
550 
551  /* Update statistics */
553  ipv4_stats.out_octets += iob_len ( iobuf );
554 
555  /* Hand off to link layer (via ARP if applicable) */
556  if ( ll_dest ) {
557  if ( ( rc = net_tx ( iobuf, netdev, &ipv4_protocol, ll_dest,
558  netdev->ll_addr ) ) != 0 ) {
559  DBGC ( sin_dest->sin_addr, "IPv4 could not transmit "
560  "packet via %s: %s\n",
561  netdev->name, strerror ( rc ) );
562  return rc;
563  }
564  } else {
565  if ( ( rc = arp_tx ( iobuf, netdev, &ipv4_protocol, &next_hop,
566  &iphdr->src, netdev->ll_addr ) ) != 0 ) {
567  DBGC ( sin_dest->sin_addr, "IPv4 could not transmit "
568  "packet via %s: %s\n",
569  netdev->name, strerror ( rc ) );
570  return rc;
571  }
572  }
573 
574  profile_stop ( &ipv4_tx_profiler );
575  return 0;
576 
577  err:
578  free_iob ( iobuf );
579  return rc;
580 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define IP_VER
Definition: ip.h:22
struct in_addr src
Definition: ip.h:44
#define iob_push(iobuf, len)
Definition: iobuf.h:88
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:152
uint8_t tcpip_proto
Transport-layer protocol number.
Definition: tcpip.h:134
struct net_device * netdev
Network device.
Definition: ip.h:72
#define DBGC(...)
Definition: compiler.h:505
const uint8_t * ll_broadcast
Link-layer broadcast address.
Definition: netdevice.h:389
uint16_t chksum
Definition: ip.h:43
IPv4 socket address.
Definition: in.h:84
#define ntohs(value)
Definition: byteswap.h:136
uint16_t ident
Definition: ip.h:39
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:173
An IPv4 packet header.
Definition: ip.h:35
struct in_addr address
IPv4 address.
Definition: ip.h:83
struct in_addr hostmask
Host mask.
Definition: ip.h:133
static int arp_tx(struct io_buffer *iobuf, struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest, const void *net_source, const void *ll_source)
Transmit packet, determining link-layer address via ARP.
Definition: arp.h:51
#define IP_TTL
Definition: ip.h:32
uint16_t sin_scope_id
Scope ID (part of struct sockaddr_tcpip)
Definition: in.h:98
#define MAX_LL_ADDR_LEN
Maximum length of a link-layer address.
Definition: netdevice.h:36
unsigned long out_no_routes
ipSystemStatsOutNoRoutes
Definition: ipstat.h:130
An IPv4 address/routing table entry.
Definition: ip.h:63
uint16_t len
Definition: ip.h:38
static struct net_device * netdev
Definition: gdbudp.c:52
uint8_t verhdrlen
Definition: ip.h:36
#define INADDR_BROADCAST
Definition: in.h:21
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:160
static uint16_t ipv4_pshdr_chksum(struct io_buffer *iobuf, uint16_t csum)
Add IPv4 pseudo-header checksum to existing checksum.
Definition: ipv4.c:428
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
struct ipv4_miniroute * ipv4_route(unsigned int scope_id, struct in_addr *dest)
Perform IPv4 routing.
Definition: ipv4.c:309
IP address structure.
Definition: in.h:41
struct net_device_stats rx_stats
RX statistics.
Definition: netdevice.h:425
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:159
static struct ip_statistics ipv4_stats
IPv4 statistics.
Definition: ipv4.c:60
unsigned int bad
Count of error completions.
Definition: netdevice.h:295
char * inet_ntoa(struct in_addr in)
Convert IPv4 address to dotted-quad notation.
Definition: ipv4.c:813
unsigned char uint8_t
Definition: stdint.h:10
unsigned long out_mcast_pkts
ipSystemStatsOutMcastPkts
Definition: ipstat.h:155
struct in_addr dest
Definition: ip.h:45
int(* mc_hash)(unsigned int af, const void *net_addr, void *ll_addr)
Hash multicast address.
Definition: netdevice.h:172
uint32_t s_addr
Definition: in.h:42
A transport-layer protocol of the TCP/IP stack (eg.
Definition: tcpip.h:104
unsigned long out_bcast_pkts
ipSystemStatsOutBcastPkts
Definition: ipstat.h:165
uint16_t zero_csum
Preferred zero checksum value.
Definition: tcpip.h:128
struct in_addr sin_addr
IPv4 address.
Definition: in.h:100
uint8_t protocol
Definition: ip.h:42
unsigned int good
Count of successful completions.
Definition: netdevice.h:293
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
#define IP_TOS
Definition: ip.h:31
int net_tx(struct io_buffer *iobuf, struct net_device *netdev, struct net_protocol *net_protocol, const void *ll_dest, const void *ll_source)
Transmit network-layer packet.
Definition: netdevice.c:1073
#define DBGC2(...)
Definition: compiler.h:522
unsigned long out_requests
ipSystemStatsOutRequests
Definition: ipstat.h:123
#define IN_IS_MULTICAST(addr)
Definition: in.h:33
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:387
uint8_t ttl
Definition: ip.h:41
static uint8_t next_ident_high
Definition: ipv4.c:54
uint16_t tcpip_chksum(const void *data, size_t len)
Calculate TCP/IP checkum.
Definition: tcpip.c:203
uint8_t service
Definition: ip.h:37
#define ENETUNREACH
Network unreachable.
Definition: errno.h:488
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define INADDR_NONE
Definition: in.h:19
#define htons(value)
Definition: byteswap.h:135
#define AF_INET
IPv4 Internet addresses.
Definition: socket.h:63
unsigned long out_octets
ipSystemStatsOutOctets
Definition: ipstat.h:145
struct ll_protocol * ll_protocol
Link-layer protocol.
Definition: netdevice.h:372
unsigned long out_transmits
ipSystemStatsOutTransmits
Definition: ipstat.h:138
void * memset(void *dest, int character, size_t len) __nonnull

References ipv4_miniroute::address, AF_INET, arp_tx(), net_device_stats::bad, iphdr::chksum, DBGC, DBGC2, iphdr::dest, ENETUNREACH, free_iob(), net_device_stats::good, ipv4_miniroute::hostmask, htons, iphdr::ident, IN_IS_MULTICAST, INADDR_BROADCAST, INADDR_NONE, inet_ntoa(), iob_len(), iob_push, IP_TOS, IP_TTL, IP_VER, ipv4_pshdr_chksum(), ipv4_route(), ipv4_stats, iphdr::len, net_device::ll_addr, net_device::ll_broadcast, net_device::ll_protocol, MAX_LL_ADDR_LEN, ll_protocol::mc_hash, memset(), net_device::name, net_tx(), netdev, ipv4_miniroute::netdev, next_ident_high, ntohs, NULL, ip_statistics::out_bcast_pkts, ip_statistics::out_mcast_pkts, ip_statistics::out_no_routes, ip_statistics::out_octets, ip_statistics::out_requests, ip_statistics::out_transmits, profile_start(), profile_stop(), iphdr::protocol, rc, net_device::rx_stats, in_addr::s_addr, iphdr::service, sockaddr_in::sin_addr, sockaddr_in::sin_scope_id, iphdr::src, strerror(), tcpip_chksum(), tcpip_protocol::tcpip_proto, iphdr::ttl, iphdr::verhdrlen, and tcpip_protocol::zero_csum.

◆ ipv4_has_any_addr()

int ipv4_has_any_addr ( struct net_device netdev)

Check if network device has any IPv4 address.

Parameters
netdevNetwork device
Return values
has_any_addrNetwork device has any IPv4 address

Definition at line 588 of file ipv4.c.

588  {
589  struct ipv4_miniroute *miniroute;
590 
591  list_for_each_entry ( miniroute, &ipv4_miniroutes, list ) {
592  if ( miniroute->netdev == netdev )
593  return 1;
594  }
595  return 0;
596 }
struct list_head list
List of miniroutes.
Definition: ip.h:65
struct net_device * netdev
Network device.
Definition: ip.h:72
An IPv4 address/routing table entry.
Definition: ip.h:63
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
struct list_head ipv4_miniroutes
List of IPv4 miniroutes.
Definition: ipv4.c:57

References ipv4_miniroutes, ipv4_miniroute::list, list_for_each_entry, netdev, and ipv4_miniroute::netdev.

Referenced by dhcp_create_packet(), and ipv4_rx().

◆ ipv4_has_addr()

static int ipv4_has_addr ( struct net_device netdev,
struct in_addr  addr 
)
static

Check if network device has a specific IPv4 address.

Parameters
netdevNetwork device
addrIPv4 address
Return values
has_addrNetwork device has this IPv4 address

Definition at line 605 of file ipv4.c.

605  {
606  struct ipv4_miniroute *miniroute;
607 
608  list_for_each_entry ( miniroute, &ipv4_miniroutes, list ) {
609  if ( ( miniroute->netdev == netdev ) &&
610  ( miniroute->address.s_addr == addr.s_addr ) ) {
611  /* Found matching address */
612  return 1;
613  }
614  }
615  return 0;
616 }
struct list_head list
List of miniroutes.
Definition: ip.h:65
struct net_device * netdev
Network device.
Definition: ip.h:72
struct in_addr address
IPv4 address.
Definition: ip.h:83
An IPv4 address/routing table entry.
Definition: ip.h:63
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
static struct net_device * netdev
Definition: gdbudp.c:52
uint32_t addr
Buffer address.
Definition: dwmac.h:20
struct list_head ipv4_miniroutes
List of IPv4 miniroutes.
Definition: ipv4.c:57
uint32_t s_addr
Definition: in.h:42

References addr, ipv4_miniroute::address, ipv4_miniroutes, ipv4_miniroute::list, list_for_each_entry, netdev, ipv4_miniroute::netdev, and in_addr::s_addr.

Referenced by ipv4_arp_check(), ipv4_gratuitous_arp(), and ipv4_rx().

◆ ipv4_rx()

static int ipv4_rx ( struct io_buffer iobuf,
struct net_device netdev,
const void *ll_dest  __unused,
const void *ll_source  __unused,
unsigned int  flags 
)
static

Process incoming packets.

Parameters
iobufI/O buffer
netdevNetwork device
ll_destLink-layer destination address
ll_sourceLink-layer destination source
flagsPacket flags
Return values
rcReturn status code

This function expects an IP4 network datagram. It processes the headers and sends it to the transport layer.

Definition at line 631 of file ipv4.c.

635  {
636  struct iphdr *iphdr = iobuf->data;
637  size_t hdrlen;
638  size_t len;
639  union {
640  struct sockaddr_in sin;
641  struct sockaddr_tcpip st;
642  } src, dest;
643  uint16_t csum;
644  uint16_t pshdr_csum;
645  int rc;
646 
647  /* Start profiling */
648  profile_start ( &ipv4_rx_profiler );
649 
650  /* Update statistics */
652  ipv4_stats.in_octets += iob_len ( iobuf );
653  if ( flags & LL_BROADCAST ) {
655  } else if ( flags & LL_MULTICAST ) {
657  }
658 
659  /* Sanity check the IPv4 header */
660  if ( iob_len ( iobuf ) < sizeof ( *iphdr ) ) {
661  DBGC ( iphdr->src, "IPv4 packet too short at %zd bytes (min "
662  "%zd bytes)\n", iob_len ( iobuf ), sizeof ( *iphdr ) );
663  goto err_header;
664  }
665  if ( ( iphdr->verhdrlen & IP_MASK_VER ) != IP_VER ) {
666  DBGC ( iphdr->src, "IPv4 version %#02x not supported\n",
667  iphdr->verhdrlen );
668  goto err_header;
669  }
670  hdrlen = ( ( iphdr->verhdrlen & IP_MASK_HLEN ) * 4 );
671  if ( hdrlen < sizeof ( *iphdr ) ) {
672  DBGC ( iphdr->src, "IPv4 header too short at %zd bytes (min "
673  "%zd bytes)\n", hdrlen, sizeof ( *iphdr ) );
674  goto err_header;
675  }
676  if ( hdrlen > iob_len ( iobuf ) ) {
677  DBGC ( iphdr->src, "IPv4 header too long at %zd bytes "
678  "(packet is %zd bytes)\n", hdrlen, iob_len ( iobuf ) );
679  goto err_header;
680  }
681  if ( ( csum = tcpip_chksum ( iphdr, hdrlen ) ) != 0 ) {
682  DBGC ( iphdr->src, "IPv4 checksum incorrect (is %04x "
683  "including checksum field, should be 0000)\n", csum );
684  goto err_header;
685  }
686  len = ntohs ( iphdr->len );
687  if ( len < hdrlen ) {
688  DBGC ( iphdr->src, "IPv4 length too short at %zd bytes "
689  "(header is %zd bytes)\n", len, hdrlen );
690  goto err_header;
691  }
692  if ( len > iob_len ( iobuf ) ) {
693  DBGC ( iphdr->src, "IPv4 length too long at %zd bytes "
694  "(packet is %zd bytes)\n", len, iob_len ( iobuf ) );
696  goto err_other;
697  }
698 
699  /* Truncate packet to correct length */
700  iob_unput ( iobuf, ( iob_len ( iobuf ) - len ) );
701 
702  /* Print IPv4 header for debugging */
703  DBGC2 ( iphdr->src, "IPv4 RX %s<-", inet_ntoa ( iphdr->dest ) );
704  DBGC2 ( iphdr->src, "%s len %d proto %d id %04x csum %04x\n",
706  ntohs ( iphdr->ident ), ntohs ( iphdr->chksum ) );
707 
708  /* Discard unicast packets not destined for us */
709  if ( ( ! ( flags & LL_MULTICAST ) ) &&
710  ( iphdr->dest.s_addr != INADDR_BROADCAST ) &&
712  ( ! ipv4_has_addr ( netdev, iphdr->dest ) ) ) {
713  DBGC ( iphdr->src, "IPv4 discarding non-local unicast packet "
714  "for %s\n", inet_ntoa ( iphdr->dest ) );
716  goto err_other;
717  }
718 
719  /* Perform fragment reassembly if applicable */
721  /* Pass the fragment to fragment_reassemble() which returns
722  * either a fully reassembled I/O buffer or NULL.
723  */
724  iobuf = fragment_reassemble ( &ipv4_reassembler, iobuf,
725  &hdrlen );
726  if ( ! iobuf )
727  return 0;
728  iphdr = iobuf->data;
729  }
730 
731  /* Construct socket addresses, calculate pseudo-header
732  * checksum, and hand off to transport layer
733  */
734  memset ( &src, 0, sizeof ( src ) );
735  src.sin.sin_family = AF_INET;
736  src.sin.sin_addr = iphdr->src;
737  memset ( &dest, 0, sizeof ( dest ) );
738  dest.sin.sin_family = AF_INET;
739  dest.sin.sin_addr = iphdr->dest;
740  pshdr_csum = ipv4_pshdr_chksum ( iobuf, TCPIP_EMPTY_CSUM );
741  iob_pull ( iobuf, hdrlen );
742  if ( ( rc = tcpip_rx ( iobuf, netdev, iphdr->protocol, &src.st,
743  &dest.st, pshdr_csum, &ipv4_stats ) ) != 0 ) {
744  DBGC ( src.sin.sin_addr, "IPv4 received packet rejected by "
745  "stack: %s\n", strerror ( rc ) );
746  return rc;
747  }
748 
749  profile_stop ( &ipv4_rx_profiler );
750  return 0;
751 
752  err_header:
754  err_other:
755  free_iob ( iobuf );
756  return -EINVAL;
757 }
#define LL_MULTICAST
Packet is a multicast (including broadcast) packet.
Definition: netdevice.h:105
#define iob_pull(iobuf, len)
Definition: iobuf.h:106
#define EINVAL
Invalid argument.
Definition: errno.h:428
TCP/IP socket address.
Definition: tcpip.h:75
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
unsigned short uint16_t
Definition: stdint.h:11
static int ipv4_has_addr(struct net_device *netdev, struct in_addr addr)
Check if network device has a specific IPv4 address.
Definition: ipv4.c:605
unsigned long in_receives
ipSystemStatsInReceives
Definition: ipstat.h:50
#define TCPIP_EMPTY_CSUM
Empty checksum value.
Definition: tcpip.h:57
#define IP_VER
Definition: ip.h:22
struct in_addr src
Definition: ip.h:44
unsigned long in_addr_errors
ipSystemStatsInAddrErrors
Definition: ipstat.h:76
int tcpip_rx(struct io_buffer *iobuf, struct net_device *netdev, uint8_t tcpip_proto, struct sockaddr_tcpip *st_src, struct sockaddr_tcpip *st_dest, uint16_t pshdr_csum, struct ip_statistics *stats)
Process a received TCP/IP packet.
Definition: tcpip.c:40
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:152
#define DBGC(...)
Definition: compiler.h:505
uint16_t chksum
Definition: ip.h:43
IPv4 socket address.
Definition: in.h:84
#define ntohs(value)
Definition: byteswap.h:136
uint16_t ident
Definition: ip.h:39
uint16_t frags
Definition: ip.h:40
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:173
An IPv4 packet header.
Definition: ip.h:35
struct sockaddr_tcpip st
Definition: syslog.c:57
unsigned long in_mcast_pkts
ipSystemStatsInMcastPkts
Definition: ipstat.h:150
int ipv4_has_any_addr(struct net_device *netdev)
Check if network device has any IPv4 address.
Definition: ipv4.c:588
struct io_buffer * fragment_reassemble(struct fragment_reassembler *fragments, struct io_buffer *iobuf, size_t *hdrlen)
Reassemble packet.
Definition: fragment.c:88
static const void * src
Definition: string.h:47
uint16_t len
Definition: ip.h:38
ring len
Length.
Definition: dwmac.h:231
unsigned long in_truncated_pkts
ipSystemStatsInTruncatedPkts
Definition: ipstat.h:89
static struct net_device * netdev
Definition: gdbudp.c:52
uint8_t verhdrlen
Definition: ip.h:36
static struct fragment_reassembler ipv4_reassembler
IPv4 fragment reassembler.
Definition: ipv4.c:413
#define INADDR_BROADCAST
Definition: in.h:21
#define IP_MASK_MOREFRAGS
Definition: ip.h:27
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:160
static uint16_t ipv4_pshdr_chksum(struct io_buffer *iobuf, uint16_t csum)
Add IPv4 pseudo-header checksum to existing checksum.
Definition: ipv4.c:428
#define iob_unput(iobuf, len)
Definition: iobuf.h:139
uint8_t flags
Flags.
Definition: ena.h:18
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:159
static struct ip_statistics ipv4_stats
IPv4 statistics.
Definition: ipv4.c:60
char * inet_ntoa(struct in_addr in)
Convert IPv4 address to dotted-quad notation.
Definition: ipv4.c:813
#define IP_MASK_VER
Definition: ip.h:23
struct in_addr dest
Definition: ip.h:45
#define IP_MASK_OFFSET
Definition: ip.h:25
#define LL_BROADCAST
Packet is a broadcast packet.
Definition: netdevice.h:108
uint32_t s_addr
Definition: in.h:42
#define IP_MASK_HLEN
Definition: ip.h:24
uint8_t protocol
Definition: ip.h:42
#define DBGC2(...)
Definition: compiler.h:522
void * data
Start of data.
Definition: iobuf.h:52
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" return dest
Definition: string.h:150
struct sockaddr_in sin
Definition: syslog.c:58
uint16_t tcpip_chksum(const void *data, size_t len)
Calculate TCP/IP checkum.
Definition: tcpip.c:203
unsigned long in_hdr_errors
ipSystemStatsInHdrErrors
Definition: ipstat.h:65
unsigned long in_bcast_pkts
ipSystemStatsInBcastPkts
Definition: ipstat.h:160
#define htons(value)
Definition: byteswap.h:135
#define AF_INET
IPv4 Internet addresses.
Definition: socket.h:63
unsigned long in_octets
ipSystemStatsInOctets
Definition: ipstat.h:57
void * memset(void *dest, int character, size_t len) __nonnull

References AF_INET, iphdr::chksum, io_buffer::data, DBGC, DBGC2, iphdr::dest, dest, EINVAL, flags, fragment_reassemble(), iphdr::frags, free_iob(), htons, iphdr::ident, ip_statistics::in_addr_errors, ip_statistics::in_bcast_pkts, ip_statistics::in_hdr_errors, ip_statistics::in_mcast_pkts, ip_statistics::in_octets, ip_statistics::in_receives, ip_statistics::in_truncated_pkts, INADDR_BROADCAST, inet_ntoa(), iob_len(), iob_pull, iob_unput, IP_MASK_HLEN, IP_MASK_MOREFRAGS, IP_MASK_OFFSET, IP_MASK_VER, IP_VER, ipv4_has_addr(), ipv4_has_any_addr(), ipv4_pshdr_chksum(), ipv4_reassembler, ipv4_stats, iphdr::len, len, LL_BROADCAST, LL_MULTICAST, memset(), netdev, ntohs, profile_start(), profile_stop(), iphdr::protocol, rc, in_addr::s_addr, sin, iphdr::src, src, st, strerror(), tcpip_chksum(), TCPIP_EMPTY_CSUM, tcpip_rx(), and iphdr::verhdrlen.

◆ ipv4_arp_check()

static int ipv4_arp_check ( struct net_device netdev,
const void *  net_addr 
)
static

Check existence of IPv4 address for ARP.

Parameters
netdevNetwork device
net_addrNetwork-layer address
Return values
rcReturn status code

Definition at line 766 of file ipv4.c.

766  {
767  const struct in_addr *address = net_addr;
768 
769  if ( ipv4_has_addr ( netdev, *address ) )
770  return 0;
771 
772  return -ENOENT;
773 }
static int ipv4_has_addr(struct net_device *netdev, struct in_addr addr)
Check if network device has a specific IPv4 address.
Definition: ipv4.c:605
uint64_t address
Base address.
Definition: ena.h:24
#define ENOENT
No such file or directory.
Definition: errno.h:514
static struct net_device * netdev
Definition: gdbudp.c:52
IP address structure.
Definition: in.h:41

References address, ENOENT, ipv4_has_addr(), and netdev.

◆ inet_aton()

int inet_aton ( const char *  string,
struct in_addr in 
)

Parse IPv4 address.

Parameters
stringIPv4 address string
Return values
inIPv4 address to fill in
okIPv4 address is valid

Note that this function returns nonzero iff the address is valid, to match the standard BSD API function of the same name. Unlike most other iPXE functions, a zero therefore indicates failure.

Definition at line 786 of file ipv4.c.

786  {
787  const char *separator = "...";
788  uint8_t *byte = ( ( uint8_t * ) in );
789  char *endp;
790  unsigned long value;
791 
792  while ( 1 ) {
793  value = strtoul ( string, &endp, 0 );
794  if ( string == endp )
795  return 0;
796  if ( value > 0xff )
797  return 0;
798  *(byte++) = value;
799  if ( *endp != *separator )
800  return 0;
801  if ( ! *(separator++) )
802  return 1;
803  string = ( endp + 1 );
804  }
805 }
unsigned long strtoul(const char *string, char **endp, int base)
Convert string to numeric value.
Definition: string.c:484
__be32 in[4]
Definition: CIB_PRM.h:35
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
unsigned char uint8_t
Definition: stdint.h:10

References in, strtoul(), and value.

Referenced by inet_aton_fail_okx(), inet_aton_okx(), ipv4_route_okx(), ipv4_sock_aton(), parse_ipv4_setting(), and tftp_process_multicast().

◆ inet_ntoa()

char* inet_ntoa ( struct in_addr  in)

Convert IPv4 address to dotted-quad notation.

Parameters
inIPv4 address
Return values
stringIPv4 address in dotted-quad notation

Definition at line 813 of file ipv4.c.

813  {
814  static char buf[16]; /* "xxx.xxx.xxx.xxx" */
815  uint8_t *bytes = ( uint8_t * ) &in;
816 
817  sprintf ( buf, "%d.%d.%d.%d", bytes[0], bytes[1], bytes[2], bytes[3] );
818  return buf;
819 }
__be32 in[4]
Definition: CIB_PRM.h:35
#define sprintf(buf, fmt,...)
Write a formatted string to a buffer.
Definition: stdio.h:36
unsigned char uint8_t
Definition: stdint.h:10
uint8_t bytes[64]
Definition: ib_mad.h:16

References bytes, in, and sprintf.

Referenced by dhcp_deliver(), dhcp_discovery_rx(), dhcp_proxy_rx(), dhcp_proxy_tx(), dhcp_pxebs_accept(), dhcp_pxebs_rx(), dhcp_pxebs_tx(), dhcp_request_rx(), dhcp_request_tx(), efi_snp_mcast_ip_to_mac(), fetch_next_server_and_filename(), format_ipv4_setting(), gve_describe(), ibft_ipaddr(), inet_aton_okx(), inet_ntoa_okx(), ipoib_transmit(), ipv4_add_miniroute(), ipv4_del_miniroute(), ipv4_gratuitous_arp(), ipv4_ntoa(), ipv4_route_okx(), ipv4_rx(), ipv4_sock_ntoa(), ipv4_tx(), pxenv_udp_open(), pxenv_udp_read(), pxenv_udp_write(), pxenv_undi_get_mcast_address(), route_ipv4_print(), start_pxebs(), tftp_apply_settings(), and tftp_process_multicast().

◆ ipv4_ntoa()

static const char* ipv4_ntoa ( const void *  net_addr)
static

Transcribe IPv4 address.

Parameters
net_addrIPv4 address
Return values
stringIPv4 address in dotted-quad notation

Definition at line 828 of file ipv4.c.

828  {
829  return inet_ntoa ( * ( ( struct in_addr * ) net_addr ) );
830 }
IP address structure.
Definition: in.h:41
char * inet_ntoa(struct in_addr in)
Convert IPv4 address to dotted-quad notation.
Definition: ipv4.c:813

References inet_ntoa().

◆ ipv4_sock_ntoa()

static const char* ipv4_sock_ntoa ( struct sockaddr sa)
static

Transcribe IPv4 socket address.

Parameters
saSocket address
Return values
stringSocket address in standard notation

Definition at line 838 of file ipv4.c.

838  {
839  struct sockaddr_in *sin = ( ( struct sockaddr_in * ) sa );
840 
841  return inet_ntoa ( sin->sin_addr );
842 }
IPv4 socket address.
Definition: in.h:84
struct sockaddr sa
Definition: syslog.c:56
char * inet_ntoa(struct in_addr in)
Convert IPv4 address to dotted-quad notation.
Definition: ipv4.c:813
struct in_addr sin_addr
IPv4 address.
Definition: in.h:100
struct sockaddr_in sin
Definition: syslog.c:58

References inet_ntoa(), sa, sin, and sockaddr_in::sin_addr.

◆ ipv4_sock_aton()

static int ipv4_sock_aton ( const char *  string,
struct sockaddr sa 
)
static

Parse IPv4 socket address.

Parameters
stringSocket address string
saSocket address to fill in
Return values
rcReturn status code

Definition at line 851 of file ipv4.c.

851  {
852  struct sockaddr_in *sin = ( ( struct sockaddr_in * ) sa );
853  struct in_addr in;
854 
855  if ( inet_aton ( string, &in ) ) {
856  sin->sin_addr = in;
857  return 0;
858  }
859  return -EINVAL;
860 }
#define EINVAL
Invalid argument.
Definition: errno.h:428
__be32 in[4]
Definition: CIB_PRM.h:35
IPv4 socket address.
Definition: in.h:84
struct sockaddr sa
Definition: syslog.c:56
IP address structure.
Definition: in.h:41
int inet_aton(const char *string, struct in_addr *in)
Parse IPv4 address.
Definition: ipv4.c:786
struct in_addr sin_addr
IPv4 address.
Definition: in.h:100
struct sockaddr_in sin
Definition: syslog.c:58

References EINVAL, in, inet_aton(), sa, sin, and sockaddr_in::sin_addr.

◆ parse_ipv4_setting()

int parse_ipv4_setting ( const struct setting_type *type  __unused,
const char *  value,
void *  buf,
size_t  len 
)

Parse IPv4 address setting value.

Parameters
typeSetting type
valueFormatted setting value
bufBuffer to contain raw value
lenLength of buffer
Return values
lenLength of raw value, or negative error

Definition at line 910 of file ipv4.c.

911  {
912  struct in_addr ipv4;
913 
914  /* Parse IPv4 address */
915  if ( inet_aton ( value, &ipv4 ) == 0 )
916  return -EINVAL;
917 
918  /* Copy to buffer */
919  if ( len > sizeof ( ipv4 ) )
920  len = sizeof ( ipv4 );
921  memcpy ( buf, &ipv4, len );
922 
923  return ( sizeof ( ipv4 ) );
924 }
#define EINVAL
Invalid argument.
Definition: errno.h:428
void * memcpy(void *dest, const void *src, size_t len) __nonnull
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
ring len
Length.
Definition: dwmac.h:231
IP address structure.
Definition: in.h:41
int inet_aton(const char *string, struct in_addr *in)
Parse IPv4 address.
Definition: ipv4.c:786

References EINVAL, inet_aton(), len, memcpy(), and value.

◆ format_ipv4_setting()

int format_ipv4_setting ( const struct setting_type *type  __unused,
const void *  raw,
size_t  raw_len,
char *  buf,
size_t  len 
)

Format IPv4 address setting value.

Parameters
typeSetting type
rawRaw setting value
raw_lenLength of raw setting value
bufBuffer to contain formatted value
lenLength of buffer
Return values
lenLength of formatted value, or negative error

Definition at line 936 of file ipv4.c.

938  {
939  const struct in_addr *ipv4 = raw;
940 
941  if ( raw_len < sizeof ( *ipv4 ) )
942  return -EINVAL;
943  return snprintf ( buf, len, "%s", inet_ntoa ( *ipv4 ) );
944 }
#define EINVAL
Invalid argument.
Definition: errno.h:428
ring len
Length.
Definition: dwmac.h:231
static size_t raw_len
Definition: base16.h:53
IP address structure.
Definition: in.h:41
char * inet_ntoa(struct in_addr in)
Convert IPv4 address to dotted-quad notation.
Definition: ipv4.c:813
__be32 raw[7]
Definition: CIB_PRM.h:28
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382

References EINVAL, inet_ntoa(), len, raw, raw_len, and snprintf().

◆ __setting() [1/4]

const struct setting ip_setting __setting ( SETTING_IP4  ,
ip   
)

IPv4 address setting.

◆ __setting() [2/4]

const struct setting netmask_setting __setting ( SETTING_IP4  ,
netmask   
)

IPv4 subnet mask setting.

◆ __setting() [3/4]

const struct setting gateway_setting __setting ( SETTING_IP4  ,
gateway   
)

Default gateway setting.

◆ __setting() [4/4]

const struct setting static_route_setting __setting ( SETTING_IP4  ,
static_routes   
)

Classless static routes setting.

◆ ipv4_gratuitous_arp()

static int ipv4_gratuitous_arp ( struct net_device netdev,
struct in_addr  address 
)
static

Send gratuitous ARP, if applicable.

Parameters
netdevNetwork device
addressIPv4 address
Return values
rcReturn status code

Definition at line 986 of file ipv4.c.

987  {
988  int rc;
989 
990  /* Do nothing if network device already has this IPv4 address */
991  if ( ipv4_has_addr ( netdev, address ) )
992  return 0;
993 
994  /* Transmit gratuitous ARP */
995  DBGC ( netdev, "IPv4 sending gratuitous ARP for %s via %s\n",
996  inet_ntoa ( address ), netdev->name );
997  if ( ( rc = arp_tx_request ( netdev, &ipv4_protocol, &address,
998  &address ) ) != 0 ) {
999  DBGC ( netdev, "IPv4 could not transmit gratuitous ARP: %s\n",
1000  strerror ( rc ) );
1001  /* Treat failures as non-fatal */
1002  }
1003 
1004  return 0;
1005 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int ipv4_has_addr(struct net_device *netdev, struct in_addr addr)
Check if network device has a specific IPv4 address.
Definition: ipv4.c:605
uint64_t address
Base address.
Definition: ena.h:24
#define DBGC(...)
Definition: compiler.h:505
static struct net_device * netdev
Definition: gdbudp.c:52
int arp_tx_request(struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest, const void *net_source)
Transmit ARP request.
Definition: arp.c:59
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
char * inet_ntoa(struct in_addr in)
Convert IPv4 address to dotted-quad notation.
Definition: ipv4.c:813
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362

References address, arp_tx_request(), DBGC, inet_ntoa(), ipv4_has_addr(), net_device::name, netdev, rc, and strerror().

Referenced by ipv4_apply_routes().

◆ ipv4_settings()

static int ipv4_settings ( int(*)(struct net_device *netdev, struct in_addr address apply)
static

Process IPv4 network device settings.

Parameters
applyApplication method
Return values
rcReturn status code

Definition at line 1013 of file ipv4.c.

1014  {
1015  struct net_device *netdev;
1016  struct settings *settings;
1017  struct in_addr address;
1018  int rc;
1019 
1020  /* Process settings for each network device */
1021  for_each_netdev ( netdev ) {
1022 
1023  /* Get network device settings */
1025 
1026  /* Get IPv4 address */
1027  fetch_ipv4_setting ( settings, &ip_setting, &address );
1028  if ( ! address.s_addr )
1029  continue;
1030 
1031  /* Apply settings */
1032  if ( ( rc = apply ( netdev, address ) ) != 0 )
1033  return rc;
1034  }
1035 
1036  return 0;
1037 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int fetch_ipv4_setting(struct settings *settings, const struct setting *setting, struct in_addr *inp)
Fetch value of IPv4 address setting.
Definition: settings.c:912
uint64_t address
Base address.
Definition: ena.h:24
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition: netdevice.h:586
static struct net_device * netdev
Definition: gdbudp.c:52
IP address structure.
Definition: in.h:41
#define for_each_netdev(netdev)
Iterate over all network devices.
Definition: netdevice.h:546
A network device.
Definition: netdevice.h:352
A settings block.
Definition: settings.h:132

References address, fetch_ipv4_setting(), for_each_netdev, netdev, netdev_settings(), and rc.

Referenced by ipv4_apply_routes().

◆ ipv4_apply_routes()

static int ipv4_apply_routes ( void  )
static

Create IPv4 routing table based on configured settings.

Return values
rcReturn status code

Definition at line 1044 of file ipv4.c.

1044  {
1045  int rc;
1046 
1047  /* Send gratuitous ARPs for any new IPv4 addresses */
1049 
1050  /* Delete all existing routes */
1052 
1053  /* Create routes for each configured network device */
1054  if ( ( rc = ipv4_settings ( ipv4_add_miniroutes ) ) != 0 )
1055  return rc;
1056 
1057  return 0;
1058 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int ipv4_gratuitous_arp(struct net_device *netdev, struct in_addr address)
Send gratuitous ARP, if applicable.
Definition: ipv4.c:986
static void ipv4_del_miniroutes(void)
Delete IPv4 minirouting table entries.
Definition: ipv4.c:289
static int ipv4_settings(int(*apply)(struct net_device *netdev, struct in_addr address))
Process IPv4 network device settings.
Definition: ipv4.c:1013
static int ipv4_add_miniroutes(struct net_device *netdev, struct in_addr address)
Add IPv4 minirouting table entries.
Definition: ipv4.c:211

References ipv4_add_miniroutes(), ipv4_del_miniroutes(), ipv4_gratuitous_arp(), ipv4_settings(), and rc.

◆ REQUIRING_SYMBOL()

REQUIRING_SYMBOL ( ipv4_protocol  )

◆ REQUIRE_OBJECT()

REQUIRE_OBJECT ( icmpv4  )

Variable Documentation

◆ next_ident_high

uint8_t next_ident_high = 0
static

Definition at line 54 of file ipv4.c.

Referenced by ipv4_tx().

◆ ipv4_miniroutes

struct list_head ipv4_miniroutes = LIST_HEAD_INIT ( ipv4_miniroutes )

List of IPv4 miniroutes.

Definition at line 57 of file ipv4.c.

Referenced by ipv4_add_miniroute(), ipv4_del_miniroutes(), ipv4_has_addr(), ipv4_has_any_addr(), ipv4_route(), and route_ipv4_print().

◆ ipv4_stats

struct ip_statistics ipv4_stats
static

IPv4 statistics.

Definition at line 60 of file ipv4.c.

Referenced by ipv4_rx(), and ipv4_tx().

◆ __profiler

struct profiler ipv4_rx_profiler __profiler = { .name = "ipv4.tx" }
static

Transmit profiler.

Receive profiler.

Definition at line 70 of file ipv4.c.

◆ ipv4_reassembler

struct fragment_reassembler ipv4_reassembler
static
Initial value:
= {
.is_fragment = ipv4_is_fragment,
.fragment_offset = ipv4_fragment_offset,
.more_fragments = ipv4_more_fragments,
.stats = &ipv4_stats,
}
static int ipv4_more_fragments(struct io_buffer *iobuf, size_t hdrlen __unused)
Check if more fragments exist.
Definition: ipv4.c:405
static size_t ipv4_fragment_offset(struct io_buffer *iobuf, size_t hdrlen __unused)
Get IPv4 fragment offset.
Definition: ipv4.c:391
static struct fragment_reassembler ipv4_reassembler
IPv4 fragment reassembler.
Definition: ipv4.c:413
static struct ip_statistics ipv4_stats
IPv4 statistics.
Definition: ipv4.c:60
static int ipv4_is_fragment(struct fragment *fragment, struct io_buffer *iobuf, size_t hdrlen __unused)
Check if IPv4 fragment matches fragment reassembly buffer.
Definition: ipv4.c:374
#define LIST_HEAD_INIT(list)
Initialise a static list head.
Definition: list.h:30
struct list_head list
List of fragment reassembly buffers.
Definition: fragment.h:37

IPv4 fragment reassembler.

Definition at line 413 of file ipv4.c.

Referenced by ipv4_rx().

◆ __net_protocol

struct net_protocol ipv4_protocol __net_protocol
Initial value:
= {
.name = "IP",
.net_proto = htons ( ETH_P_IP ),
.net_addr_len = sizeof ( struct in_addr ),
.rx = ipv4_rx,
.ntoa = ipv4_ntoa,
}
#define ETH_P_IP
Definition: if_ether.h:18
static const char * ipv4_ntoa(const void *net_addr)
Transcribe IPv4 address.
Definition: ipv4.c:828
IP address structure.
Definition: in.h:41
static int ipv4_rx(struct io_buffer *iobuf, struct net_device *netdev, const void *ll_dest __unused, const void *ll_source __unused, unsigned int flags)
Process incoming packets.
Definition: ipv4.c:631
u8 rx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets from the AP.
Definition: wpa.h:234
#define htons(value)
Definition: byteswap.h:135

IPv4 protocol.

AoE protocol.

Definition at line 863 of file ipv4.c.

◆ __tcpip_net_protocol

struct tcpip_net_protocol ipv4_tcpip_protocol __tcpip_net_protocol
Initial value:
= {
.name = "IPv4",
.sa_family = AF_INET,
.header_len = sizeof ( struct iphdr ),
.net_protocol = &ipv4_protocol,
.tx = ipv4_tx,
.netdev = ipv4_netdev,
}
An IPv4 packet header.
Definition: ip.h:35
static struct net_device * ipv4_netdev(struct sockaddr_tcpip *st_dest)
Determine transmitting network device.
Definition: ipv4.c:353
A network-layer protocol.
Definition: netdevice.h:64
static int ipv4_tx(struct io_buffer *iobuf, struct tcpip_protocol *tcpip_protocol, struct sockaddr_tcpip *st_src, struct sockaddr_tcpip *st_dest, struct net_device *netdev, uint16_t *trans_csum)
Transmit IP packet.
Definition: ipv4.c:457
#define AF_INET
IPv4 Internet addresses.
Definition: socket.h:63

IPv4 TCPIP net protocol.

Definition at line 872 of file ipv4.c.

◆ __arp_net_protocol

struct arp_net_protocol ipv4_arp_protocol __arp_net_protocol
Initial value:
= {
.net_protocol = &ipv4_protocol,
.check = ipv4_arp_check,
}
static int ipv4_arp_check(struct net_device *netdev, const void *net_addr)
Check existence of IPv4 address for ARP.
Definition: ipv4.c:766

IPv4 ARP protocol.

Definition at line 882 of file ipv4.c.

◆ __sockaddr_converter

struct sockaddr_converter ipv4_sockaddr_converter __sockaddr_converter
Initial value:
= {
.family = AF_INET,
.ntoa = ipv4_sock_ntoa,
.aton = ipv4_sock_aton,
}
static const char * ipv4_sock_ntoa(struct sockaddr *sa)
Transcribe IPv4 socket address.
Definition: ipv4.c:838
static int ipv4_sock_aton(const char *string, struct sockaddr *sa)
Parse IPv4 socket address.
Definition: ipv4.c:851
#define AF_INET
IPv4 Internet addresses.
Definition: socket.h:63

IPv4 socket address converter.

Definition at line 888 of file ipv4.c.

◆ __settings_applicator

struct settings_applicator ipv4_settings_applicator __settings_applicator
Initial value:
= {
}
static int ipv4_apply_routes(void)
Create IPv4 routing table based on configured settings.
Definition: ipv4.c:1044

IPv4 settings applicator.

Definition at line 1061 of file ipv4.c.