176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _GPXE_SOCKET_H
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _GPXE_SOCKET_H
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @file
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Socket addresses
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE ( GPL2_OR_LATER );
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h>
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @defgroup commtypes Communication semantics
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @{
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Connection-based, reliable streams */
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int tcp_sock_stream;
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define TCP_SOCK_STREAM 0x1
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SOCK_STREAM tcp_sock_stream
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Connectionless, unreliable streams */
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int udp_sock_dgram;
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define UDP_SOCK_DGRAM 0x2
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SOCK_DGRAM udp_sock_dgram
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @} */
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Name communication semantics
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v semantics		Communication semantics (e.g. SOCK_STREAM)
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret name		Name of communication semantics
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __attribute__ (( always_inline )) const char *
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansocket_semantics_name ( int semantics ) {
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/* Cannot use a switch() because of the {TCP_UDP}_SOCK_XXX hack */
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if ( semantics == SOCK_STREAM ) {
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		return "SOCK_STREAM";
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	} else if ( semantics == SOCK_DGRAM ) {
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		return "SOCK_DGRAM";
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	} else {
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		return "SOCK_UNKNOWN";
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @defgroup addrfam Address families
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @{
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define AF_INET		1	/**< IPv4 Internet addresses */
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define AF_INET6	2	/**< IPv6 Internet addresses */
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @} */
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Name address family
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v family		Address family (e.g. AF_INET)
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret name		Name of address family
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __attribute__ (( always_inline )) const char *
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansocket_family_name ( int family ) {
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	switch ( family ) {
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case AF_INET:		return "AF_INET";
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case AF_INET6:		return "AF_INET6";
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	default:		return "AF_UNKNOWN";
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** A socket address family */
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef uint16_t sa_family_t;
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Length of a @c struct @c sockaddr */
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SA_LEN 32
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Generalized socket address structure
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This contains the fields common to socket addresses for all address
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * families.
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct sockaddr {
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Socket address family
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This is an AF_XXX constant.
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        sa_family_t sa_family;
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Padding
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 *
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * This ensures that a struct @c sockaddr_tcpip is large
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * enough to hold a socket address for any TCP/IP address
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * family.
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	char pad[ SA_LEN - sizeof ( sa_family_t ) ];
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( may_alias ));
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* _GPXE_SOCKET_H */
102