xref: /illumos-gate/usr/src/man/man3socket/sockaddr.3socket (revision bbf215553c7233fbab8a0afdf1fac74c44781867)
1177d5b5fSRobert Mustacchi.\"
2177d5b5fSRobert Mustacchi.\" This file and its contents are supplied under the terms of the
3177d5b5fSRobert Mustacchi.\" Common Development and Distribution License ("CDDL"), version 1.0.
4177d5b5fSRobert Mustacchi.\" You may only use this file in accordance with the terms of version
5177d5b5fSRobert Mustacchi.\" 1.0 of the CDDL.
6177d5b5fSRobert Mustacchi.\"
7177d5b5fSRobert Mustacchi.\" A full copy of the text of the CDDL should have accompanied this
8177d5b5fSRobert Mustacchi.\" source.  A copy of the CDDL is also available via the Internet at
9177d5b5fSRobert Mustacchi.\" http://www.illumos.org/license/CDDL.
10177d5b5fSRobert Mustacchi.\"
11177d5b5fSRobert Mustacchi.\"
128412fdadSRobert Mustacchi.\" Copyright 2015, Joyent, Inc.
13177d5b5fSRobert Mustacchi.\"
14843c398eSCody Peter Mello.Dd April 9, 2016
15177d5b5fSRobert Mustacchi.Dt SOCKADDR 3SOCKET
16177d5b5fSRobert Mustacchi.Os
17177d5b5fSRobert Mustacchi.Sh NAME
18177d5b5fSRobert Mustacchi.Nm sockaddr ,
19177d5b5fSRobert Mustacchi.Nm sockaddr_dl ,
20177d5b5fSRobert Mustacchi.Nm sockaddr_in ,
21177d5b5fSRobert Mustacchi.Nm sockaddr_in6 ,
22177d5b5fSRobert Mustacchi.Nm sockaddr_ll ,
23177d5b5fSRobert Mustacchi.Nm sockaddr_storage ,
24177d5b5fSRobert Mustacchi.Nm sockaddr_un
25177d5b5fSRobert Mustacchi.Nd Socket Address Structures
26177d5b5fSRobert Mustacchi.Sh SYNOPSIS
27177d5b5fSRobert Mustacchi.In sys/socket.h
28177d5b5fSRobert Mustacchi.Lp
29177d5b5fSRobert Mustacchi.Sy struct sockaddr
30177d5b5fSRobert Mustacchi.Em sock ;
31177d5b5fSRobert Mustacchi.Lp
32177d5b5fSRobert Mustacchi.In sys/socket.h
33177d5b5fSRobert Mustacchi.In net/if_dl.h
34177d5b5fSRobert Mustacchi.Lp
35177d5b5fSRobert Mustacchi.Sy struct sockaddr_dl
36177d5b5fSRobert Mustacchi.Em dl_sock ;
37177d5b5fSRobert Mustacchi.Lp
38177d5b5fSRobert Mustacchi.In sys/socket.h
39177d5b5fSRobert Mustacchi.In netinet/in.h
40177d5b5fSRobert Mustacchi.Lp
41177d5b5fSRobert Mustacchi.Sy struct sockaddr_in
42177d5b5fSRobert Mustacchi.Em in_sock ;
43177d5b5fSRobert Mustacchi.Lp
44177d5b5fSRobert Mustacchi.In sys/socket.h
458412fdadSRobert Mustacchi.In netinet/in.h
46177d5b5fSRobert Mustacchi.Lp
47177d5b5fSRobert Mustacchi.Sy struct sockaddr_in6
48177d5b5fSRobert Mustacchi.Em in6_sock ;
49177d5b5fSRobert Mustacchi.Lp
50177d5b5fSRobert Mustacchi.In sys/socket.h
51177d5b5fSRobert Mustacchi.Lp
52177d5b5fSRobert Mustacchi.Sy struct sockaddr_ll
53177d5b5fSRobert Mustacchi.Em ll_sock ;
54177d5b5fSRobert Mustacchi.Lp
55177d5b5fSRobert Mustacchi.In sys/socket.h
56177d5b5fSRobert Mustacchi.Lp
57177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage
58177d5b5fSRobert Mustacchi.Em storage_sock ;
59177d5b5fSRobert Mustacchi.Lp
60177d5b5fSRobert Mustacchi.In sys/un.h
61177d5b5fSRobert Mustacchi.Lp
62177d5b5fSRobert Mustacchi.Sy struct sockaddr_un
63177d5b5fSRobert Mustacchi.Em un_sock ;
64177d5b5fSRobert Mustacchi.Sh DESCRIPTION
65177d5b5fSRobert MustacchiThe
66177d5b5fSRobert Mustacchi.Nm
67177d5b5fSRobert Mustacchifamily of structures are designed to represent network addresses for
6872d3dbb9SYuri Pankovdifferent networking protocols.
6972d3dbb9SYuri PankovThe structure
70177d5b5fSRobert Mustacchi.Sy struct sockaddr
71177d5b5fSRobert Mustacchiis a generic structure that is used across calls to various socket
72177d5b5fSRobert Mustacchilibrary routines
73177d5b5fSRobert Mustacchi.Po
74177d5b5fSRobert Mustacchi.Xr libsocket 3LIB
75177d5b5fSRobert Mustacchi.Pc
76177d5b5fSRobert Mustacchisuch as
77177d5b5fSRobert Mustacchi.Xr accept 3SOCKET
78177d5b5fSRobert Mustacchiand
79177d5b5fSRobert Mustacchi.Xr bind 3SOCKET .
80177d5b5fSRobert MustacchiApplications do not use the
81177d5b5fSRobert Mustacchi.Sy struct sockaddr
82177d5b5fSRobert Mustacchidirectly, but instead cast the appropriate networking family specific
83177d5b5fSRobert Mustacchi.Nm
84177d5b5fSRobert Mustacchistructure to a
85177d5b5fSRobert Mustacchi.Sy struct sockaddr * .
86177d5b5fSRobert Mustacchi.Lp
87177d5b5fSRobert MustacchiEvery structure in the
88177d5b5fSRobert Mustacchi.Nm
89177d5b5fSRobert Mustacchifamily begins with a member of the same type, the
90177d5b5fSRobert Mustacchi.Sy sa_family_t ,
91177d5b5fSRobert Mustacchithough the different structures all have different names for the member.
92177d5b5fSRobert MustacchiFor example, the structure
93177d5b5fSRobert Mustacchi.Sy struct sockaddr
94177d5b5fSRobert Mustacchihas the following members defined:
95177d5b5fSRobert Mustacchi.Bd -literal -offset indent
96177d5b5fSRobert Mustacchisa_family_t	sa_family	/* address family */
97177d5b5fSRobert Mustacchichar		sa_data[]	/* socket address (variable-length data) */
98177d5b5fSRobert Mustacchi.Ed
99177d5b5fSRobert Mustacchi.Lp
100177d5b5fSRobert MustacchiThe member
101177d5b5fSRobert Mustacchi.Em sa_family
10272d3dbb9SYuri Pankovcorresponds to the socket family that's actually in use.
10372d3dbb9SYuri PankovThe following table describes the mapping between the address family and the
10472d3dbb9SYuri Pankovcorresponding socket structure that's used.
10572d3dbb9SYuri PankovNote that both the generic
106177d5b5fSRobert Mustacchi.Sy struct sockaddr
107177d5b5fSRobert Mustacchiand the
108177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage
10972d3dbb9SYuri Pankovare not included, because these are both generic structures.
11072d3dbb9SYuri PankovMore on the
111177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage
112177d5b5fSRobert Mustacchican be found in the next section.
113177d5b5fSRobert Mustacchi.Bl -column -offset indent ".Sy Socket Structure" ".Sy Address Family"
114177d5b5fSRobert Mustacchi.It Sy Socket Structure Ta Sy Address Family
115177d5b5fSRobert Mustacchi.It struct sockaddr_dl Ta AF_LINK
116177d5b5fSRobert Mustacchi.It struct sockaddr_in Ta AF_INET
117177d5b5fSRobert Mustacchi.It struct sockaddr_in6 Ta AF_INET6
118177d5b5fSRobert Mustacchi.It struct sockaddr_ll Ta AF_PACKET
119177d5b5fSRobert Mustacchi.It struct sockaddr_un Ta AF_UNIX
120177d5b5fSRobert Mustacchi.El
121177d5b5fSRobert Mustacchi.Ss struct sockaddr_storage
122177d5b5fSRobert MustacchiThe
123177d5b5fSRobert Mustacchi.Sy sockaddr_storage
124177d5b5fSRobert Mustacchistructure is a
125177d5b5fSRobert Mustacchi.Nm
12672d3dbb9SYuri Pankovthat is not associated with an address family.
12772d3dbb9SYuri PankovInstead, it is large enough to hold the contents of any of the other
128177d5b5fSRobert Mustacchi.Nm
12972d3dbb9SYuri Pankovstructures.
13072d3dbb9SYuri PankovIt can be used to embed sufficient storage for a
131177d5b5fSRobert Mustacchi.Sy sockaddr
132177d5b5fSRobert Mustacchiof any type within a larger structure.
133177d5b5fSRobert Mustacchi.Lp
13472d3dbb9SYuri PankovThe structure only has a single member defined.
13572d3dbb9SYuri PankovWhile there are other members that are used to pad out the size of the
136177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage ,
13772d3dbb9SYuri Pankovthey are not defined and must not be consumed.
13872d3dbb9SYuri PankovThe only valid member is:
139177d5b5fSRobert Mustacchi.Bd -literal -offset indent
140177d5b5fSRobert Mustacchisa_family_t	ss_family	/* address family */
141177d5b5fSRobert Mustacchi.Ed
142177d5b5fSRobert Mustacchi.Lp
143177d5b5fSRobert MustacchiFor example,
144177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage
145177d5b5fSRobert Mustacchiis useful when running a service that accepts traffic over both
146177d5b5fSRobert Mustacchi.Sy IPv4
147177d5b5fSRobert Mustacchiand
148177d5b5fSRobert Mustacchi.Sy IPv6
14972d3dbb9SYuri Pankovwhere it is common to use a single socket for both address families.
15072d3dbb9SYuri PankovIn that case, rather than guessing whether a
151177d5b5fSRobert Mustacchi.Sy struct sockaddr_in
152177d5b5fSRobert Mustacchior a
153177d5b5fSRobert Mustacchi.Sy struct sockaddr_in6
154177d5b5fSRobert Mustacchiis more appropriate, one can simply use a
155177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage
156177d5b5fSRobert Mustacchiand cast to the appropriate family-specific structure type based on the
157177d5b5fSRobert Mustacchivalue of the member
158177d5b5fSRobert Mustacchi.Em ss_family .
159177d5b5fSRobert Mustacchi.Ss struct sockaddr_in
160177d5b5fSRobert MustacchiThe
161177d5b5fSRobert Mustacchi.Sy sockaddr_in
162177d5b5fSRobert Mustacchiis the socket type which is used for for the Internet Protocol version
16372d3dbb9SYuri Pankovfour (IPv4).
16472d3dbb9SYuri PankovIt has the following members defined:
165177d5b5fSRobert Mustacchi.Bd -literal -offset indent
166177d5b5fSRobert Mustacchisa_family_t	sin_family	/* address family */
167177d5b5fSRobert Mustacchiin_port_t	sin_port	/* IP port */
168177d5b5fSRobert Mustacchistruct in_addr	sin_addr	/* IP address */
169177d5b5fSRobert Mustacchi.Ed
170177d5b5fSRobert Mustacchi.Lp
171177d5b5fSRobert MustacchiThe member
172177d5b5fSRobert Mustacchi.Em sin_family
173177d5b5fSRobert Mustacchimust always have the value
174177d5b5fSRobert Mustacchi.Sy AF_INET
175177d5b5fSRobert Mustacchifor
176177d5b5fSRobert Mustacchi.Sy IPv4 .
177177d5b5fSRobert MustacchiThe members
178177d5b5fSRobert Mustacchi.Em sin_port
179177d5b5fSRobert Mustacchiand
180177d5b5fSRobert Mustacchi.Em sin_addr
18172d3dbb9SYuri Pankovdescribe the IP address and IP port to use.
18272d3dbb9SYuri PankovIn the case of a call to
183177d5b5fSRobert Mustacchi.Xr connect 3SOCKET
184177d5b5fSRobert Mustacchithese represent the remote IP address and port to which the connection
18572d3dbb9SYuri Pankovis being made.
18672d3dbb9SYuri PankovIn the case of
187177d5b5fSRobert Mustacchi.Xr bind 3SOCKET
188177d5b5fSRobert Mustacchithese represent the IP address and port on the local host to which the socket
18972d3dbb9SYuri Pankovis to be bound.
19072d3dbb9SYuri PankovIn the case of
191177d5b5fSRobert Mustacchi.Xr accept 3SOCKET
192177d5b5fSRobert Mustacchithese represent the remote IP address and port of the machine whose
193177d5b5fSRobert Mustacchiconnection was accepted.
194177d5b5fSRobert Mustacchi.Lp
195177d5b5fSRobert MustacchiThe member
196177d5b5fSRobert Mustacchi.Em sin_port
197177d5b5fSRobert Mustacchiis always stored in
198177d5b5fSRobert Mustacchi.Sy Network Byte Order .
199177d5b5fSRobert MustacchiOn many systems, this differs from the native host byte order.
200177d5b5fSRobert MustacchiApplications should read from the member with the function
201cc581a18SYuri Pankov.Xr ntohs 3C
202177d5b5fSRobert Mustacchiand write to the member with the function
203cc581a18SYuri Pankov.Xr htons 3C .
204177d5b5fSRobert MustacchiThe member
205177d5b5fSRobert Mustacchi.Em sin_addr
20672d3dbb9SYuri Pankovis the four byte IPv4 address.
20772d3dbb9SYuri PankovIt is also stored in network byte order.
208177d5b5fSRobert MustacchiThe common way to write out the address is to use the function
2098a7aa2a5SYuri Pankov.Xr inet_pton 3C
210177d5b5fSRobert Mustacchiwhich converts between a human readable IP address such as "10.1.2.3"
211177d5b5fSRobert Mustacchiand the corresponding representation.
212177d5b5fSRobert Mustacchi.Lp
213177d5b5fSRobert MustacchiExample 1 shows how to prepare an IPv4 socket and deal with
21472d3dbb9SYuri Pankovnetwork byte-order.
21572d3dbb9SYuri PankovSee
216*bbf21555SRichard Lowe.Xr inet 4P
217177d5b5fSRobert Mustacchiand
218*bbf21555SRichard Lowe.Xr ip 4P
219177d5b5fSRobert Mustacchifor more information on IPv4, socket options, etc.
220177d5b5fSRobert Mustacchi.Ss struct sockaddr_in6
221177d5b5fSRobert MustacchiThe
222177d5b5fSRobert Mustacchi.Sy sockaddr_in6
223177d5b5fSRobert Mustacchistructure is the
224177d5b5fSRobert Mustacchi.Nm
22572d3dbb9SYuri Pankovfor the Internet Protocol version six (IPv6).
22672d3dbb9SYuri PankovUnlike the
227177d5b5fSRobert Mustacchi.Sy struct sockaddr_in ,
228177d5b5fSRobert Mustacchithe
229177d5b5fSRobert Mustacchi.Sy struct sockaddr_in6
230177d5b5fSRobert Mustacchihas additional members beyond those shown here which are required to be
231177d5b5fSRobert Mustacchiinitialized to zero through a function such as
232177d5b5fSRobert Mustacchi.Xr bzero 3C
233177d5b5fSRobert Mustacchior
234177d5b5fSRobert Mustacchi.Xr memset 3C .
235177d5b5fSRobert MustacchiIf the entire
236177d5b5fSRobert Mustacchi.Sy struct sockaddr_in6
23772d3dbb9SYuri Pankovis not zeroed before use, applications will experience undefined behavior.
23872d3dbb9SYuri PankovThe
239177d5b5fSRobert Mustacchi.Sy struct sockaddr_in6
240177d5b5fSRobert Mustacchihas the following public members:
241177d5b5fSRobert Mustacchi.Bd -literal -offset indent
242177d5b5fSRobert Mustacchisa_family_t	sin6_family	/* address family */
243177d5b5fSRobert Mustacchiin_port_t	sin6_port	/* IPv6 port */
244177d5b5fSRobert Mustacchistruct in6_addr	sin6_addr	/* IPv6 address */
245177d5b5fSRobert Mustacchiuint32_t	sin6_flowinfo;	/* traffic class and flow info */
246177d5b5fSRobert Mustacchiuint32_t	sin6_scope_id;	/* interface scope */
247177d5b5fSRobert Mustacchi.Ed
248177d5b5fSRobert Mustacchi.Lp
249177d5b5fSRobert MustacchiThe member
250177d5b5fSRobert Mustacchi.Em sin6_family
251177d5b5fSRobert Mustacchimust always have the value
252177d5b5fSRobert Mustacchi.Sy AF_INET6 .
253177d5b5fSRobert MustacchiThe members
254177d5b5fSRobert Mustacchi.Em sin6_port
255177d5b5fSRobert Mustacchiand
256177d5b5fSRobert Mustacchi.Em sin6_addr
257177d5b5fSRobert Mustacchiare the IPv6 equivalents of the
258177d5b5fSRobert Mustacchi.Sy struct sockaddr_in
259177d5b5fSRobert Mustacchi.Em sin_port
260177d5b5fSRobert Mustacchiand
261177d5b5fSRobert Mustacchi.Em sin_addr .
262177d5b5fSRobert MustacchiLike their IPv4 counterparts, both of these members must be in network
26372d3dbb9SYuri Pankovbyte order.
26472d3dbb9SYuri PankovThe member
265177d5b5fSRobert Mustacchi.Em sin6_port
266177d5b5fSRobert Mustacchidescribes the IPv6 port and should be manipulated with the functions
267cc581a18SYuri Pankov.Xr ntohs 3C
268177d5b5fSRobert Mustacchiand
269cc581a18SYuri Pankov.Xr htons 3C .
270177d5b5fSRobert MustacchiThe member
271177d5b5fSRobert Mustacchi.Em sin6_addr
27272d3dbb9SYuri Pankovdescribes the 16-byte IPv6 address.
27372d3dbb9SYuri PankovIn addition to the function
2748a7aa2a5SYuri Pankov.Xr inet_pton 3C ,
275177d5b5fSRobert Mustacchithe header file
276177d5b5fSRobert Mustacchi.In netinet/in.h
277177d5b5fSRobert Mustacchidefines many macros for manipulating and testing IPv6 addresses.
278177d5b5fSRobert Mustacchi.Lp
279177d5b5fSRobert MustacchiThe member
280177d5b5fSRobert Mustacchi.Em sin6_flowinfo
281177d5b5fSRobert Mustacchicontains the traffic class and flow label associated with the IPv6
28272d3dbb9SYuri Pankovheader.
28372d3dbb9SYuri PankovThe member
284177d5b5fSRobert Mustacchi.Em sin6_scope_id
285177d5b5fSRobert Mustacchimay contain an identifier which varies based on the scope of the address
286177d5b5fSRobert Mustacchiin
287177d5b5fSRobert Mustacchi.Em sin6_addr .
288177d5b5fSRobert MustacchiApplications do not need to initialize
289177d5b5fSRobert Mustacchi.Em sin6_scope_id ;
290177d5b5fSRobert Mustacchiit will be populated by the operating system as a result of various library
291177d5b5fSRobert Mustacchicalls.
292177d5b5fSRobert Mustacchi.Lp
29372d3dbb9SYuri PankovExample 2 shows how to prepare an IPv6 socket.
29472d3dbb9SYuri PankovFor more information on
295177d5b5fSRobert MustacchiIPv6, please see
296*bbf21555SRichard Lowe.Xr inet6 4P
297177d5b5fSRobert Mustacchiand
298*bbf21555SRichard Lowe.Xr ip6 4P .
299177d5b5fSRobert Mustacchi.Ss struct sockaddr_un
300177d5b5fSRobert MustacchiThe
301177d5b5fSRobert Mustacchi.Sy sockaddr_un
302177d5b5fSRobert Mustacchistructure specifies the address of a socket used to communicate between
303177d5b5fSRobert Mustacchiprocesses running on a single system, commonly known as a
304177d5b5fSRobert Mustacchi.Em UNIX domain socket .
30572d3dbb9SYuri PankovSockets of this type are identified by a path in the file system.
30672d3dbb9SYuri PankovThe
307177d5b5fSRobert Mustacchi.Sy struct sockaddr_un
308177d5b5fSRobert Mustacchihas the following members:
309177d5b5fSRobert Mustacchi.Bd -literal -offset indent
310177d5b5fSRobert Mustacchisa_family_t	sun_family	/* address family */
311177d5b5fSRobert Mustacchichar		sun_path[108]	/* path name */
312177d5b5fSRobert Mustacchi.Ed
313177d5b5fSRobert Mustacchi.Lp
314177d5b5fSRobert MustacchiThe member
315177d5b5fSRobert Mustacchi.Em sun_family
316177d5b5fSRobert Mustacchimust always have the value
317177d5b5fSRobert Mustacchi.Sy AF_UNIX .
318177d5b5fSRobert MustacchiThe member
319177d5b5fSRobert Mustacchi.Em sun_path
320177d5b5fSRobert Mustacchiis populated with a
321177d5b5fSRobert Mustacchi.Sy NUL
32272d3dbb9SYuri Pankovterminated array of characters that specify a file system path.
32372d3dbb9SYuri PankovThe maximum length of any such path, including the
324177d5b5fSRobert Mustacchi.Sy NUL
325177d5b5fSRobert Mustacchiterminator, is 108 bytes.
326177d5b5fSRobert Mustacchi.Ss struct sockaddr_dl
327177d5b5fSRobert MustacchiThe
328177d5b5fSRobert Mustacchi.Sy sockaddr_dl
32972d3dbb9SYuri Pankovstructure is used to describe a layer 2 link-level address.
33072d3dbb9SYuri PankovThis is used as part of various socket ioctls, such as those for
331*bbf21555SRichard Lowe.Xr arp 4P .
332177d5b5fSRobert MustacchiThe structure has the following members:
333177d5b5fSRobert Mustacchi.Bd -literal -offset indent
334177d5b5fSRobert Mustacchiushort_t	sdl_family;	/* address family */
335177d5b5fSRobert Mustacchiushort_t	sdl_index;	/* if != 0, system interface index */
336177d5b5fSRobert Mustacchiuchar_t		sdl_type;	/* interface type */
337177d5b5fSRobert Mustacchiuchar_t		sdl_nlen;	/* interface name length */
338177d5b5fSRobert Mustacchiuchar_t		sdl_alen;	/* link level address length */
339177d5b5fSRobert Mustacchiuchar_t		sdl_slen;	/* link layer selector length */
340177d5b5fSRobert Mustacchichar		sdl_data[244];	/* contains both if name and ll address
341177d5b5fSRobert Mustacchi.Ed
342177d5b5fSRobert Mustacchi.Lp
343177d5b5fSRobert MustacchiThe member
344177d5b5fSRobert Mustacchi.Em sdl_family
345177d5b5fSRobert Mustacchimust always have the value
346177d5b5fSRobert Mustacchi.Sy AF_LINK .
347177d5b5fSRobert MustacchiWhen the member
348177d5b5fSRobert Mustacchi.Em sdl_index
349177d5b5fSRobert Mustacchiis non-zero this refers to the interface identifier that corresponds to
350177d5b5fSRobert Mustacchithe
351177d5b5fSRobert Mustacchi.Sy struct sockaddr_dl .
352177d5b5fSRobert MustacchiThis identifier is the same identifier that's shown by tools like
353*bbf21555SRichard Lowe.Xr ifconfig 8
35472d3dbb9SYuri Pankovand used in the SIOC* set of socket ioctls.
35572d3dbb9SYuri PankovThe member
356177d5b5fSRobert Mustacchi.Em sdl_type
35772d3dbb9SYuri Pankovrefers to the media that is used for the socket.
35872d3dbb9SYuri PankovThe most common case is that the medium for the interface is Ethernet which has
35972d3dbb9SYuri Pankovthe value
360177d5b5fSRobert Mustacchi.Sy IFT_ETHER .
361177d5b5fSRobert MustacchiThe full set of types is derived from RFC1573 and recorded in the file
362177d5b5fSRobert Mustacchi.In net/if_types.h .
363177d5b5fSRobert MustacchiThe member
364177d5b5fSRobert Mustacchi.Em sdl_slen
365177d5b5fSRobert Mustacchidescribes the length of a selector, if it exists, for the specified
36672d3dbb9SYuri Pankovmedium.
36772d3dbb9SYuri PankovThis is used in protocols such as Trill.
368177d5b5fSRobert Mustacchi.Lp
369177d5b5fSRobert MustacchiThe
370177d5b5fSRobert Mustacchi.Em sdl_data ,
371177d5b5fSRobert Mustacchi.Em sdl_nlen
372177d5b5fSRobert Mustacchiand
373177d5b5fSRobert Mustacchi.Em sdl_alen
374177d5b5fSRobert Mustacchimembers together describe a character string containing the interface name and
37572d3dbb9SYuri Pankovthe link-layer network address.
37672d3dbb9SYuri PankovThe name starts at the beginning of
377177d5b5fSRobert Mustacchi.Em sdl_data ,
378177d5b5fSRobert Mustacchii.e. at
379177d5b5fSRobert Mustacchi.Em sdl_data[0] .
380177d5b5fSRobert MustacchiThe name of the interface occupies the next
381177d5b5fSRobert Mustacchi.Em sdl_nlen
382177d5b5fSRobert Mustacchibytes and is not
383177d5b5fSRobert Mustacchi.Sy NUL
38472d3dbb9SYuri Pankovterminated.
38572d3dbb9SYuri PankovThe link-layer network address begins immediately after the interface name,
38672d3dbb9SYuri Pankovand is
387177d5b5fSRobert Mustacchi.Em sdl_alen
38872d3dbb9SYuri Pankovbytes long.
38972d3dbb9SYuri PankovThe macro
390177d5b5fSRobert Mustacchi.Sy LLADDR(struct sockaddr_dl *)
391177d5b5fSRobert Mustacchireturns the start of the link-layer network address.
392177d5b5fSRobert MustacchiThe interpretation of the link-layer address depends on the value of
393177d5b5fSRobert Mustacchi.Em sdl_type .
394177d5b5fSRobert MustacchiFor example, if the type is
395177d5b5fSRobert Mustacchi.Sy IFT_ETHER
396177d5b5fSRobert Mustacchithen the address is expressed as a 6-byte MAC address.
397177d5b5fSRobert Mustacchi.Ss struct sockaddr_ll
398177d5b5fSRobert MustacchiThe
399177d5b5fSRobert Mustacchi.Sy sockaddr_ll
400177d5b5fSRobert Mustacchiis used as part of a socket type which is responsible for packet
401177d5b5fSRobert Mustacchicapture:
402177d5b5fSRobert Mustacchi.Sy AF_PACKET
40372d3dbb9SYuri Pankovsockets.
40472d3dbb9SYuri PankovIt is generally designed for use with Ethernet networks.
40572d3dbb9SYuri PankovThe members of the
406177d5b5fSRobert Mustacchi.Sy struct sockaddr_ll
407177d5b5fSRobert Mustacchiare:
408177d5b5fSRobert Mustacchi.Bd -literal -offset indent
409177d5b5fSRobert Mustacchiuint16_t        sll_family;	/* address family */
410177d5b5fSRobert Mustacchiuint16_t        sll_protocol;	/* link layer protocol */
411177d5b5fSRobert Mustacchiint32_t         sll_ifindex;	/* interface index */
412177d5b5fSRobert Mustacchiuint16_t        sll_hatype;	/* ARP hardware type */
413177d5b5fSRobert Mustacchiuint8_t         sll_pkttype;	/* packet type */
414177d5b5fSRobert Mustacchiuint8_t         sll_halen;	/* hardware address length */
415177d5b5fSRobert Mustacchiuint8_t         sll_addr[8];	/* hardware type */
416177d5b5fSRobert Mustacchi.Ed
417177d5b5fSRobert Mustacchi.Lp
418177d5b5fSRobert MustacchiThe member
419177d5b5fSRobert Mustacchi.Em sll_family
420177d5b5fSRobert Mustacchimust be
421177d5b5fSRobert Mustacchi.Sy AF_PACKET .
422177d5b5fSRobert MustacchiThe member
423177d5b5fSRobert Mustacchi.Em sll_protocol
42472d3dbb9SYuri Pankovrefers to a link-layer protocol.
42572d3dbb9SYuri PankovFor example, when capturing Ethernet frames the value of
426177d5b5fSRobert Mustacchi.Em sll_protocol
42772d3dbb9SYuri Pankovis the Ethertype.
42872d3dbb9SYuri PankovThis member is written in network byte order and applications should use
429cc581a18SYuri Pankov.Xr htons 3C
430177d5b5fSRobert Mustacchiand
431cc581a18SYuri Pankov.Xr ntohs 3C
432177d5b5fSRobert Mustacchito read and write the member.
433177d5b5fSRobert Mustacchi.Lp
434177d5b5fSRobert MustacchiThe member
435177d5b5fSRobert Mustacchi.Em sll_ifindex
43672d3dbb9SYuri Pankovis the interface's index.
43772d3dbb9SYuri PankovIt is used as an identifier in various ioctls and included in the output of
438*bbf21555SRichard Lowe.Xr ifconfig 8 .
439177d5b5fSRobert MustacchiWhen calling
440177d5b5fSRobert Mustacchi.Xr bind 3SOCKET
441177d5b5fSRobert Mustacchiit should be filled in with the index that corresponds to the interface
442177d5b5fSRobert Mustacchifor which packets should be captured on.
443177d5b5fSRobert Mustacchi.Lp
444177d5b5fSRobert MustacchiThe member
445177d5b5fSRobert Mustacchi.Em sll_pkttype
446177d5b5fSRobert Mustacchidescribes the type of the packet based on a list of types in the header
447177d5b5fSRobert Mustacchifile
448177d5b5fSRobert Mustacchi.In netpacket/packet.h .
449177d5b5fSRobert MustacchiThese types include:
450177d5b5fSRobert Mustacchi.Sy PACKET_OUTGOING ,
451177d5b5fSRobert Mustacchia packet that was leaving the host and has been looped back for packet capture;
452177d5b5fSRobert Mustacchi.Sy PACKET_HOST ,
453177d5b5fSRobert Mustacchia packet that was destined for this host;
454177d5b5fSRobert Mustacchi.Sy PACKET_BROADCAST ,
455177d5b5fSRobert Mustacchia packet that was broadcast across the link-layer;
456177d5b5fSRobert Mustacchi.Sy PACKET_MULTICAST ,
457177d5b5fSRobert Mustacchia packet that was sent to a link-layer multicast address; and
458177d5b5fSRobert Mustacchi.Sy PACKET_OTHERHOST ,
459177d5b5fSRobert Mustacchia packet that was captured only because the device in question was in
460177d5b5fSRobert Mustacchipromiscuous mode.
461177d5b5fSRobert Mustacchi.Lp
462177d5b5fSRobert MustacchiThe member
463177d5b5fSRobert Mustacchi.Em sll_hatype
464177d5b5fSRobert Mustacchicontains the hardware type as defined by
465*bbf21555SRichard Lowe.Xr arp 4P .
466177d5b5fSRobert MustacchiThe list of types can be found in
467177d5b5fSRobert Mustacchi.In net/if_arp.h .
468177d5b5fSRobert MustacchiThe member
469177d5b5fSRobert Mustacchi.Em sll_halen
470177d5b5fSRobert Mustacchicontains the length, in bytes, of the hardware address, while the member
471177d5b5fSRobert Mustacchi.Em sll_addr
472177d5b5fSRobert Mustacchicontains the actual address in network byte order.
473177d5b5fSRobert Mustacchi.Sh EXAMPLES
474177d5b5fSRobert Mustacchi.Sy Example 1
475177d5b5fSRobert MustacchiPreparing an IPv4
476177d5b5fSRobert Mustacchi.Sy sockaddr_in
477177d5b5fSRobert Mustacchito connect to a remote host
478177d5b5fSRobert Mustacchi.Lp
479177d5b5fSRobert MustacchiThe following example shows how one would open a socket and prepare it
480177d5b5fSRobert Mustacchito connect to the remote host whose address is the IP address 127.0.0.1
48172d3dbb9SYuri Pankovon port 80.
48272d3dbb9SYuri PankovThis program should be compiled with the C compiler
483177d5b5fSRobert Mustacchi.Sy cc
48472d3dbb9SYuri Pankovand linked against the libraries libsocket and libnsl.
48572d3dbb9SYuri PankovIf this example was named ip4.c, then the full link line would be
486177d5b5fSRobert Mustacchi.Ic cc ip4.c -lsocket -lnsl .
487177d5b5fSRobert Mustacchi.Bd -literal
488177d5b5fSRobert Mustacchi#include <sys/types.h>
489177d5b5fSRobert Mustacchi#include <sys/socket.h>
490177d5b5fSRobert Mustacchi#include <stdio.h>
491177d5b5fSRobert Mustacchi#include <netinet/in.h>
492177d5b5fSRobert Mustacchi#include <inttypes.h>
493177d5b5fSRobert Mustacchi#include <strings.h>
494177d5b5fSRobert Mustacchi
495177d5b5fSRobert Mustacchiint
496177d5b5fSRobert Mustacchimain(void)
497177d5b5fSRobert Mustacchi{
498177d5b5fSRobert Mustacchi	int sock;
499177d5b5fSRobert Mustacchi	struct sockaddr_in in;
500177d5b5fSRobert Mustacchi
501177d5b5fSRobert Mustacchi	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
502177d5b5fSRobert Mustacchi		perror("socket");
503177d5b5fSRobert Mustacchi		return (1);
504177d5b5fSRobert Mustacchi	}
505177d5b5fSRobert Mustacchi
506177d5b5fSRobert Mustacchi	bzero(&in, sizeof (struct sockaddr_in));
507177d5b5fSRobert Mustacchi	in.sin_family = AF_INET;
508177d5b5fSRobert Mustacchi	in.sin_port = htons(80);
509177d5b5fSRobert Mustacchi	if (inet_pton(AF_INET, "127.0.0.1", &in.sin_addr) != 1) {
510177d5b5fSRobert Mustacchi		perror("inet_pton");
511177d5b5fSRobert Mustacchi		return (1);
512177d5b5fSRobert Mustacchi	}
513177d5b5fSRobert Mustacchi
514177d5b5fSRobert Mustacchi	if (connect(sock, (struct sockaddr *)&in,
515177d5b5fSRobert Mustacchi	    sizeof (struct sockaddr_in)) != 0) {
516177d5b5fSRobert Mustacchi		perror("connect");
517177d5b5fSRobert Mustacchi		return (1);
518177d5b5fSRobert Mustacchi	}
519177d5b5fSRobert Mustacchi
520177d5b5fSRobert Mustacchi	/* use socket */
521177d5b5fSRobert Mustacchi
522177d5b5fSRobert Mustacchi	return (0);
523177d5b5fSRobert Mustacchi}
524177d5b5fSRobert Mustacchi.Ed
525177d5b5fSRobert Mustacchi.Lp
526177d5b5fSRobert Mustacchi.Sy Example 2
527177d5b5fSRobert MustacchiPreparing an IPv6
528177d5b5fSRobert Mustacchi.Sy sockaddr_in6
529177d5b5fSRobert Mustacchito bind to a local address
530177d5b5fSRobert Mustacchi.Lp
531177d5b5fSRobert MustacchiThe following example shows how one would open a socket and prepare it
53272d3dbb9SYuri Pankovto bind to the local IPv6 address ::1 port on port 12345.
53372d3dbb9SYuri PankovThis program should be compiled with the C compiler
534177d5b5fSRobert Mustacchi.Sy cc
53572d3dbb9SYuri Pankovand linked against the libraries libsocket and libnsl.
53672d3dbb9SYuri PankovIf this example was named ip6.c, then the full compiler line would be
537177d5b5fSRobert Mustacchi.Ic cc ip6.c -lsocket -lnsl .
538177d5b5fSRobert Mustacchi.Bd -literal
539177d5b5fSRobert Mustacchi#include <sys/types.h>
540177d5b5fSRobert Mustacchi#include <sys/socket.h>
541177d5b5fSRobert Mustacchi#include <stdio.h>
542177d5b5fSRobert Mustacchi#include <netinet/in.h>
543177d5b5fSRobert Mustacchi#include <inttypes.h>
544177d5b5fSRobert Mustacchi#include <strings.h>
545177d5b5fSRobert Mustacchi
546177d5b5fSRobert Mustacchiint
547177d5b5fSRobert Mustacchimain(void)
548177d5b5fSRobert Mustacchi{
549177d5b5fSRobert Mustacchi	int sock6;
550177d5b5fSRobert Mustacchi	struct sockaddr_in6 in6;
551177d5b5fSRobert Mustacchi
552177d5b5fSRobert Mustacchi	if ((sock6 = socket(AF_INET6, SOCK_STREAM, 0)) < 0) {
553177d5b5fSRobert Mustacchi		perror("socket");
554177d5b5fSRobert Mustacchi		return (1);
555177d5b5fSRobert Mustacchi	}
556177d5b5fSRobert Mustacchi
557177d5b5fSRobert Mustacchi	bzero(&in6, sizeof (struct sockaddr_in6));
558177d5b5fSRobert Mustacchi	in6.sin6_family = AF_INET6;
559177d5b5fSRobert Mustacchi	in6.sin6_port = htons(12345);
560177d5b5fSRobert Mustacchi	if (inet_pton(AF_INET6, "::1", &in6.sin6_addr) != 1) {
561177d5b5fSRobert Mustacchi		perror("inet_pton");
562177d5b5fSRobert Mustacchi		return (1);
563177d5b5fSRobert Mustacchi	}
564177d5b5fSRobert Mustacchi
565177d5b5fSRobert Mustacchi	if (bind(sock6, (struct sockaddr *)&in6,
566177d5b5fSRobert Mustacchi	    sizeof (struct sockaddr_in6)) != 0) {
567177d5b5fSRobert Mustacchi		perror("bind");
568177d5b5fSRobert Mustacchi		return (1);
569177d5b5fSRobert Mustacchi	}
570177d5b5fSRobert Mustacchi
571177d5b5fSRobert Mustacchi	/* use server socket */
572177d5b5fSRobert Mustacchi
573177d5b5fSRobert Mustacchi	return (0);
574177d5b5fSRobert Mustacchi}
575177d5b5fSRobert Mustacchi.Ed
576177d5b5fSRobert Mustacchi.Sh SEE ALSO
577177d5b5fSRobert Mustacchi.Xr socket 3HEAD ,
578b31ca922SChris Fraire.Xr un.h 3HEAD ,
579177d5b5fSRobert Mustacchi.Xr accept 3SOCKET ,
580177d5b5fSRobert Mustacchi.Xr bind 3SOCKET ,
581177d5b5fSRobert Mustacchi.Xr connect 3SOCKET ,
582177d5b5fSRobert Mustacchi.Xr socket 3SOCKET ,
583*bbf21555SRichard Lowe.Xr arp 4P ,
584*bbf21555SRichard Lowe.Xr inet 4P ,
585*bbf21555SRichard Lowe.Xr inet6 4P ,
586*bbf21555SRichard Lowe.Xr ip 4P ,
587*bbf21555SRichard Lowe.Xr ip6 4P
588