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