iPXE
Functions
tcpip.c File Reference

Transport-network layer interface. More...

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <byteswap.h>
#include <ipxe/iobuf.h>
#include <ipxe/tables.h>
#include <ipxe/ipstat.h>
#include <ipxe/netdevice.h>
#include <ipxe/tcpip.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
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. More...
 
struct tcpip_net_protocoltcpip_net_protocol (sa_family_t sa_family)
 Find TCP/IP network-layer protocol. More...
 
int tcpip_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 a TCP/IP packet. More...
 
struct net_devicetcpip_netdev (struct sockaddr_tcpip *st_dest)
 Determine transmitting network device. More...
 
size_t tcpip_mtu (struct sockaddr_tcpip *st_dest)
 Determine maximum transmission unit. More...
 
uint16_t generic_tcpip_continue_chksum (uint16_t partial, const void *data, size_t len)
 Calculate continued TCP/IP checkum. More...
 
uint16_t tcpip_chksum (const void *data, size_t len)
 Calculate TCP/IP checkum. More...
 
int tcpip_bind (struct sockaddr_tcpip *st_local, int(*available)(int port))
 Bind to local TCP/IP port. More...
 

Detailed Description

Transport-network layer interface.

This file contains functions and utilities for the TCP/IP transport-network layer interface

Definition in file tcpip.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ tcpip_rx()

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.

Parameters
iobufI/O buffer
netdevNetwork device
tcpip_protoTransport-layer protocol number
st_srcPartially-filled source address
st_destPartially-filled destination address
pshdr_csumPseudo-header checksum
statsIP statistics
Return values
rcReturn status code

This function expects a transport-layer segment from the network layer. The network layer should fill in as much as it can of the source and destination addresses (i.e. it should fill in the address family and the network-layer addresses, but leave the ports and the rest of the structures as zero).

Definition at line 40 of file tcpip.c.

