mirror of https://github.com/ipxe/ipxe.git
parent
1c607470e3
commit
b44332eb7d
|
@ -0,0 +1,18 @@
|
||||||
|
#ifndef _IP_H
|
||||||
|
#define _IP_H
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
*
|
||||||
|
* IP protocol
|
||||||
|
*
|
||||||
|
* This file defines the gPXE IP API.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gpxe/in.h>
|
||||||
|
|
||||||
|
extern void set_ipaddr ( struct in_addr address );
|
||||||
|
extern void init_tcpip ( void );
|
||||||
|
extern void run_tcpip ( void );
|
||||||
|
|
||||||
|
#endif /* _IP_H */
|
|
@ -96,7 +96,5 @@ extern int tcp_connect ( struct tcp_connection *conn );
|
||||||
extern void tcp_send ( struct tcp_connection *conn, const void *data,
|
extern void tcp_send ( struct tcp_connection *conn, const void *data,
|
||||||
size_t len );
|
size_t len );
|
||||||
extern void tcp_close ( struct tcp_connection *conn );
|
extern void tcp_close ( struct tcp_connection *conn );
|
||||||
extern void init_tcpip ( void );
|
|
||||||
extern void run_tcpip ( void );
|
|
||||||
|
|
||||||
#endif /* _TCP_H */
|
#endif /* _TCP_H */
|
||||||
|
|
|
@ -0,0 +1,109 @@
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <byteswap.h>
|
||||||
|
#include <gpxe/in.h>
|
||||||
|
#include <gpxe/ip.h>
|
||||||
|
#include "uip/uip.h"
|
||||||
|
#include "uip/uip_arp.h"
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
*
|
||||||
|
* IP protocol
|
||||||
|
*
|
||||||
|
* The gPXE IP stack is currently implemented on top of the uIP
|
||||||
|
* protocol stack. This file provides wrappers around uIP so that
|
||||||
|
* higher-level protocol implementations do not need to talk directly
|
||||||
|
* to uIP (which has a somewhat baroque API).
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set IP address
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void set_ipaddr ( struct in_addr address ) {
|
||||||
|
union {
|
||||||
|
struct in_addr address;
|
||||||
|
uint16_t uip_address[2];
|
||||||
|
} u;
|
||||||
|
|
||||||
|
u.address = address;
|
||||||
|
uip_sethostaddr ( u.uip_address );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise TCP/IP stack
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void init_tcpip ( void ) {
|
||||||
|
uip_init();
|
||||||
|
uip_arp_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
#define UIP_HLEN ( 40 + UIP_LLH_LEN )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transmit TCP data
|
||||||
|
*
|
||||||
|
* This is a wrapper around netdev_transmit(). It gathers up the
|
||||||
|
* packet produced by uIP, and then passes it to netdev_transmit() as
|
||||||
|
* a single buffer.
|
||||||
|
*/
|
||||||
|
static void uip_transmit ( void ) {
|
||||||
|
uip_arp_out();
|
||||||
|
if ( uip_len > UIP_HLEN ) {
|
||||||
|
memcpy ( uip_buf + UIP_HLEN, ( void * ) uip_appdata,
|
||||||
|
uip_len - UIP_HLEN );
|
||||||
|
}
|
||||||
|
netdev_transmit ( uip_buf, uip_len );
|
||||||
|
uip_len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run the TCP/IP stack
|
||||||
|
*
|
||||||
|
* Call this function in a loop in order to allow TCP/IP processing to
|
||||||
|
* take place. This call takes the stack through a single iteration;
|
||||||
|
* it will typically be used in a loop such as
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
*
|
||||||
|
* struct tcp_connection *my_connection;
|
||||||
|
* ...
|
||||||
|
* tcp_connect ( my_connection );
|
||||||
|
* while ( ! my_connection->finished ) {
|
||||||
|
* run_tcpip();
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* where @c my_connection->finished is set by one of the connection's
|
||||||
|
* #tcp_operations methods to indicate completion.
|
||||||
|
*/
|
||||||
|
void run_tcpip ( void ) {
|
||||||
|
void *data;
|
||||||
|
size_t len;
|
||||||
|
uint16_t type;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if ( netdev_poll ( 1, &data, &len ) ) {
|
||||||
|
/* We have data */
|
||||||
|
memcpy ( uip_buf, data, len );
|
||||||
|
uip_len = len;
|
||||||
|
type = ntohs ( *( ( uint16_t * ) ( uip_buf + 12 ) ) );
|
||||||
|
if ( type == UIP_ETHTYPE_ARP ) {
|
||||||
|
uip_arp_arpin();
|
||||||
|
} else {
|
||||||
|
uip_arp_ipin();
|
||||||
|
uip_input();
|
||||||
|
}
|
||||||
|
if ( uip_len > 0 )
|
||||||
|
uip_transmit();
|
||||||
|
} else {
|
||||||
|
for ( i = 0 ; i < UIP_CONNS ; i++ ) {
|
||||||
|
uip_periodic ( i );
|
||||||
|
if ( uip_len > 0 )
|
||||||
|
uip_transmit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -25,83 +25,6 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialise TCP/IP stack
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void init_tcpip ( void ) {
|
|
||||||
uip_init();
|
|
||||||
uip_arp_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
#define UIP_HLEN ( 40 + UIP_LLH_LEN )
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Transmit TCP data
|
|
||||||
*
|
|
||||||
* This is a wrapper around netdev_transmit(). It gathers up the
|
|
||||||
* packet produced by uIP, and then passes it to netdev_transmit() as
|
|
||||||
* a single buffer.
|
|
||||||
*/
|
|
||||||
static void uip_transmit ( void ) {
|
|
||||||
uip_arp_out();
|
|
||||||
if ( uip_len > UIP_HLEN ) {
|
|
||||||
memcpy ( uip_buf + UIP_HLEN, ( void * ) uip_appdata,
|
|
||||||
uip_len - UIP_HLEN );
|
|
||||||
}
|
|
||||||
netdev_transmit ( uip_buf, uip_len );
|
|
||||||
uip_len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run the TCP/IP stack
|
|
||||||
*
|
|
||||||
* Call this function in a loop in order to allow TCP/IP processing to
|
|
||||||
* take place. This call takes the stack through a single iteration;
|
|
||||||
* it will typically be used in a loop such as
|
|
||||||
*
|
|
||||||
* @code
|
|
||||||
*
|
|
||||||
* struct tcp_connection *my_connection;
|
|
||||||
* ...
|
|
||||||
* tcp_connect ( my_connection );
|
|
||||||
* while ( ! my_connection->finished ) {
|
|
||||||
* run_tcpip();
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* @endcode
|
|
||||||
*
|
|
||||||
* where @c my_connection->finished is set by one of the connection's
|
|
||||||
* #tcp_operations methods to indicate completion.
|
|
||||||
*/
|
|
||||||
void run_tcpip ( void ) {
|
|
||||||
void *data;
|
|
||||||
size_t len;
|
|
||||||
uint16_t type;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if ( netdev_poll ( 1, &data, &len ) ) {
|
|
||||||
/* We have data */
|
|
||||||
memcpy ( uip_buf, data, len );
|
|
||||||
uip_len = len;
|
|
||||||
type = ntohs ( *( ( uint16_t * ) ( uip_buf + 12 ) ) );
|
|
||||||
if ( type == UIP_ETHTYPE_ARP ) {
|
|
||||||
uip_arp_arpin();
|
|
||||||
} else {
|
|
||||||
uip_arp_ipin();
|
|
||||||
uip_input();
|
|
||||||
}
|
|
||||||
if ( uip_len > 0 )
|
|
||||||
uip_transmit();
|
|
||||||
} else {
|
|
||||||
for ( i = 0 ; i < UIP_CONNS ; i++ ) {
|
|
||||||
uip_periodic ( i );
|
|
||||||
if ( uip_len > 0 )
|
|
||||||
uip_transmit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open a TCP connection
|
* Open a TCP connection
|
||||||
*
|
*
|
||||||
|
|
|
@ -114,7 +114,7 @@ typedef unsigned short uip_stats_t;
|
||||||
*
|
*
|
||||||
* \hideinitializer
|
* \hideinitializer
|
||||||
*/
|
*/
|
||||||
#define UIP_FIXEDADDR 1
|
#define UIP_FIXEDADDR 0
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ping IP address asignment.
|
* Ping IP address asignment.
|
||||||
|
@ -130,42 +130,42 @@ typedef unsigned short uip_stats_t;
|
||||||
*/
|
*/
|
||||||
#define UIP_PINGADDRCONF 0
|
#define UIP_PINGADDRCONF 0
|
||||||
|
|
||||||
#define UIP_IPADDR0 192 /**< The first octet of the IP address of
|
#define UIP_IPADDR0 0 /**< The first octet of the IP address of
|
||||||
this uIP node, if UIP_FIXEDADDR is
|
this uIP node, if UIP_FIXEDADDR is
|
||||||
1. \hideinitializer */
|
1. \hideinitializer */
|
||||||
#define UIP_IPADDR1 168 /**< The second octet of the IP address of
|
#define UIP_IPADDR1 0 /**< The second octet of the IP address of
|
||||||
this uIP node, if UIP_FIXEDADDR is
|
this uIP node, if UIP_FIXEDADDR is
|
||||||
1. \hideinitializer */
|
1. \hideinitializer */
|
||||||
#define UIP_IPADDR2 0 /**< The third octet of the IP address of
|
#define UIP_IPADDR2 0 /**< The third octet of the IP address of
|
||||||
this uIP node, if UIP_FIXEDADDR is
|
this uIP node, if UIP_FIXEDADDR is
|
||||||
1. \hideinitializer */
|
1. \hideinitializer */
|
||||||
#define UIP_IPADDR3 2 /**< The fourth octet of the IP address of
|
#define UIP_IPADDR3 0 /**< The fourth octet of the IP address of
|
||||||
this uIP node, if UIP_FIXEDADDR is
|
this uIP node, if UIP_FIXEDADDR is
|
||||||
1. \hideinitializer */
|
1. \hideinitializer */
|
||||||
|
|
||||||
#define UIP_NETMASK0 255 /**< The first octet of the netmask of
|
#define UIP_NETMASK0 0 /**< The first octet of the netmask of
|
||||||
this uIP node, if UIP_FIXEDADDR is
|
this uIP node, if UIP_FIXEDADDR is
|
||||||
1. \hideinitializer */
|
1. \hideinitializer */
|
||||||
#define UIP_NETMASK1 255 /**< The second octet of the netmask of
|
#define UIP_NETMASK1 0 /**< The second octet of the netmask of
|
||||||
this uIP node, if UIP_FIXEDADDR is
|
this uIP node, if UIP_FIXEDADDR is
|
||||||
1. \hideinitializer */
|
1. \hideinitializer */
|
||||||
#define UIP_NETMASK2 255 /**< The third octet of the netmask of
|
#define UIP_NETMASK2 0 /**< The third octet of the netmask of
|
||||||
this uIP node, if UIP_FIXEDADDR is
|
this uIP node, if UIP_FIXEDADDR is
|
||||||
1. \hideinitializer */
|
1. \hideinitializer */
|
||||||
#define UIP_NETMASK3 0 /**< The fourth octet of the netmask of
|
#define UIP_NETMASK3 0 /**< The fourth octet of the netmask of
|
||||||
this uIP node, if UIP_FIXEDADDR is
|
this uIP node, if UIP_FIXEDADDR is
|
||||||
1. \hideinitializer */
|
1. \hideinitializer */
|
||||||
|
|
||||||
#define UIP_DRIPADDR0 192 /**< The first octet of the IP address of
|
#define UIP_DRIPADDR0 0 /**< The first octet of the IP address of
|
||||||
the default router, if UIP_FIXEDADDR is
|
the default router, if UIP_FIXEDADDR is
|
||||||
1. \hideinitializer */
|
1. \hideinitializer */
|
||||||
#define UIP_DRIPADDR1 168 /**< The second octet of the IP address of
|
#define UIP_DRIPADDR1 0 /**< The second octet of the IP address of
|
||||||
the default router, if UIP_FIXEDADDR is
|
the default router, if UIP_FIXEDADDR is
|
||||||
1. \hideinitializer */
|
1. \hideinitializer */
|
||||||
#define UIP_DRIPADDR2 0 /**< The third octet of the IP address of
|
#define UIP_DRIPADDR2 0 /**< The third octet of the IP address of
|
||||||
the default router, if UIP_FIXEDADDR is
|
the default router, if UIP_FIXEDADDR is
|
||||||
1. \hideinitializer */
|
1. \hideinitializer */
|
||||||
#define UIP_DRIPADDR3 1 /**< The fourth octet of the IP address of
|
#define UIP_DRIPADDR3 0 /**< The fourth octet of the IP address of
|
||||||
the default router, if UIP_FIXEDADDR is
|
the default router, if UIP_FIXEDADDR is
|
||||||
1. \hideinitializer */
|
1. \hideinitializer */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue