xref: /titanic_52/usr/src/man/man3socket/sockaddr.3socket (revision 3a005aada8ac0e291c13cbc488ba9ae1473f0a96)
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.\"
148412fdadSRobert Mustacchi.Dd May 18, 2015
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
68177d5b5fSRobert Mustacchidifferent networking protocols. The structure
69177d5b5fSRobert Mustacchi.Sy struct sockaddr
70177d5b5fSRobert Mustacchiis a generic structure that is used across calls to various socket
71177d5b5fSRobert Mustacchilibrary routines
72177d5b5fSRobert Mustacchi.Po
73177d5b5fSRobert Mustacchi.Xr libsocket 3LIB
74177d5b5fSRobert Mustacchi.Pc
75177d5b5fSRobert Mustacchisuch as
76177d5b5fSRobert Mustacchi.Xr accept 3SOCKET
77177d5b5fSRobert Mustacchiand
78177d5b5fSRobert Mustacchi.Xr bind 3SOCKET .
79177d5b5fSRobert MustacchiApplications do not use the
80177d5b5fSRobert Mustacchi.Sy struct sockaddr
81177d5b5fSRobert Mustacchidirectly, but instead cast the appropriate networking family specific
82177d5b5fSRobert Mustacchi.Nm
83177d5b5fSRobert Mustacchistructure to a
84177d5b5fSRobert Mustacchi.Sy struct sockaddr * .
85177d5b5fSRobert Mustacchi.Lp
86177d5b5fSRobert MustacchiEvery structure in the
87177d5b5fSRobert Mustacchi.Nm
88177d5b5fSRobert Mustacchifamily begins with a member of the same type, the
89177d5b5fSRobert Mustacchi.Sy sa_family_t ,
90177d5b5fSRobert Mustacchithough the different structures all have different names for the member.
91177d5b5fSRobert MustacchiFor example, the structure
92177d5b5fSRobert Mustacchi.Sy struct sockaddr
93177d5b5fSRobert Mustacchihas the following members defined:
94177d5b5fSRobert Mustacchi.Bd -literal -offset indent
95177d5b5fSRobert Mustacchisa_family_t	sa_family	/* address family */
96177d5b5fSRobert Mustacchichar		sa_data[]	/* socket address (variable-length data) */
97177d5b5fSRobert Mustacchi.Ed
98177d5b5fSRobert Mustacchi.Lp
99177d5b5fSRobert MustacchiThe member
100177d5b5fSRobert Mustacchi.Em sa_family
101177d5b5fSRobert Mustacchicorresponds to the socket family that's actually in use. The following
102177d5b5fSRobert Mustacchitable describes the mapping between the address family and the
103177d5b5fSRobert Mustacchicorresponding socket structure that's used. Note that both the generic
104177d5b5fSRobert Mustacchi.Sy struct sockaddr
105177d5b5fSRobert Mustacchiand the
106177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage
107177d5b5fSRobert Mustacchiare not included, because these are both generic structures. More on the
108177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage
109177d5b5fSRobert Mustacchican be found in the next section.
110177d5b5fSRobert Mustacchi.Bl -column -offset indent ".Sy Socket Structure" ".Sy Address Family"
111177d5b5fSRobert Mustacchi.It Sy Socket Structure Ta Sy Address Family
112177d5b5fSRobert Mustacchi.It struct sockaddr_dl Ta AF_LINK
113177d5b5fSRobert Mustacchi.It struct sockaddr_in Ta AF_INET
114177d5b5fSRobert Mustacchi.It struct sockaddr_in6 Ta AF_INET6
115177d5b5fSRobert Mustacchi.It struct sockaddr_ll Ta AF_PACKET
116177d5b5fSRobert Mustacchi.It struct sockaddr_un Ta AF_UNIX
117177d5b5fSRobert Mustacchi.El
118177d5b5fSRobert Mustacchi.Ss struct sockaddr_storage
119177d5b5fSRobert MustacchiThe
120177d5b5fSRobert Mustacchi.Sy sockaddr_storage
121177d5b5fSRobert Mustacchistructure is a
122177d5b5fSRobert Mustacchi.Nm
123177d5b5fSRobert Mustacchithat is not associated with an address family. Instead, it is large
124177d5b5fSRobert Mustacchienough to hold the contents of any of the other
125177d5b5fSRobert Mustacchi.Nm
126177d5b5fSRobert Mustacchistructures. It can be used to embed sufficient storage for a
127177d5b5fSRobert Mustacchi.Sy sockaddr
128177d5b5fSRobert Mustacchiof any type within a larger structure.
129177d5b5fSRobert Mustacchi.Lp
130177d5b5fSRobert MustacchiThe structure only has a single member defined. While there are other
131177d5b5fSRobert Mustacchimembers that are used to pad out the size of the
132177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage ,
133177d5b5fSRobert Mustacchithey are not defined and must not be consumed. The only valid
134177d5b5fSRobert Mustacchimember is:
135177d5b5fSRobert Mustacchi.Bd -literal -offset indent
136177d5b5fSRobert Mustacchisa_family_t	ss_family	/* address family */
137177d5b5fSRobert Mustacchi.Ed
138177d5b5fSRobert Mustacchi.Lp
139177d5b5fSRobert MustacchiFor example,
140177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage
141177d5b5fSRobert Mustacchiis useful when running a service that accepts traffic over both
142177d5b5fSRobert Mustacchi.Sy IPv4
143177d5b5fSRobert Mustacchiand
144177d5b5fSRobert Mustacchi.Sy IPv6
145177d5b5fSRobert Mustacchiwhere it is common to use a single socket for both address families. In that
146177d5b5fSRobert Mustacchicase, rather than guessing whether a
147177d5b5fSRobert Mustacchi.Sy struct sockaddr_in
148177d5b5fSRobert Mustacchior a
149177d5b5fSRobert Mustacchi.Sy struct sockaddr_in6
150177d5b5fSRobert Mustacchiis more appropriate, one can simply use a
151177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage
152177d5b5fSRobert Mustacchiand cast to the appropriate family-specific structure type based on the
153177d5b5fSRobert Mustacchivalue of the member
154177d5b5fSRobert Mustacchi.Em ss_family .
155177d5b5fSRobert Mustacchi.Ss struct sockaddr_in
156177d5b5fSRobert MustacchiThe
157177d5b5fSRobert Mustacchi.Sy sockaddr_in
158177d5b5fSRobert Mustacchiis the socket type which is used for for the Internet Protocol version
159177d5b5fSRobert Mustacchifour (IPv4). It has the following members defined:
160177d5b5fSRobert Mustacchi.Bd -literal -offset indent
161177d5b5fSRobert Mustacchisa_family_t	sin_family	/* address family */
162177d5b5fSRobert Mustacchiin_port_t	sin_port	/* IP port */
163177d5b5fSRobert Mustacchistruct in_addr	sin_addr	/* IP address */
164177d5b5fSRobert Mustacchi.Ed
165177d5b5fSRobert Mustacchi.Lp
166177d5b5fSRobert MustacchiThe member
167177d5b5fSRobert Mustacchi.Em sin_family
168177d5b5fSRobert Mustacchimust always have the value
169177d5b5fSRobert Mustacchi.Sy AF_INET
170177d5b5fSRobert Mustacchifor
171177d5b5fSRobert Mustacchi.Sy IPv4 .
172177d5b5fSRobert MustacchiThe members
173177d5b5fSRobert Mustacchi.Em sin_port
174177d5b5fSRobert Mustacchiand
175177d5b5fSRobert Mustacchi.Em sin_addr
176177d5b5fSRobert Mustacchidescribe the IP address and IP port to use. In the case of a call to
177177d5b5fSRobert Mustacchi.Xr connect 3SOCKET
178177d5b5fSRobert Mustacchithese represent the remote IP address and port to which the connection
179177d5b5fSRobert Mustacchiis being made. In the case of
180177d5b5fSRobert Mustacchi.Xr bind 3SOCKET
181177d5b5fSRobert Mustacchithese represent the IP address and port on the local host to which the socket
182177d5b5fSRobert Mustacchiis to be bound. In the case of
183177d5b5fSRobert Mustacchi.Xr accept 3SOCKET
184177d5b5fSRobert Mustacchithese represent the remote IP address and port of the machine whose
185177d5b5fSRobert Mustacchiconnection was accepted.
186177d5b5fSRobert Mustacchi.Lp
187177d5b5fSRobert MustacchiThe member
188177d5b5fSRobert Mustacchi.Em sin_port
189177d5b5fSRobert Mustacchiis always stored in
190177d5b5fSRobert Mustacchi.Sy Network Byte Order .
191177d5b5fSRobert MustacchiOn many systems, this differs from the native host byte order.
192177d5b5fSRobert MustacchiApplications should read from the member with the function
193177d5b5fSRobert Mustacchi.Xr ntohs 3SOCKET
194177d5b5fSRobert Mustacchiand write to the member with the function
195177d5b5fSRobert Mustacchi.Xr htons 3SOCKET .
196177d5b5fSRobert MustacchiThe member
197177d5b5fSRobert Mustacchi.Em sin_addr
198177d5b5fSRobert Mustacchiis the four byte IPv4 address. It is also stored in network byte order.
199177d5b5fSRobert MustacchiThe common way to write out the address is to use the function
200177d5b5fSRobert Mustacchi.Xr inet_pton 3SOCKET
201177d5b5fSRobert Mustacchiwhich converts between a human readable IP address such as "10.1.2.3"
202177d5b5fSRobert Mustacchiand the corresponding representation.
203177d5b5fSRobert Mustacchi.Lp
204177d5b5fSRobert MustacchiExample 1 shows how to prepare an IPv4 socket and deal with
205177d5b5fSRobert Mustacchinetwork byte-order. See
206177d5b5fSRobert Mustacchi.Xr inet 7P
207177d5b5fSRobert Mustacchiand
208177d5b5fSRobert Mustacchi.Xr ip 7P
209177d5b5fSRobert Mustacchifor more information on IPv4, socket options, etc.
210177d5b5fSRobert Mustacchi.Ss struct sockaddr_in6
211177d5b5fSRobert MustacchiThe
212177d5b5fSRobert Mustacchi.Sy sockaddr_in6
213177d5b5fSRobert Mustacchistructure is the
214177d5b5fSRobert Mustacchi.Nm
215177d5b5fSRobert Mustacchifor the Internet Protocol version six (IPv6). Unlike the
216177d5b5fSRobert Mustacchi.Sy struct sockaddr_in ,
217177d5b5fSRobert Mustacchithe
218177d5b5fSRobert Mustacchi.Sy struct sockaddr_in6
219177d5b5fSRobert Mustacchihas additional members beyond those shown here which are required to be
220177d5b5fSRobert Mustacchiinitialized to zero through a function such as
221177d5b5fSRobert Mustacchi.Xr bzero 3C
222177d5b5fSRobert Mustacchior
223177d5b5fSRobert Mustacchi.Xr memset 3C .
224177d5b5fSRobert MustacchiIf the entire
225177d5b5fSRobert Mustacchi.Sy struct sockaddr_in6
226177d5b5fSRobert Mustacchiis not zeroed before use, applications will experience undefined behavior. The
227177d5b5fSRobert Mustacchi.Sy struct sockaddr_in6
228177d5b5fSRobert Mustacchihas the following public members:
229177d5b5fSRobert Mustacchi.Bd -literal -offset indent
230177d5b5fSRobert Mustacchisa_family_t	sin6_family	/* address family */
231177d5b5fSRobert Mustacchiin_port_t	sin6_port	/* IPv6 port */
232177d5b5fSRobert Mustacchistruct in6_addr	sin6_addr	/* IPv6 address */
233177d5b5fSRobert Mustacchiuint32_t	sin6_flowinfo;	/* traffic class and flow info */
234177d5b5fSRobert Mustacchiuint32_t	sin6_scope_id;	/* interface scope */
235177d5b5fSRobert Mustacchi.Ed
236177d5b5fSRobert Mustacchi.Lp
237177d5b5fSRobert MustacchiThe member
238177d5b5fSRobert Mustacchi.Em sin6_family
239177d5b5fSRobert Mustacchimust always have the value
240177d5b5fSRobert Mustacchi.Sy AF_INET6 .
241177d5b5fSRobert MustacchiThe members
242177d5b5fSRobert Mustacchi.Em sin6_port
243177d5b5fSRobert Mustacchiand
244177d5b5fSRobert Mustacchi.Em sin6_addr
245177d5b5fSRobert Mustacchiare the IPv6 equivalents of the
246177d5b5fSRobert Mustacchi.Sy struct sockaddr_in
247177d5b5fSRobert Mustacchi.Em sin_port
248177d5b5fSRobert Mustacchiand
249177d5b5fSRobert Mustacchi.Em sin_addr .
250177d5b5fSRobert MustacchiLike their IPv4 counterparts, both of these members must be in network
251177d5b5fSRobert Mustacchibyte order. The member
252177d5b5fSRobert Mustacchi.Em sin6_port
253177d5b5fSRobert Mustacchidescribes the IPv6 port and should be manipulated with the functions
254177d5b5fSRobert Mustacchi.Xr ntohs 3SOCKET
255177d5b5fSRobert Mustacchiand
256177d5b5fSRobert Mustacchi.Xr htons 3SOCKET .
257177d5b5fSRobert MustacchiThe member
258177d5b5fSRobert Mustacchi.Em sin6_addr
259177d5b5fSRobert Mustacchidescribes the 16-byte IPv6 address. In addition to the function
260177d5b5fSRobert Mustacchi.Xr inet_pton 3SOCKET ,
261177d5b5fSRobert Mustacchithe header file
262177d5b5fSRobert Mustacchi.In netinet/in.h
263177d5b5fSRobert Mustacchidefines many macros for manipulating and testing IPv6 addresses.
264177d5b5fSRobert Mustacchi.Lp
265177d5b5fSRobert MustacchiThe member
266177d5b5fSRobert Mustacchi.Em sin6_flowinfo
267177d5b5fSRobert Mustacchicontains the traffic class and flow label associated with the IPv6
268177d5b5fSRobert Mustacchiheader. The member
269177d5b5fSRobert Mustacchi.Em sin6_scope_id
270177d5b5fSRobert Mustacchimay contain an identifier which varies based on the scope of the address
271177d5b5fSRobert Mustacchiin
272177d5b5fSRobert Mustacchi.Em sin6_addr .
273177d5b5fSRobert MustacchiApplications do not need to initialize
274177d5b5fSRobert Mustacchi.Em sin6_scope_id ;
275177d5b5fSRobert Mustacchiit will be populated by the operating system as a result of various library
276177d5b5fSRobert Mustacchicalls.
277177d5b5fSRobert Mustacchi.Lp
278177d5b5fSRobert MustacchiExample 2 shows how to prepare an IPv6 socket. For more information on
279177d5b5fSRobert MustacchiIPv6, please see
280177d5b5fSRobert Mustacchi.Xr inet6 7P
281177d5b5fSRobert Mustacchiand
282177d5b5fSRobert Mustacchi.Xr ip6 7P .
283177d5b5fSRobert Mustacchi.Ss struct sockaddr_un
284177d5b5fSRobert MustacchiThe
285177d5b5fSRobert Mustacchi.Sy sockaddr_un
286177d5b5fSRobert Mustacchistructure specifies the address of a socket used to communicate between
287177d5b5fSRobert Mustacchiprocesses running on a single system, commonly known as a
288177d5b5fSRobert Mustacchi.Em UNIX domain socket .
289177d5b5fSRobert MustacchiSockets of this type are identified by a path in the file system. The
290177d5b5fSRobert Mustacchi.Sy struct sockaddr_un
291177d5b5fSRobert Mustacchihas the following members:
292177d5b5fSRobert Mustacchi.Bd -literal -offset indent
293177d5b5fSRobert Mustacchisa_family_t	sun_family	/* address family */
294177d5b5fSRobert Mustacchichar		sun_path[108]	/* path name */
295177d5b5fSRobert Mustacchi.Ed
296177d5b5fSRobert Mustacchi.Lp
297177d5b5fSRobert MustacchiThe member
298177d5b5fSRobert Mustacchi.Em sun_family
299177d5b5fSRobert Mustacchimust always have the value
300177d5b5fSRobert Mustacchi.Sy AF_UNIX .
301177d5b5fSRobert MustacchiThe member
302177d5b5fSRobert Mustacchi.Em sun_path
303177d5b5fSRobert Mustacchiis populated with a
304177d5b5fSRobert Mustacchi.Sy NUL
305177d5b5fSRobert Mustacchiterminated array of characters that specify a file system path. The maximum
306177d5b5fSRobert Mustacchilength of any such path, including the
307177d5b5fSRobert Mustacchi.Sy NUL
308177d5b5fSRobert Mustacchiterminator, is 108 bytes.
309177d5b5fSRobert Mustacchi.Ss struct sockaddr_dl
310177d5b5fSRobert MustacchiThe
311177d5b5fSRobert Mustacchi.Sy sockaddr_dl
312177d5b5fSRobert Mustacchistructure is used to describe a layer 2 link-level address. This is used
313177d5b5fSRobert Mustacchias part of various socket ioctls, such as those for
314177d5b5fSRobert Mustacchi.Xr arp 7P .
315177d5b5fSRobert MustacchiThe structure has the following members:
316177d5b5fSRobert Mustacchi.Bd -literal -offset indent
317177d5b5fSRobert Mustacchiushort_t	sdl_family;	/* address family */
318177d5b5fSRobert Mustacchiushort_t	sdl_index;	/* if != 0, system interface index */
319177d5b5fSRobert Mustacchiuchar_t		sdl_type;	/* interface type */
320177d5b5fSRobert Mustacchiuchar_t		sdl_nlen;	/* interface name length */
321177d5b5fSRobert Mustacchiuchar_t		sdl_alen;	/* link level address length */
322177d5b5fSRobert Mustacchiuchar_t		sdl_slen;	/* link layer selector length */
323177d5b5fSRobert Mustacchichar		sdl_data[244];	/* contains both if name and ll address
324177d5b5fSRobert Mustacchi.Ed
325177d5b5fSRobert Mustacchi.Lp
326177d5b5fSRobert MustacchiThe member
327177d5b5fSRobert Mustacchi.Em sdl_family
328177d5b5fSRobert Mustacchimust always have the value
329177d5b5fSRobert Mustacchi.Sy AF_LINK .
330177d5b5fSRobert MustacchiWhen the member
331177d5b5fSRobert Mustacchi.Em sdl_index
332177d5b5fSRobert Mustacchiis non-zero this refers to the interface identifier that corresponds to
333177d5b5fSRobert Mustacchithe
334177d5b5fSRobert Mustacchi.Sy struct sockaddr_dl .
335177d5b5fSRobert MustacchiThis identifier is the same identifier that's shown by tools like
336177d5b5fSRobert Mustacchi.Xr ifconfig 1M
337177d5b5fSRobert Mustacchiand used in the SIOC* set of socket ioctls. The member
338177d5b5fSRobert Mustacchi.Em sdl_type
339177d5b5fSRobert Mustacchirefers to the media that is used for the socket. The most common case is
340177d5b5fSRobert Mustacchithat the medium for the interface is Ethernet which has the value
341177d5b5fSRobert Mustacchi.Sy IFT_ETHER .
342177d5b5fSRobert MustacchiThe full set of types is derived from RFC1573 and recorded in the file
343177d5b5fSRobert Mustacchi.In net/if_types.h .
344177d5b5fSRobert MustacchiThe member
345177d5b5fSRobert Mustacchi.Em sdl_slen
346177d5b5fSRobert Mustacchidescribes the length of a selector, if it exists, for the specified
347177d5b5fSRobert Mustacchimedium. This is used in protocols such as Trill.
348177d5b5fSRobert Mustacchi.Lp
349177d5b5fSRobert MustacchiThe
350177d5b5fSRobert Mustacchi.Em sdl_data ,
351177d5b5fSRobert Mustacchi.Em sdl_nlen
352177d5b5fSRobert Mustacchiand
353177d5b5fSRobert Mustacchi.Em sdl_alen
354177d5b5fSRobert Mustacchimembers together describe a character string containing the interface name and
355177d5b5fSRobert Mustacchithe link-layer network address. The name starts at the beginning of
356177d5b5fSRobert Mustacchi.Em sdl_data ,
357177d5b5fSRobert Mustacchii.e. at
358177d5b5fSRobert Mustacchi.Em sdl_data[0] .
359177d5b5fSRobert MustacchiThe name of the interface occupies the next
360177d5b5fSRobert Mustacchi.Em sdl_nlen
361177d5b5fSRobert Mustacchibytes and is not
362177d5b5fSRobert Mustacchi.Sy NUL
363177d5b5fSRobert Mustacchiterminated. The link-layer network address begins immediately after the
364177d5b5fSRobert Mustacchiinterface name, and is
365177d5b5fSRobert Mustacchi.Em sdl_alen
366177d5b5fSRobert Mustacchibytes long. The macro
367177d5b5fSRobert Mustacchi.Sy LLADDR(struct sockaddr_dl *)
368177d5b5fSRobert Mustacchireturns the start of the link-layer network address.
369177d5b5fSRobert MustacchiThe interpretation of the link-layer address depends on the value of
370177d5b5fSRobert Mustacchi.Em sdl_type .
371177d5b5fSRobert MustacchiFor example, if the type is
372177d5b5fSRobert Mustacchi.Sy IFT_ETHER
373177d5b5fSRobert Mustacchithen the address is expressed as a 6-byte MAC address.
374177d5b5fSRobert Mustacchi.Ss struct sockaddr_ll
375177d5b5fSRobert MustacchiThe
376177d5b5fSRobert Mustacchi.Sy sockaddr_ll
377177d5b5fSRobert Mustacchiis used as part of a socket type which is responsible for packet
378177d5b5fSRobert Mustacchicapture:
379177d5b5fSRobert Mustacchi.Sy AF_PACKET
380177d5b5fSRobert Mustacchisockets. It is generally designed for use with Ethernet networks. The members
381177d5b5fSRobert Mustacchiof the
382177d5b5fSRobert Mustacchi.Sy struct sockaddr_ll
383177d5b5fSRobert Mustacchiare:
384177d5b5fSRobert Mustacchi.Bd -literal -offset indent
385177d5b5fSRobert Mustacchiuint16_t        sll_family;	/* address family */
386177d5b5fSRobert Mustacchiuint16_t        sll_protocol;	/* link layer protocol */
387177d5b5fSRobert Mustacchiint32_t         sll_ifindex;	/* interface index */
388177d5b5fSRobert Mustacchiuint16_t        sll_hatype;	/* ARP hardware type */
389177d5b5fSRobert Mustacchiuint8_t         sll_pkttype;	/* packet type */
390177d5b5fSRobert Mustacchiuint8_t         sll_halen;	/* hardware address length */
391177d5b5fSRobert Mustacchiuint8_t         sll_addr[8];	/* hardware type */
392177d5b5fSRobert Mustacchi.Ed
393177d5b5fSRobert Mustacchi.Lp
394177d5b5fSRobert MustacchiThe member
395177d5b5fSRobert Mustacchi.Em sll_family
396177d5b5fSRobert Mustacchimust be
397177d5b5fSRobert Mustacchi.Sy AF_PACKET .
398177d5b5fSRobert MustacchiThe member
399177d5b5fSRobert Mustacchi.Em sll_protocol
400177d5b5fSRobert Mustacchirefers to a link-layer protocol. For example, when capturing Ethernet frames
401177d5b5fSRobert Mustacchithe value of
402177d5b5fSRobert Mustacchi.Em sll_protocol
403177d5b5fSRobert Mustacchiis the Ethertype. This member is written in network byte order and
404177d5b5fSRobert Mustacchiapplications should use
405177d5b5fSRobert Mustacchi.Xr htons 3SOCKET
406177d5b5fSRobert Mustacchiand
407177d5b5fSRobert Mustacchi.Xr ntohs 3SOCKET
408177d5b5fSRobert Mustacchito read and write the member.
409177d5b5fSRobert Mustacchi.Lp
410177d5b5fSRobert MustacchiThe member
411177d5b5fSRobert Mustacchi.Em sll_ifindex
412177d5b5fSRobert Mustacchiis the interface's index. It is used as an identifier in various ioctls
413177d5b5fSRobert Mustacchiand included in the output of
414177d5b5fSRobert Mustacchi.Xr ifconfig 1M .
415177d5b5fSRobert MustacchiWhen calling
416177d5b5fSRobert Mustacchi.Xr bind 3SOCKET
417177d5b5fSRobert Mustacchiit should be filled in with the index that corresponds to the interface
418177d5b5fSRobert Mustacchifor which packets should be captured on.
419177d5b5fSRobert Mustacchi.Lp
420177d5b5fSRobert MustacchiThe member
421177d5b5fSRobert Mustacchi.Em sll_pkttype
422177d5b5fSRobert Mustacchidescribes the type of the packet based on a list of types in the header
423177d5b5fSRobert Mustacchifile
424177d5b5fSRobert Mustacchi.In netpacket/packet.h .
425177d5b5fSRobert MustacchiThese types include:
426177d5b5fSRobert Mustacchi.Sy PACKET_OUTGOING ,
427177d5b5fSRobert Mustacchia packet that was leaving the host and has been looped back for packet capture;
428177d5b5fSRobert Mustacchi.Sy PACKET_HOST ,
429177d5b5fSRobert Mustacchia packet that was destined for this host;
430177d5b5fSRobert Mustacchi.Sy PACKET_BROADCAST ,
431177d5b5fSRobert Mustacchia packet that was broadcast across the link-layer;
432177d5b5fSRobert Mustacchi.Sy PACKET_MULTICAST ,
433177d5b5fSRobert Mustacchia packet that was sent to a link-layer multicast address; and
434177d5b5fSRobert Mustacchi.Sy PACKET_OTHERHOST ,
435177d5b5fSRobert Mustacchia packet that was captured only because the device in question was in
436177d5b5fSRobert Mustacchipromiscuous mode.
437177d5b5fSRobert Mustacchi.Lp
438177d5b5fSRobert MustacchiThe member
439177d5b5fSRobert Mustacchi.Em sll_hatype
440177d5b5fSRobert Mustacchicontains the hardware type as defined by
441177d5b5fSRobert Mustacchi.Xr arp 7P .
442177d5b5fSRobert MustacchiThe list of types can be found in
443177d5b5fSRobert Mustacchi.In net/if_arp.h .
444177d5b5fSRobert MustacchiThe member
445177d5b5fSRobert Mustacchi.Em sll_halen
446177d5b5fSRobert Mustacchicontains the length, in bytes, of the hardware address, while the member
447177d5b5fSRobert Mustacchi.Em sll_addr
448177d5b5fSRobert Mustacchicontains the actual address in network byte order.
449177d5b5fSRobert Mustacchi.Sh EXAMPLES
450177d5b5fSRobert Mustacchi.Sy Example 1
451177d5b5fSRobert MustacchiPreparing an IPv4
452177d5b5fSRobert Mustacchi.Sy sockaddr_in
453177d5b5fSRobert Mustacchito connect to a remote host
454177d5b5fSRobert Mustacchi.Lp
455177d5b5fSRobert MustacchiThe following example shows how one would open a socket and prepare it
456177d5b5fSRobert Mustacchito connect to the remote host whose address is the IP address 127.0.0.1
457177d5b5fSRobert Mustacchion port 80. This program should be compiled with the C compiler
458177d5b5fSRobert Mustacchi.Sy cc
459177d5b5fSRobert Mustacchiand linked against the libraries libsocket and libnsl. If this example
460177d5b5fSRobert Mustacchiwas named ip4.c, then the full link line would be
461177d5b5fSRobert Mustacchi.Ic cc ip4.c -lsocket -lnsl .
462177d5b5fSRobert Mustacchi.Bd -literal
463177d5b5fSRobert Mustacchi#include <sys/types.h>
464177d5b5fSRobert Mustacchi#include <sys/socket.h>
465177d5b5fSRobert Mustacchi#include <stdio.h>
466177d5b5fSRobert Mustacchi#include <netinet/in.h>
467177d5b5fSRobert Mustacchi#include <inttypes.h>
468177d5b5fSRobert Mustacchi#include <strings.h>
469177d5b5fSRobert Mustacchi
470177d5b5fSRobert Mustacchiint
471177d5b5fSRobert Mustacchimain(void)
472177d5b5fSRobert Mustacchi{
473177d5b5fSRobert Mustacchi	int sock;
474177d5b5fSRobert Mustacchi	struct sockaddr_in in;
475177d5b5fSRobert Mustacchi
476177d5b5fSRobert Mustacchi	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
477177d5b5fSRobert Mustacchi		perror("socket");
478177d5b5fSRobert Mustacchi		return (1);
479177d5b5fSRobert Mustacchi	}
480177d5b5fSRobert Mustacchi
481177d5b5fSRobert Mustacchi	bzero(&in, sizeof (struct sockaddr_in));
482177d5b5fSRobert Mustacchi	in.sin_family = AF_INET;
483177d5b5fSRobert Mustacchi	in.sin_port = htons(80);
484177d5b5fSRobert Mustacchi	if (inet_pton(AF_INET, "127.0.0.1", &in.sin_addr) != 1) {
485177d5b5fSRobert Mustacchi		perror("inet_pton");
486177d5b5fSRobert Mustacchi		return (1);
487177d5b5fSRobert Mustacchi	}
488177d5b5fSRobert Mustacchi
489177d5b5fSRobert Mustacchi	if (connect(sock, (struct sockaddr *)&in,
490177d5b5fSRobert Mustacchi	    sizeof (struct sockaddr_in)) != 0) {
491177d5b5fSRobert Mustacchi		perror("connect");
492177d5b5fSRobert Mustacchi		return (1);
493177d5b5fSRobert Mustacchi	}
494177d5b5fSRobert Mustacchi
495177d5b5fSRobert Mustacchi	/* use socket */
496177d5b5fSRobert Mustacchi
497177d5b5fSRobert Mustacchi	return (0);
498177d5b5fSRobert Mustacchi}
499177d5b5fSRobert Mustacchi.Ed
500177d5b5fSRobert Mustacchi.Lp
501177d5b5fSRobert Mustacchi.Sy Example 2
502177d5b5fSRobert MustacchiPreparing an IPv6
503177d5b5fSRobert Mustacchi.Sy sockaddr_in6
504177d5b5fSRobert Mustacchito bind to a local address
505177d5b5fSRobert Mustacchi.Lp
506177d5b5fSRobert MustacchiThe following example shows how one would open a socket and prepare it
507177d5b5fSRobert Mustacchito bind to the local IPv6 address ::1 port on port 12345. This program
508177d5b5fSRobert Mustacchishould be compiled with the C compiler
509177d5b5fSRobert Mustacchi.Sy cc
510177d5b5fSRobert Mustacchiand linked aginst the libraries libsocket and libnsl. If this example
511177d5b5fSRobert Mustacchiwas named ip6.c, then the full compiler line would be
512177d5b5fSRobert Mustacchi.Ic cc ip6.c -lsocket -lnsl .
513177d5b5fSRobert Mustacchi.Bd -literal
514177d5b5fSRobert Mustacchi#include <sys/types.h>
515177d5b5fSRobert Mustacchi#include <sys/socket.h>
516177d5b5fSRobert Mustacchi#include <stdio.h>
517177d5b5fSRobert Mustacchi#include <netinet/in.h>
518177d5b5fSRobert Mustacchi#include <inttypes.h>
519177d5b5fSRobert Mustacchi#include <strings.h>
520177d5b5fSRobert Mustacchi
521177d5b5fSRobert Mustacchiint
522177d5b5fSRobert Mustacchimain(void)
523177d5b5fSRobert Mustacchi{
524177d5b5fSRobert Mustacchi	int sock6;
525177d5b5fSRobert Mustacchi	struct sockaddr_in6 in6;
526177d5b5fSRobert Mustacchi
527177d5b5fSRobert Mustacchi	if ((sock6 = socket(AF_INET6, SOCK_STREAM, 0)) < 0) {
528177d5b5fSRobert Mustacchi		perror("socket");
529177d5b5fSRobert Mustacchi		return (1);
530177d5b5fSRobert Mustacchi	}
531177d5b5fSRobert Mustacchi
532177d5b5fSRobert Mustacchi	bzero(&in6, sizeof (struct sockaddr_in6));
533177d5b5fSRobert Mustacchi	in6.sin6_family = AF_INET6;
534177d5b5fSRobert Mustacchi	in6.sin6_port = htons(12345);
535177d5b5fSRobert Mustacchi	if (inet_pton(AF_INET6, "::1", &in6.sin6_addr) != 1) {
536177d5b5fSRobert Mustacchi		perror("inet_pton");
537177d5b5fSRobert Mustacchi		return (1);
538177d5b5fSRobert Mustacchi	}
539177d5b5fSRobert Mustacchi
540177d5b5fSRobert Mustacchi	if (bind(sock6, (struct sockaddr *)&in6,
541177d5b5fSRobert Mustacchi	    sizeof (struct sockaddr_in6)) != 0) {
542177d5b5fSRobert Mustacchi		perror("bind");
543177d5b5fSRobert Mustacchi		return (1);
544177d5b5fSRobert Mustacchi	}
545177d5b5fSRobert Mustacchi
546177d5b5fSRobert Mustacchi	/* use server socket */
547177d5b5fSRobert Mustacchi
548177d5b5fSRobert Mustacchi	return (0);
549177d5b5fSRobert Mustacchi}
550177d5b5fSRobert Mustacchi.Ed
551177d5b5fSRobert Mustacchi.Sh SEE ALSO
552177d5b5fSRobert Mustacchi.Xr socket 3HEAD ,
553177d5b5fSRobert Mustacchi.Xr uh.h 3HEAD ,
554177d5b5fSRobert Mustacchi.Xr accept 3SOCKET ,
555177d5b5fSRobert Mustacchi.Xr bind 3SOCKET ,
556177d5b5fSRobert Mustacchi.Xr connect 3SOCKET ,
557177d5b5fSRobert Mustacchi.Xr socket 3SOCKET ,
558177d5b5fSRobert Mustacchi.Xr arp 7P ,
559177d5b5fSRobert Mustacchi.Xr inet 7P ,
560177d5b5fSRobert Mustacchi.Xr inet6 7P ,
561177d5b5fSRobert Mustacchi.Xr ip 7P ,
562*3a005aadSYuri Pankov.Xr ip6 7P
563