summaryrefslogtreecommitdiffstats
path: root/qemu/roms/ipxe/src/include/ipxe/socket.h
blob: 7cb3912f4be17ba42e9f5cf33daf41661e3e0859 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#ifndef _IPXE_SOCKET_H
#define _IPXE_SOCKET_H

/** @file
 *
 * Socket addresses
 *
 */

FILE_LICENCE ( GPL2_OR_LATER );

#include <stdint.h>
#include <ipxe/tables.h>

/**
 * @defgroup commtypes Communication semantics
 *
 * @{
 */

/** Connection-based, reliable streams */
extern int tcp_sock_stream;
#define TCP_SOCK_STREAM 0x1
#define SOCK_STREAM tcp_sock_stream

/** Connectionless, unreliable streams */
extern int udp_sock_dgram;
#define UDP_SOCK_DGRAM 0x2
#define SOCK_DGRAM udp_sock_dgram

/** Echo testing streams */
extern int ping_sock_echo;
#define PING_SOCK_ECHO 0x3
#define SOCK_ECHO ping_sock_echo

/** @} */

/**
 * Name communication semantics
 *
 * @v semantics		Communication semantics (e.g. SOCK_STREAM)
 * @ret name		Name of communication semantics
 */
static inline __attribute__ (( always_inline )) const char *
socket_semantics_name ( int semantics ) {
	/* Cannot use a switch() because of the {TCP_UDP}_SOCK_XXX hack */
	if ( semantics == SOCK_STREAM ) {
		return "SOCK_STREAM";
	} else if ( semantics == SOCK_DGRAM ) {
		return "SOCK_DGRAM";
	} else if ( semantics == SOCK_ECHO ) {
		return "SOCK_ECHO";
	} else {
		return "SOCK_UNKNOWN";
	}
}

/**
 * @defgroup addrfam Address families
 *
 * @{
 */
#define AF_INET		1	/**< IPv4 Internet addresses */
#define AF_INET6	2	/**< IPv6 Internet addresses */
#define AF_FC		3	/**< Fibre Channel addresses */
/** @} */

/**
 * Name address family
 *
 * @v family		Address family (e.g. AF_INET)
 * @ret name		Name of address family
 */
static inline __attribute__ (( always_inline )) const char *
socket_family_name ( int family ) {
	switch ( family ) {
	case AF_INET:		return "AF_INET";
	case AF_INET6:		return "AF_INET6";
	case AF_FC:		return "AF_FC";
	default:		return "AF_UNKNOWN";
	}
}

/** A socket address family */
typedef uint16_t sa_family_t;

/** Length of a @c struct @c sockaddr */
#define SA_LEN 32

/**
 * Generalized socket address structure
 *
 * This contains the fields common to socket addresses for all address
 * families.
 */
struct sockaddr {
	/** Socket address family
	 *
	 * This is an AF_XXX constant.
	 */
        sa_family_t sa_family;
	/** Padding
	 *
	 * This ensures that a struct @c sockaddr_tcpip is large
	 * enough to hold a socket address for any TCP/IP address
	 * family.
	 */
	char pad[ SA_LEN - sizeof ( sa_family_t ) ];
} __attribute__ (( packed, may_alias ));

/**
 * Socket address converter
 *
 */
struct sockaddr_converter {
	/** Socket address family
	 *
	 * This is an AF_XXX constant.
	 */
        sa_family_t family;
	/** Transcribe socket address
	 *
	 * @v sa		Socket address
	 * @ret string		Socket address string
	 */
	const char * ( * ntoa ) ( struct sockaddr *sa );
	/** Parse socket address
	 *
	 * @v string		Socket address stringh
	 * @v sa		Socket address to fill in
	 * @ret rc		Return status code
	 */
	int ( * aton ) ( const char *string, struct sockaddr *sa );
};

/** Socket address converter table */
#define SOCKADDR_CONVERTERS \
	__table ( struct sockaddr_converter, "sockaddr_converters" )

/** Declare a socket address converter */
#define __sockaddr_converter __table_entry ( SOCKADDR_CONVERTERS, 01 )

extern const char * sock_ntoa ( struct sockaddr *sa );
extern int sock_aton ( const char *string, struct sockaddr *sa );

#endif /* _IPXE_SOCKET_H */