176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef	_GPXE_IN_H
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define	_GPXE_IN_H
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE ( GPL2_OR_LATER );
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h>
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/socket.h>
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Protocol numbers */
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IP_ICMP		1
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IP_TCP		6
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IP_UDP		17
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IP_ICMP6	58
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* IP address constants */
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define INADDR_NONE 0xffffffff
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define INADDR_BROADCAST 0xffffffff
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define	IN_CLASSA(addr)		( ( (addr) & 0x80000000 ) == 0x00000000 )
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define	IN_CLASSA_NET		0xff000000
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define	IN_CLASSB(addr)		( ( (addr) & 0xc0000000 ) == 0x80000000 )
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define	IN_CLASSB_NET		0xffff0000
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define	IN_CLASSC(addr)		( ( (addr) & 0xe0000000 ) == 0xc0000000 )
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define	IN_CLASSC_NET		0xffffff00
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IN_MULTICAST(addr)	( ( (addr) & 0xf0000000 ) == 0xe0000000 )
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * IP address structure
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct in_addr {
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t	s_addr;
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct in_addr in_addr;
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * IP6 address structure
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct in6_addr {
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        union {
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                uint8_t u6_addr8[16];
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                uint16_t u6_addr16[8];
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                uint32_t u6_addr32[4];
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        } in6_u;
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define s6_addr         in6_u.u6_addr8
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define s6_addr16       in6_u.u6_addr16
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define s6_addr32       in6_u.u6_addr32
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * IPv4 socket address
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct sockaddr_in {
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Socket address family (part of struct @c sockaddr)
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * Always set to @c AF_INET for IPv4 addresses
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	sa_family_t sin_family;
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** TCP/IP port (part of struct @c sockaddr_tcpip) */
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t sin_port;
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** IPv4 address */
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct in_addr sin_addr;
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Padding
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This ensures that a struct @c sockaddr_tcpip is large
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * enough to hold a socket address for any TCP/IP address
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * family.
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	char pad[ sizeof ( struct sockaddr ) - sizeof ( sa_family_t )
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					     - sizeof ( uint16_t )
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					     - sizeof ( struct in_addr ) ];
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( may_alias ));
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * IPv6 socket address
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct sockaddr_in6 {
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Socket address family (part of struct @c sockaddr)
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * Always set to @c AF_INET6 for IPv6 addresses
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	sa_family_t sin_family;
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** TCP/IP port (part of struct @c sockaddr_tcpip) */
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t 	sin_port;
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        uint32_t        sin6_flowinfo;  /* Flow number */
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        struct in6_addr sin6_addr;      /* 128-bit destination address */
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        uint32_t        sin6_scope_id;  /* Scope ID */
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( may_alias ));
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int inet_aton ( const char *cp, struct in_addr *inp );
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern char * inet_ntoa ( struct in_addr in );
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Adding the following for IP6 support
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int inet6_aton ( const char *cp, struct in6_addr *inp );
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern char * inet6_ntoa ( struct in_addr in );
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif	/* _GPXE_IN_H */
105