summaryrefslogtreecommitdiff
path: root/usr/src/man/man3socket/sockaddr.3socket
blob: c5c796dcb0c0e1395c4276f8f08b748cc6df62da (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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
.\"
.\" This file and its contents are supplied under the terms of the
.\" Common Development and Distribution License ("CDDL"), version 1.0.
.\" You may only use this file in accordance with the terms of version
.\" 1.0 of the CDDL.
.\"
.\" A full copy of the text of the CDDL should have accompanied this
.\" source.  A copy of the CDDL is also available via the Internet at
.\" http://www.illumos.org/license/CDDL.
.\"
.\"
.\" Copyright 2015, Joyent, Inc.
.\"
.Dd May 18, 2015
.Dt SOCKADDR 3SOCKET
.Os
.Sh NAME
.Nm sockaddr ,
.Nm sockaddr_dl ,
.Nm sockaddr_in ,
.Nm sockaddr_in6 ,
.Nm sockaddr_ll ,
.Nm sockaddr_storage ,
.Nm sockaddr_un
.Nd Socket Address Structures
.Sh SYNOPSIS
.In sys/socket.h
.Lp
.Sy struct sockaddr
.Em sock ;
.Lp
.In sys/socket.h
.In net/if_dl.h
.Lp
.Sy struct sockaddr_dl
.Em dl_sock ;
.Lp
.In sys/socket.h
.In netinet/in.h
.Lp
.Sy struct sockaddr_in
.Em in_sock ;
.Lp
.In sys/socket.h
.In netinet/in.h
.Lp
.Sy struct sockaddr_in6
.Em in6_sock ;
.Lp
.In sys/socket.h
.Lp
.Sy struct sockaddr_ll
.Em ll_sock ;
.Lp
.In sys/socket.h
.Lp
.Sy struct sockaddr_storage
.Em storage_sock ;
.Lp
.In sys/un.h
.Lp
.Sy struct sockaddr_un
.Em un_sock ;
.Sh DESCRIPTION
The
.Nm
family of structures are designed to represent network addresses for
different networking protocols. The structure
.Sy struct sockaddr
is a generic structure that is used across calls to various socket
library routines
.Po
.Xr libsocket 3LIB
.Pc
such as
.Xr accept 3SOCKET
and
.Xr bind 3SOCKET .
Applications do not use the
.Sy struct sockaddr
directly, but instead cast the appropriate networking family specific
.Nm
structure to a
.Sy struct sockaddr * .
.Lp
Every structure in the
.Nm
family begins with a member of the same type, the
.Sy sa_family_t ,
though the different structures all have different names for the member.
For example, the structure
.Sy struct sockaddr
has the following members defined:
.Bd -literal -offset indent
sa_family_t	sa_family	/* address family */
char		sa_data[]	/* socket address (variable-length data) */
.Ed
.Lp
The member
.Em sa_family
corresponds to the socket family that's actually in use. The following
table describes the mapping between the address family and the
corresponding socket structure that's used. Note that both the generic
.Sy struct sockaddr
and the
.Sy struct sockaddr_storage
are not included, because these are both generic structures. More on the
.Sy struct sockaddr_storage
can be found in the next section.
.Bl -column -offset indent ".Sy Socket Structure" ".Sy Address Family"
.It Sy Socket Structure Ta Sy Address Family
.It struct sockaddr_dl Ta AF_LINK
.It struct sockaddr_in Ta AF_INET
.It struct sockaddr_in6 Ta AF_INET6
.It struct sockaddr_ll Ta AF_PACKET
.It struct sockaddr_un Ta AF_UNIX
.El
.Ss struct sockaddr_storage
The
.Sy sockaddr_storage
structure is a
.Nm
that is not associated with an address family. Instead, it is large
enough to hold the contents of any of the other
.Nm
structures. It can be used to embed sufficient storage for a
.Sy sockaddr
of any type within a larger structure.
.Lp
The structure only has a single member defined. While there are other
members that are used to pad out the size of the
.Sy struct sockaddr_storage ,
they are not defined and must not be consumed. The only valid
member is:
.Bd -literal -offset indent
sa_family_t	ss_family	/* address family */
.Ed
.Lp
For example,
.Sy struct sockaddr_storage
is useful when running a service that accepts traffic over both
.Sy IPv4
and
.Sy IPv6
where it is common to use a single socket for both address families. In that
case, rather than guessing whether a
.Sy struct sockaddr_in
or a
.Sy struct sockaddr_in6
is more appropriate, one can simply use a
.Sy struct sockaddr_storage
and cast to the appropriate family-specific structure type based on the
value of the member
.Em ss_family .
.Ss struct sockaddr_in
The
.Sy sockaddr_in
is the socket type which is used for for the Internet Protocol version
four (IPv4). It has the following members defined:
.Bd -literal -offset indent
sa_family_t	sin_family	/* address family */
in_port_t	sin_port	/* IP port */
struct in_addr	sin_addr	/* IP address */
.Ed
.Lp
The member
.Em sin_family
must always have the value
.Sy AF_INET
for
.Sy IPv4 .
The members
.Em sin_port
and
.Em sin_addr
describe the IP address and IP port to use. In the case of a call to
.Xr connect 3SOCKET
these represent the remote IP address and port to which the connection
is being made. In the case of
.Xr bind 3SOCKET
these represent the IP address and port on the local host to which the socket
is to be bound. In the case of
.Xr accept 3SOCKET
these represent the remote IP address and port of the machine whose
connection was accepted.
.Lp
The member
.Em sin_port
is always stored in
.Sy Network Byte Order .
On many systems, this differs from the native host byte order.
Applications should read from the member with the function
.Xr ntohs 3SOCKET
and write to the member with the function
.Xr htons 3SOCKET .
The member
.Em sin_addr
is the four byte IPv4 address. It is also stored in network byte order.
The common way to write out the address is to use the function
.Xr inet_pton 3SOCKET
which converts between a human readable IP address such as "10.1.2.3"
and the corresponding representation.
.Lp
Example 1 shows how to prepare an IPv4 socket and deal with
network byte-order. See
.Xr inet 7P
and
.Xr ip 7P
for more information on IPv4, socket options, etc.
.Ss struct sockaddr_in6
The
.Sy sockaddr_in6
structure is the
.Nm
for the Internet Protocol version six (IPv6). Unlike the
.Sy struct sockaddr_in ,
the
.Sy struct sockaddr_in6
has additional members beyond those shown here which are required to be
initialized to zero through a function such as
.Xr bzero 3C
or
.Xr memset 3C .
If the entire
.Sy struct sockaddr_in6
is not zeroed before use, applications will experience undefined behavior. The
.Sy struct sockaddr_in6
has the following public members:
.Bd -literal -offset indent
sa_family_t	sin6_family	/* address family */
in_port_t	sin6_port	/* IPv6 port */
struct in6_addr	sin6_addr	/* IPv6 address */
uint32_t	sin6_flowinfo;	/* traffic class and flow info */
uint32_t	sin6_scope_id;	/* interface scope */
.Ed
.Lp
The member
.Em sin6_family
must always have the value
.Sy AF_INET6 .
The members
.Em sin6_port
and
.Em sin6_addr
are the IPv6 equivalents of the
.Sy struct sockaddr_in
.Em sin_port
and
.Em sin_addr .
Like their IPv4 counterparts, both of these members must be in network
byte order. The member
.Em sin6_port
describes the IPv6 port and should be manipulated with the functions
.Xr ntohs 3SOCKET
and
.Xr htons 3SOCKET .
The member
.Em sin6_addr
describes the 16-byte IPv6 address. In addition to the function
.Xr inet_pton 3SOCKET ,
the header file
.In netinet/in.h
defines many macros for manipulating and testing IPv6 addresses.
.Lp
The member
.Em sin6_flowinfo
contains the traffic class and flow label associated with the IPv6
header. The member
.Em sin6_scope_id
may contain an identifier which varies based on the scope of the address
in
.Em sin6_addr .
Applications do not need to initialize
.Em sin6_scope_id ;
it will be populated by the operating system as a result of various library
calls.
.Lp
Example 2 shows how to prepare an IPv6 socket. For more information on
IPv6, please see
.Xr inet6 7P
and
.Xr ip6 7P .
.Ss struct sockaddr_un
The
.Sy sockaddr_un
structure specifies the address of a socket used to communicate between
processes running on a single system, commonly known as a
.Em UNIX domain socket .
Sockets of this type are identified by a path in the file system. The
.Sy struct sockaddr_un
has the following members:
.Bd -literal -offset indent
sa_family_t	sun_family	/* address family */
char		sun_path[108]	/* path name */
.Ed
.Lp
The member
.Em sun_family
must always have the value
.Sy AF_UNIX .
The member
.Em sun_path
is populated with a
.Sy NUL
terminated array of characters that specify a file system path. The maximum
length of any such path, including the
.Sy NUL
terminator, is 108 bytes.
.Ss struct sockaddr_dl
The
.Sy sockaddr_dl
structure is used to describe a layer 2 link-level address. This is used
as part of various socket ioctls, such as those for
.Xr arp 7P .
The structure has the following members:
.Bd -literal -offset indent
ushort_t	sdl_family;	/* address family */
ushort_t	sdl_index;	/* if != 0, system interface index */
uchar_t		sdl_type;	/* interface type */
uchar_t		sdl_nlen;	/* interface name length */
uchar_t		sdl_alen;	/* link level address length */
uchar_t		sdl_slen;	/* link layer selector length */
char		sdl_data[244];	/* contains both if name and ll address
.Ed
.Lp
The member
.Em sdl_family
must always have the value
.Sy AF_LINK .
When the member
.Em sdl_index
is non-zero this refers to the interface identifier that corresponds to
the
.Sy struct sockaddr_dl .
This identifier is the same identifier that's shown by tools like
.Xr ifconfig 1M
and used in the SIOC* set of socket ioctls. The member
.Em sdl_type
refers to the media that is used for the socket. The most common case is
that the medium for the interface is Ethernet which has the value
.Sy IFT_ETHER .
The full set of types is derived from RFC1573 and recorded in the file
.In net/if_types.h .
The member
.Em sdl_slen
describes the length of a selector, if it exists, for the specified
medium. This is used in protocols such as Trill.
.Lp
The
.Em sdl_data ,
.Em sdl_nlen
and
.Em sdl_alen
members together describe a character string containing the interface name and
the link-layer network address. The name starts at the beginning of
.Em sdl_data ,
i.e. at
.Em sdl_data[0] .
The name of the interface occupies the next
.Em sdl_nlen
bytes and is not
.Sy NUL
terminated. The link-layer network address begins immediately after the
interface name, and is
.Em sdl_alen
bytes long. The macro
.Sy LLADDR(struct sockaddr_dl *)
returns the start of the link-layer network address.
The interpretation of the link-layer address depends on the value of
.Em sdl_type .
For example, if the type is
.Sy IFT_ETHER
then the address is expressed as a 6-byte MAC address.
.Ss struct sockaddr_ll
The
.Sy sockaddr_ll
is used as part of a socket type which is responsible for packet
capture:
.Sy AF_PACKET
sockets. It is generally designed for use with Ethernet networks. The members
of the
.Sy struct sockaddr_ll
are:
.Bd -literal -offset indent
uint16_t        sll_family;	/* address family */
uint16_t        sll_protocol;	/* link layer protocol */
int32_t         sll_ifindex;	/* interface index */
uint16_t        sll_hatype;	/* ARP hardware type */
uint8_t         sll_pkttype;	/* packet type */
uint8_t         sll_halen;	/* hardware address length */
uint8_t         sll_addr[8];	/* hardware type */
.Ed
.Lp
The member
.Em sll_family
must be
.Sy AF_PACKET .
The member
.Em sll_protocol
refers to a link-layer protocol. For example, when capturing Ethernet frames
the value of
.Em sll_protocol
is the Ethertype. This member is written in network byte order and
applications should use
.Xr htons 3SOCKET
and
.Xr ntohs 3SOCKET
to read and write the member.
.Lp
The member
.Em sll_ifindex
is the interface's index. It is used as an identifier in various ioctls
and included in the output of
.Xr ifconfig 1M .
When calling
.Xr bind 3SOCKET
it should be filled in with the index that corresponds to the interface
for which packets should be captured on.
.Lp
The member
.Em sll_pkttype
describes the type of the packet based on a list of types in the header
file
.In netpacket/packet.h .
These types include:
.Sy PACKET_OUTGOING ,
a packet that was leaving the host and has been looped back for packet capture;
.Sy PACKET_HOST ,
a packet that was destined for this host;
.Sy PACKET_BROADCAST ,
a packet that was broadcast across the link-layer;
.Sy PACKET_MULTICAST ,
a packet that was sent to a link-layer multicast address; and
.Sy PACKET_OTHERHOST ,
a packet that was captured only because the device in question was in
promiscuous mode.
.Lp
The member
.Em sll_hatype
contains the hardware type as defined by
.Xr arp 7P .
The list of types can be found in
.In net/if_arp.h .
The member
.Em sll_halen
contains the length, in bytes, of the hardware address, while the member
.Em sll_addr
contains the actual address in network byte order.
.Sh EXAMPLES
.Sy Example 1
Preparing an IPv4
.Sy sockaddr_in
to connect to a remote host
.Lp
The following example shows how one would open a socket and prepare it
to connect to the remote host whose address is the IP address 127.0.0.1
on port 80. This program should be compiled with the C compiler
.Sy cc
and linked against the libraries libsocket and libnsl. If this example
was named ip4.c, then the full link line would be
.Ic cc ip4.c -lsocket -lnsl .
.Bd -literal
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <inttypes.h>
#include <strings.h>

int
main(void)
{
	int sock;
	struct sockaddr_in in;

	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		perror("socket");
		return (1);
	}

	bzero(&in, sizeof (struct sockaddr_in));
	in.sin_family = AF_INET;
	in.sin_port = htons(80);
	if (inet_pton(AF_INET, "127.0.0.1", &in.sin_addr) != 1) {
		perror("inet_pton");
		return (1);
	}

	if (connect(sock, (struct sockaddr *)&in,
	    sizeof (struct sockaddr_in)) != 0) {
		perror("connect");
		return (1);
	}

	/* use socket */

	return (0);
}
.Ed
.Lp
.Sy Example 2
Preparing an IPv6
.Sy sockaddr_in6
to bind to a local address
.Lp
The following example shows how one would open a socket and prepare it
to bind to the local IPv6 address ::1 port on port 12345. This program
should be compiled with the C compiler
.Sy cc
and linked aginst the libraries libsocket and libnsl. If this example
was named ip6.c, then the full compiler line would be
.Ic cc ip6.c -lsocket -lnsl .
.Bd -literal
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <inttypes.h>
#include <strings.h>

int
main(void)
{
	int sock6;
	struct sockaddr_in6 in6;

	if ((sock6 = socket(AF_INET6, SOCK_STREAM, 0)) < 0) {
		perror("socket");
		return (1);
	}

	bzero(&in6, sizeof (struct sockaddr_in6));
	in6.sin6_family = AF_INET6;
	in6.sin6_port = htons(12345);
	if (inet_pton(AF_INET6, "::1", &in6.sin6_addr) != 1) {
		perror("inet_pton");
		return (1);
	}

	if (bind(sock6, (struct sockaddr *)&in6,
	    sizeof (struct sockaddr_in6)) != 0) {
		perror("bind");
		return (1);
	}

	/* use server socket */

	return (0);
}
.Ed
.Sh SEE ALSO
.Xr socket 3HEAD ,
.Xr uh.h 3HEAD ,
.Xr accept 3SOCKET ,
.Xr bind 3SOCKET ,
.Xr connect 3SOCKET ,
.Xr socket 3SOCKET ,
.Xr arp 7P ,
.Xr inet 7P ,
.Xr inet6 7P ,
.Xr ip 7P ,
.Xr ip6 7P ,