43  {
44  struct tcpip_protocol *tcpip;
45 
46  /* Hand off packet to the appropriate transport-layer protocol */
48  if ( tcpip->tcpip_proto == tcpip_proto ) {
49  DBG ( "TCP/IP received %s packet\n", tcpip->name );
50  stats->in_delivers++;
51  return tcpip->rx ( iobuf, netdev, st_src, st_dest,
52  pshdr_csum );
53  }
54  }
55 
56  DBG ( "Unrecognised TCP/IP protocol %d\n", tcpip_proto );
57  stats->in_unknown_protos++;
58  free_iob ( iobuf );
59  return -EPROTONOSUPPORT;
60 }
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:145
uint8_t tcpip_proto
Transport-layer protocol number.
Definition: tcpip.h:134
unsigned long in_unknown_protos
ipSystemStatsInUnknownProtos
Definition: ipstat.h:83
#define TCPIP_PROTOCOLS
TCP/IP transport-layer protocol table.
Definition: tcpip.h:178
static struct net_device * netdev
Definition: gdbudp.c:52
const char * name
Protocol name.
Definition: tcpip.h:106
unsigned long in_delivers
ipSystemStatsInDelivers
Definition: ipstat.h:116
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:358
A transport-layer protocol of the TCP/IP stack (eg.
Definition: tcpip.h:104
#define EPROTONOSUPPORT
Protocol not supported.
Definition: errno.h:629
int(* rx)(struct io_buffer *iobuf, struct net_device *netdev, struct sockaddr_tcpip *st_src, struct sockaddr_tcpip *st_dest, uint16_t pshdr_csum)
Process received packet.
Definition: tcpip.h:119
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498

References DBG, EPROTONOSUPPORT, for_each_table_entry, free_iob(), ip_statistics::in_delivers, ip_statistics::in_unknown_protos, tcpip_protocol::name, netdev, tcpip_protocol::rx, tcpip_protocol::tcpip_proto, and TCPIP_PROTOCOLS.

Referenced by ipv4_rx(), and ipv6_rx().

◆ tcpip_net_protocol()

Find TCP/IP network-layer protocol.

Parameters
sa_familyAddress family
Return values
tcpip_netTCP/IP network-layer protocol, or NULL if not found

Definition at line 68 of file tcpip.c.

68  {
69  struct tcpip_net_protocol *tcpip_net;
70 
72  if ( tcpip_net->sa_family == sa_family )
73  return tcpip_net;
74  }
75 
76  DBG ( "Unrecognised TCP/IP address family %d\n", sa_family );
77  return NULL;
78 }
sa_family_t sa_family
Network address family.
Definition: tcpip.h:144
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:358
A network-layer protocol of the TCP/IP stack (eg.
Definition: tcpip.h:140
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
#define TCPIP_NET_PROTOCOLS
TCP/IP network-layer protocol table.
Definition: tcpip.h:184

References DBG, for_each_table_entry, NULL, tcpip_net_protocol::sa_family, and TCPIP_NET_PROTOCOLS.

Referenced by efi_pxe_install(), efi_pxe_start(), efi_pxe_udp_deliver(), tcpip_mtu(), tcpip_netdev(), and tcpip_tx().

◆ tcpip_tx()

int tcpip_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 a TCP/IP packet.

Parameters
iobufI/O buffer
tcpip_protocolTransport-layer protocol
st_srcSource address, or NULL to use route default
st_destDestination address
netdevNetwork device to use if no route found, or NULL
trans_csumTransport-layer checksum to complete, or NULL
Return values
rcReturn status code

Definition at line 91 of file tcpip.c.

93  {
94  struct tcpip_net_protocol *tcpip_net;
95 
96  /* Hand off packet to the appropriate network-layer protocol */
97  tcpip_net = tcpip_net_protocol ( st_dest->st_family );
98  if ( tcpip_net ) {
99  DBG ( "TCP/IP sending %s packet\n", tcpip_net->name );
100  return tcpip_net->tx ( iobuf, tcpip_protocol, st_src, st_dest,
101  netdev, trans_csum );
102  }
103 
104  free_iob ( iobuf );
105  return -EAFNOSUPPORT;
106 }
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:145
sa_family_t st_family
Socket address family (part of struct sockaddr)
Definition: tcpip.h:77
#define EAFNOSUPPORT
Address family not supported.
Definition: errno.h:313
struct tcpip_net_protocol * tcpip_net_protocol(sa_family_t sa_family)
Find TCP/IP network-layer protocol.
Definition: tcpip.c:68
static struct net_device * netdev
Definition: gdbudp.c:52
A transport-layer protocol of the TCP/IP stack (eg.
Definition: tcpip.h:104
int(* 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 packet.
Definition: tcpip.h:162
A network-layer protocol of the TCP/IP stack (eg.
Definition: tcpip.h:140
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
const char * name
Protocol name.
Definition: tcpip.h:142

References DBG, EAFNOSUPPORT, free_iob(), tcpip_net_protocol::name, netdev, sockaddr_tcpip::st_family, tcpip_net_protocol(), and tcpip_net_protocol::tx.

Referenced by icmp_tx_echo(), ndp_tx_ll_addr(), tcp_xmit_reset(), tcp_xmit_sack(), and udp_tx().

◆ tcpip_netdev()

struct net_device* tcpip_netdev ( struct sockaddr_tcpip st_dest)

Determine transmitting network device.

Parameters
st_destDestination address
Return values
netdevNetwork device, or NULL

Definition at line 114 of file tcpip.c.

114  {
115  struct tcpip_net_protocol *tcpip_net;
116 
117  /* Hand off to the appropriate network-layer protocol */
118  tcpip_net = tcpip_net_protocol ( st_dest->st_family );
119  if ( tcpip_net )
120  return tcpip_net->netdev ( st_dest );
121 
122  return NULL;
123 }
sa_family_t st_family
Socket address family (part of struct sockaddr)
Definition: tcpip.h:77
struct net_device *(* netdev)(struct sockaddr_tcpip *dest)
Determine transmitting network device.
Definition: tcpip.h:174
struct tcpip_net_protocol * tcpip_net_protocol(sa_family_t sa_family)
Find TCP/IP network-layer protocol.
Definition: tcpip.c:68
A network-layer protocol of the TCP/IP stack (eg.
Definition: tcpip.h:140
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References tcpip_net_protocol::netdev, NULL, sockaddr_tcpip::st_family, and tcpip_net_protocol().

Referenced by ibft_fill_target_nic_association(), and ibft_netdev_is_required().

◆ tcpip_mtu()

size_t tcpip_mtu ( struct sockaddr_tcpip st_dest)

Determine maximum transmission unit.

Parameters
st_destDestination address
Return values
mtuMaximum transmission unit

Definition at line 131 of file tcpip.c.

131  {
132  struct tcpip_net_protocol *tcpip_net;
133  struct net_device *netdev;
134  size_t mtu;
135 
136  /* Find appropriate network-layer protocol */
137  tcpip_net = tcpip_net_protocol ( st_dest->st_family );
138  if ( ! tcpip_net )
139  return 0;
140 
141  /* Find transmitting network device */
142  netdev = tcpip_net->netdev ( st_dest );
143  if ( ! netdev )
144  return 0;
145 
146  /* Calculate MTU */
147  mtu = ( netdev->mtu - tcpip_net->header_len );
148 
149  return mtu;
150 }
size_t mtu
Maximum transmission unit length.
Definition: netdevice.h:409
sa_family_t st_family
Socket address family (part of struct sockaddr)
Definition: tcpip.h:77
struct net_device *(* netdev)(struct sockaddr_tcpip *dest)
Determine transmitting network device.
Definition: tcpip.h:174
struct tcpip_net_protocol * tcpip_net_protocol(sa_family_t sa_family)
Find TCP/IP network-layer protocol.
Definition: tcpip.c:68
static struct net_device * netdev
Definition: gdbudp.c:52
A network device.
Definition: netdevice.h:348
size_t header_len
Fixed header length.
Definition: tcpip.h:146
uint32_t mtu
Maximum MTU.
Definition: ena.h:28
A network-layer protocol of the TCP/IP stack (eg.
Definition: tcpip.h:140

References tcpip_net_protocol::header_len, mtu, net_device::mtu, netdev, tcpip_net_protocol::netdev, sockaddr_tcpip::st_family, and tcpip_net_protocol().

Referenced by tcp_open().

◆ generic_tcpip_continue_chksum()

uint16_t generic_tcpip_continue_chksum ( uint16_t  partial,
const void *  data,
size_t  len 
)

Calculate continued TCP/IP checkum.

Parameters
partialChecksum of already-summed data, in network byte order
dataData buffer
lenLength of data buffer
Return values
cksumUpdated checksum, in network byte order

Calculates a TCP/IP-style 16-bit checksum over the data block. The checksum is returned in network byte order.

This function may be used to add new data to an existing checksum. The function assumes that both the old data and the new data start on even byte offsets; if this is not the case then you will need to byte-swap either the input partial checksum, the output checksum, or both. Deciding which to swap is left as an exercise for the interested reader.

Definition at line 170 of file tcpip.c.

171  {
172  unsigned int cksum = ( ( ~partial ) & 0xffff );
173  unsigned int value;
174  unsigned int i;
175 
176  for ( i = 0 ; i < len ; i++ ) {
177  value = * ( ( uint8_t * ) data + i );
178  if ( i & 1 ) {
179  /* Odd bytes: swap on little-endian systems */
180  value = be16_to_cpu ( value );
181  } else {
182  /* Even bytes: swap on big-endian systems */
183  value = le16_to_cpu ( value );
184  }
185  cksum += value;
186  if ( cksum > 0xffff )
187  cksum -= 0xffff;
188  }
189 
190  return ( ~cksum );
191 }
#define be16_to_cpu(value)
Definition: byteswap.h:115
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
unsigned char uint8_t
Definition: stdint.h:10
#define le16_to_cpu(value)
Definition: byteswap.h:112
uint32_t len
Length.
Definition: ena.h:14
struct arbelprm_port_state_change_st data
Message.
Definition: arbel.h:12

References be16_to_cpu, data, le16_to_cpu, len, and value.

Referenced by tcpip_okx(), and tcpip_random_okx().

◆ tcpip_chksum()

uint16_t tcpip_chksum ( const void *  data,
size_t  len 
)

Calculate TCP/IP checkum.

Parameters
dataData buffer
lenLength of data buffer
Return values
cksumChecksum, in network byte order

Calculates a TCP/IP-style 16-bit checksum over the data block. The checksum is returned in network byte order.

Definition at line 203 of file tcpip.c.

203  {
205 }
#define TCPIP_EMPTY_CSUM
Empty checksum value.
Definition: tcpip.h:57
uint32_t len
Length.
Definition: ena.h:14
struct arbelprm_port_state_change_st data
Message.
Definition: arbel.h:12
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 data, len, tcpip_continue_chksum(), and TCPIP_EMPTY_CSUM.

Referenced by gdbudp_send(), icmp_tx_echo(), icmpv4_rx(), ipv4_rx(), ipv4_tx(), ndp_tx_ll_addr(), tcp_xmit_reset(), tcp_xmit_sack(), and udp_tx().

◆ tcpip_bind()

int tcpip_bind ( struct sockaddr_tcpip st_local,
int(*)(int port available 
)

Bind to local TCP/IP port.

Parameters
st_localLocal TCP/IP socket address, or NULL
availableFunction to check port availability
Return values
portLocal port number, or negative error

Definition at line 214 of file tcpip.c.

215  {
216  uint16_t flags = 0;
217  uint16_t try_port = 0;
218  uint16_t min_port;
219  uint16_t max_port;
220  unsigned int offset;
221  unsigned int i;
222 
223  /* Extract parameters from local socket address */
224  if ( st_local ) {
225  flags = st_local->st_flags;
226  try_port = ntohs ( st_local->st_port );
227  }
228 
229  /* If an explicit port is specified, check its availability */
230  if ( try_port )
231  return available ( try_port );
232 
233  /* Otherwise, find an available port in the range [1,1023] or
234  * [1025,65535] as appropriate.
235  */
236  min_port = ( ( ( ~flags ) & TCPIP_BIND_PRIVILEGED ) + 1 );
237  max_port = ( ( flags & TCPIP_BIND_PRIVILEGED ) - 1 );
238  offset = random();
239  for ( i = 0 ; i <= max_port ; i++ ) {
240  try_port = ( ( i + offset ) & max_port );
241  if ( try_port < min_port )
242  continue;
243  if ( available ( try_port ) < 0 )
244  continue;
245  return try_port;
246  }
247  return -EADDRINUSE;
248 }
unsigned short uint16_t
Definition: stdint.h:11
#define EADDRINUSE
Address already in use.
Definition: errno.h:303
#define ntohs(value)
Definition: byteswap.h:136
Bind to a privileged port (less than 1024)
Definition: tcpip.h:66
static userptr_t size_t offset
Offset of the first segment within the content.
Definition: deflate.h:259
uint16_t st_port
TCP/IP port.
Definition: tcpip.h:81
long int random(void)
Generate a pseudo-random number between 0 and 2147483647L or 2147483562?
Definition: random.c:30
uint16_t st_flags
Flags.
Definition: tcpip.h:79
uint8_t flags
Flags.
Definition: ena.h:18

References EADDRINUSE, flags, ntohs, offset, random(), sockaddr_tcpip::st_flags, sockaddr_tcpip::st_port, and TCPIP_BIND_PRIVILEGED.

Referenced by ping_open(), tcp_open(), and udp_open_common().