xref: /titanic_51/usr/src/man/man3socket/sockaddr.3socket (revision 177d5b5f8c0e969013441207a0a705ae66b08cf7)
1*177d5b5fSRobert Mustacchi.\"
2*177d5b5fSRobert Mustacchi.\" This file and its contents are supplied under the terms of the
3*177d5b5fSRobert Mustacchi.\" Common Development and Distribution License ("CDDL"), version 1.0.
4*177d5b5fSRobert Mustacchi.\" You may only use this file in accordance with the terms of version
5*177d5b5fSRobert Mustacchi.\" 1.0 of the CDDL.
6*177d5b5fSRobert Mustacchi.\"
7*177d5b5fSRobert Mustacchi.\" A full copy of the text of the CDDL should have accompanied this
8*177d5b5fSRobert Mustacchi.\" source.  A copy of the CDDL is also available via the Internet at
9*177d5b5fSRobert Mustacchi.\" http://www.illumos.org/license/CDDL.
10*177d5b5fSRobert Mustacchi.\"
11*177d5b5fSRobert Mustacchi.\"
12*177d5b5fSRobert Mustacchi.\" Copyright (c) 2014, Joyent, Inc.
13*177d5b5fSRobert Mustacchi.\"
14*177d5b5fSRobert Mustacchi.Dd Nov 13, 2014
15*177d5b5fSRobert Mustacchi.Dt SOCKADDR 3SOCKET
16*177d5b5fSRobert Mustacchi.Os
17*177d5b5fSRobert Mustacchi.Sh NAME
18*177d5b5fSRobert Mustacchi.Nm sockaddr ,
19*177d5b5fSRobert Mustacchi.Nm sockaddr_dl ,
20*177d5b5fSRobert Mustacchi.Nm sockaddr_in ,
21*177d5b5fSRobert Mustacchi.Nm sockaddr_in6 ,
22*177d5b5fSRobert Mustacchi.Nm sockaddr_ll ,
23*177d5b5fSRobert Mustacchi.Nm sockaddr_storage ,
24*177d5b5fSRobert Mustacchi.Nm sockaddr_un
25*177d5b5fSRobert Mustacchi.Nd Socket Address Structures
26*177d5b5fSRobert Mustacchi.Sh SYNOPSIS
27*177d5b5fSRobert Mustacchi.In sys/socket.h
28*177d5b5fSRobert Mustacchi.Lp
29*177d5b5fSRobert Mustacchi.Sy struct sockaddr
30*177d5b5fSRobert Mustacchi.Em sock ;
31*177d5b5fSRobert Mustacchi.Lp
32*177d5b5fSRobert Mustacchi.In sys/socket.h
33*177d5b5fSRobert Mustacchi.In net/if_dl.h
34*177d5b5fSRobert Mustacchi.Lp
35*177d5b5fSRobert Mustacchi.Sy struct sockaddr_dl
36*177d5b5fSRobert Mustacchi.Em dl_sock ;
37*177d5b5fSRobert Mustacchi.Lp
38*177d5b5fSRobert Mustacchi.In sys/socket.h
39*177d5b5fSRobert Mustacchi.In netinet/in.h
40*177d5b5fSRobert Mustacchi.Lp
41*177d5b5fSRobert Mustacchi.Sy struct sockaddr_in
42*177d5b5fSRobert Mustacchi.Em in_sock ;
43*177d5b5fSRobert Mustacchi.Lp
44*177d5b5fSRobert Mustacchi.In sys/socket.h
45*177d5b5fSRobert Mustacchi.In netinet/in6.h
46*177d5b5fSRobert Mustacchi.Lp
47*177d5b5fSRobert Mustacchi.Sy struct sockaddr_in6
48*177d5b5fSRobert Mustacchi.Em in6_sock ;
49*177d5b5fSRobert Mustacchi.Lp
50*177d5b5fSRobert Mustacchi.In sys/socket.h
51*177d5b5fSRobert Mustacchi.Lp
52*177d5b5fSRobert Mustacchi.Sy struct sockaddr_ll
53*177d5b5fSRobert Mustacchi.Em ll_sock ;
54*177d5b5fSRobert Mustacchi.Lp
55*177d5b5fSRobert Mustacchi.In sys/socket.h
56*177d5b5fSRobert Mustacchi.Lp
57*177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage
58*177d5b5fSRobert Mustacchi.Em storage_sock ;
59*177d5b5fSRobert Mustacchi.Lp
60*177d5b5fSRobert Mustacchi.In sys/un.h
61*177d5b5fSRobert Mustacchi.Lp
62*177d5b5fSRobert Mustacchi.Sy struct sockaddr_un
63*177d5b5fSRobert Mustacchi.Em un_sock ;
64*177d5b5fSRobert Mustacchi.Sh DESCRIPTION
65*177d5b5fSRobert MustacchiThe
66*177d5b5fSRobert Mustacchi.Nm
67*177d5b5fSRobert Mustacchifamily of structures are designed to represent network addresses for
68*177d5b5fSRobert Mustacchidifferent networking protocols. The structure
69*177d5b5fSRobert Mustacchi.Sy struct sockaddr
70*177d5b5fSRobert Mustacchiis a generic structure that is used across calls to various socket
71*177d5b5fSRobert Mustacchilibrary routines
72*177d5b5fSRobert Mustacchi.Po
73*177d5b5fSRobert Mustacchi.Xr libsocket 3LIB
74*177d5b5fSRobert Mustacchi.Pc
75*177d5b5fSRobert Mustacchisuch as
76*177d5b5fSRobert Mustacchi.Xr accept 3SOCKET
77*177d5b5fSRobert Mustacchiand
78*177d5b5fSRobert Mustacchi.Xr bind 3SOCKET .
79*177d5b5fSRobert MustacchiApplications do not use the
80*177d5b5fSRobert Mustacchi.Sy struct sockaddr
81*177d5b5fSRobert Mustacchidirectly, but instead cast the appropriate networking family specific
82*177d5b5fSRobert Mustacchi.Nm
83*177d5b5fSRobert Mustacchistructure to a
84*177d5b5fSRobert Mustacchi.Sy struct sockaddr * .
85*177d5b5fSRobert Mustacchi.Lp
86*177d5b5fSRobert MustacchiEvery structure in the
87*177d5b5fSRobert Mustacchi.Nm
88*177d5b5fSRobert Mustacchifamily begins with a member of the same type, the
89*177d5b5fSRobert Mustacchi.Sy sa_family_t ,
90*177d5b5fSRobert Mustacchithough the different structures all have different names for the member.
91*177d5b5fSRobert MustacchiFor example, the structure
92*177d5b5fSRobert Mustacchi.Sy struct sockaddr
93*177d5b5fSRobert Mustacchihas the following members defined:
94*177d5b5fSRobert Mustacchi.Bd -literal -offset indent
95*177d5b5fSRobert Mustacchisa_family_t	sa_family	/* address family */
96*177d5b5fSRobert Mustacchichar		sa_data[]	/* socket address (variable-length data) */
97*177d5b5fSRobert Mustacchi.Ed
98*177d5b5fSRobert Mustacchi.Lp
99*177d5b5fSRobert MustacchiThe member
100*177d5b5fSRobert Mustacchi.Em sa_family
101*177d5b5fSRobert Mustacchicorresponds to the socket family that's actually in use. The following
102*177d5b5fSRobert Mustacchitable describes the mapping between the address family and the
103*177d5b5fSRobert Mustacchicorresponding socket structure that's used. Note that both the generic
104*177d5b5fSRobert Mustacchi.Sy struct sockaddr
105*177d5b5fSRobert Mustacchiand the
106*177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage
107*177d5b5fSRobert Mustacchiare not included, because these are both generic structures. More on the
108*177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage
109*177d5b5fSRobert Mustacchican be found in the next section.
110*177d5b5fSRobert Mustacchi.Bl -column -offset indent ".Sy Socket Structure" ".Sy Address Family"
111*177d5b5fSRobert Mustacchi.It Sy Socket Structure Ta Sy Address Family
112*177d5b5fSRobert Mustacchi.It struct sockaddr_dl Ta AF_LINK
113*177d5b5fSRobert Mustacchi.It struct sockaddr_in Ta AF_INET
114*177d5b5fSRobert Mustacchi.It struct sockaddr_in6 Ta AF_INET6
115*177d5b5fSRobert Mustacchi.It struct sockaddr_ll Ta AF_PACKET
116*177d5b5fSRobert Mustacchi.It struct sockaddr_un Ta AF_UNIX
117*177d5b5fSRobert Mustacchi.El
118*177d5b5fSRobert Mustacchi.Ss struct sockaddr_storage
119*177d5b5fSRobert MustacchiThe
120*177d5b5fSRobert Mustacchi.Sy sockaddr_storage
121*177d5b5fSRobert Mustacchistructure is a
122*177d5b5fSRobert Mustacchi.Nm
123*177d5b5fSRobert Mustacchithat is not associated with an address family. Instead, it is large
124*177d5b5fSRobert Mustacchienough to hold the contents of any of the other
125*177d5b5fSRobert Mustacchi.Nm
126*177d5b5fSRobert Mustacchistructures. It can be used to embed sufficient storage for a
127*177d5b5fSRobert Mustacchi.Sy sockaddr
128*177d5b5fSRobert Mustacchiof any type within a larger structure.
129*177d5b5fSRobert Mustacchi.Lp
130*177d5b5fSRobert MustacchiThe structure only has a single member defined. While there are other
131*177d5b5fSRobert Mustacchimembers that are used to pad out the size of the
132*177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage ,
133*177d5b5fSRobert Mustacchithey are not defined and must not be consumed. The only valid
134*177d5b5fSRobert Mustacchimember is:
135*177d5b5fSRobert Mustacchi.Bd -literal -offset indent
136*177d5b5fSRobert Mustacchisa_family_t	ss_family	/* address family */
137*177d5b5fSRobert Mustacchi.Ed
138*177d5b5fSRobert Mustacchi.Lp
139*177d5b5fSRobert MustacchiFor example,
140*177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage
141*177d5b5fSRobert Mustacchiis useful when running a service that accepts traffic over both
142*177d5b5fSRobert Mustacchi.Sy IPv4
143*177d5b5fSRobert Mustacchiand
144*177d5b5fSRobert Mustacchi.Sy IPv6
145*177d5b5fSRobert Mustacchiwhere it is common to use a single socket for both address families. In that
146*177d5b5fSRobert Mustacchicase, rather than guessing whether a
147*177d5b5fSRobert Mustacchi.Sy struct sockaddr_in
148*177d5b5fSRobert Mustacchior a
149*177d5b5fSRobert Mustacchi.Sy struct sockaddr_in6
150*177d5b5fSRobert Mustacchiis more appropriate, one can simply use a
151*177d5b5fSRobert Mustacchi.Sy struct sockaddr_storage
152*177d5b5fSRobert Mustacchiand cast to the appropriate family-specific structure type based on the
153*177d5b5fSRobert Mustacchivalue of the member
154*177d5b5fSRobert Mustacchi.Em ss_family .
155*177d5b5fSRobert Mustacchi.Ss struct sockaddr_in
156*177d5b5fSRobert MustacchiThe
157*177d5b5fSRobert Mustacchi.Sy sockaddr_in
158*177d5b5fSRobert Mustacchiis the socket type which is used for for the Internet Protocol version
159*177d5b5fSRobert Mustacchifour (IPv4). It has the following members defined:
160*177d5b5fSRobert Mustacchi.Bd -literal -offset indent
161*177d5b5fSRobert Mustacchisa_family_t	sin_family	/* address family */
162*177d5b5fSRobert Mustacchiin_port_t	sin_port	/* IP port */
163*177d5b5fSRobert Mustacchistruct in_addr	sin_addr	/* IP address */
164*177d5b5fSRobert Mustacchi.Ed
165*177d5b5fSRobert Mustacchi.Lp
166*177d5b5fSRobert MustacchiThe member
167*177d5b5fSRobert Mustacchi.Em sin_family
168*177d5b5fSRobert Mustacchimust always have the value
169*177d5b5fSRobert Mustacchi.Sy AF_INET
170*177d5b5fSRobert Mustacchifor
171*177d5b5fSRobert Mustacchi.Sy IPv4 .
172*177d5b5fSRobert MustacchiThe members
173*177d5b5fSRobert Mustacchi.Em sin_port
174*177d5b5fSRobert Mustacchiand
175*177d5b5fSRobert Mustacchi.Em sin_addr
176*177d5b5fSRobert Mustacchidescribe the IP address and IP port to use. In the case of a call to
177*177d5b5fSRobert Mustacchi.Xr connect 3SOCKET
178*177d5b5fSRobert Mustacchithese represent the remote IP address and port to which the connection
179*177d5b5fSRobert Mustacchiis being made. In the case of
180*177d5b5fSRobert Mustacchi.Xr bind 3SOCKET
181*177d5b5fSRobert Mustacchithese represent the IP address and port on the local host to which the socket
182*177d5b5fSRobert Mustacchiis to be bound. In the case of
183*177d5b5fSRobert Mustacchi.Xr accept 3SOCKET
184*177d5b5fSRobert Mustacchithese represent the remote IP address and port of the machine whose
185*177d5b5fSRobert Mustacchiconnection was accepted.
186*177d5b5fSRobert Mustacchi.Lp
187*177d5b5fSRobert MustacchiThe member
188*177d5b5fSRobert Mustacchi.Em sin_port
189*177d5b5fSRobert Mustacchiis always stored in
190*177d5b5fSRobert Mustacchi.Sy Network Byte Order .
191*177d5b5fSRobert MustacchiOn many systems, this differs from the native host byte order.
192*177d5b5fSRobert MustacchiApplications should read from the member with the function
193*177d5b5fSRobert Mustacchi.Xr ntohs 3SOCKET
194*177d5b5fSRobert Mustacchiand write to the member with the function
195*177d5b5fSRobert Mustacchi.Xr htons 3SOCKET .
196*177d5b5fSRobert MustacchiThe member
197*177d5b5fSRobert Mustacchi.Em sin_addr
198*177d5b5fSRobert Mustacchiis the four byte IPv4 address. It is also stored in network byte order.
199*177d5b5fSRobert MustacchiThe common way to write out the address is to use the function
200*177d5b5fSRobert Mustacchi.Xr inet_pton 3SOCKET
201*177d5b5fSRobert Mustacchiwhich converts between a human readable IP address such as "10.1.2.3"
202*177d5b5fSRobert Mustacchiand the corresponding representation.
203*177d5b5fSRobert Mustacchi.Lp
204*177d5b5fSRobert MustacchiExample 1 shows how to prepare an IPv4 socket and deal with
205*177d5b5fSRobert Mustacchinetwork byte-order. See
206*177d5b5fSRobert Mustacchi.Xr inet 7P
207*177d5b5fSRobert Mustacchiand
208*177d5b5fSRobert Mustacchi.Xr ip 7P
209*177d5b5fSRobert Mustacchifor more information on IPv4, socket options, etc.
210*177d5b5fSRobert Mustacchi.Ss struct sockaddr_in6
211*177d5b5fSRobert MustacchiThe
212*177d5b5fSRobert Mustacchi.Sy sockaddr_in6
213*177d5b5fSRobert Mustacchistructure is the
214*177d5b5fSRobert Mustacchi.Nm
215*177d5b5fSRobert Mustacchifor the Internet Protocol version six (IPv6). Unlike the
216*177d5b5fSRobert Mustacchi.Sy struct sockaddr_in ,
217*177d5b5fSRobert Mustacchithe
218*177d5b5fSRobert Mustacchi.Sy struct sockaddr_in6
219*177d5b5fSRobert Mustacchihas additional members beyond those shown here which are required to be
220*177d5b5fSRobert Mustacchiinitialized to zero through a function such as
221*177d5b5fSRobert Mustacchi.Xr bzero 3C
222*177d5b5fSRobert Mustacchior
223*177d5b5fSRobert Mustacchi.Xr memset 3C .
224*177d5b5fSRobert MustacchiIf the entire
225*177d5b5fSRobert Mustacchi.Sy struct sockaddr_in6
226*177d5b5fSRobert Mustacchiis not zeroed before use, applications will experience undefined behavior. The
227*177d5b5fSRobert Mustacchi.Sy struct sockaddr_in6
228*177d5b5fSRobert Mustacchihas the following public members:
229*177d5b5fSRobert Mustacchi.Bd -literal -offset indent
230*177d5b5fSRobert Mustacchisa_family_t	sin6_family	/* address family */
231*177d5b5fSRobert Mustacchiin_port_t	sin6_port	/* IPv6 port */
232*177d5b5fSRobert Mustacchistruct in6_addr	sin6_addr	/* IPv6 address */
233*177d5b5fSRobert Mustacchiuint32_t	sin6_flowinfo;	/* traffic class and flow info */
234*177d5b5fSRobert Mustacchiuint32_t	sin6_scope_id;	/* interface scope */
235*177d5b5fSRobert Mustacchi.Ed
236*177d5b5fSRobert Mustacchi.Lp
237*177d5b5fSRobert MustacchiThe member
238*177d5b5fSRobert Mustacchi.Em sin6_family
239*177d5b5fSRobert Mustacchimust always have the value
240*177d5b5fSRobert Mustacchi.Sy AF_INET6 .
241*177d5b5fSRobert MustacchiThe members
242*177d5b5fSRobert Mustacchi.Em sin6_port
243*177d5b5fSRobert Mustacchiand
244*177d5b5fSRobert Mustacchi.Em sin6_addr
245*177d5b5fSRobert Mustacchiare the IPv6 equivalents of the
246*177d5b5fSRobert Mustacchi.Sy struct sockaddr_in
247*177d5b5fSRobert Mustacchi.Em sin_port
248*177d5b5fSRobert Mustacchiand
249*177d5b5fSRobert Mustacchi.Em sin_addr .
250*177d5b5fSRobert MustacchiLike their IPv4 counterparts, both of these members must be in network
251*177d5b5fSRobert Mustacchibyte order. The member
252*177d5b5fSRobert Mustacchi.Em sin6_port
253*177d5b5fSRobert Mustacchidescribes the IPv6 port and should be manipulated with the functions
254*177d5b5fSRobert Mustacchi.Xr ntohs 3SOCKET
255*177d5b5fSRobert Mustacchiand
256*177d5b5fSRobert Mustacchi.Xr htons 3SOCKET .
257*177d5b5fSRobert MustacchiThe member
258*177d5b5fSRobert Mustacchi.Em sin6_addr
259*177d5b5fSRobert Mustacchidescribes the 16-byte IPv6 address. In addition to the function
260*177d5b5fSRobert Mustacchi.Xr inet_pton 3SOCKET ,
261*177d5b5fSRobert Mustacchithe header file
262*177d5b5fSRobert Mustacchi.In netinet/in.h
263*177d5b5fSRobert Mustacchidefines many macros for manipulating and testing IPv6 addresses.
264*177d5b5fSRobert Mustacchi.Lp
265*177d5b5fSRobert MustacchiThe member
266*177d5b5fSRobert Mustacchi.Em sin6_flowinfo
267*177d5b5fSRobert Mustacchicontains the traffic class and flow label associated with the IPv6
268*177d5b5fSRobert Mustacchiheader. The member
269*177d5b5fSRobert Mustacchi.Em sin6_scope_id
270*177d5b5fSRobert Mustacchimay contain an identifier which varies based on the scope of the address
271*177d5b5fSRobert Mustacchiin
272*177d5b5fSRobert Mustacchi.Em sin6_addr .
273*177d5b5fSRobert MustacchiApplications do not need to initialize
274*177d5b5fSRobert Mustacchi.Em sin6_scope_id ;
275*177d5b5fSRobert Mustacchiit will be populated by the operating system as a result of various library
276*177d5b5fSRobert Mustacchicalls.
277*177d5b5fSRobert Mustacchi.Lp
278*177d5b5fSRobert MustacchiExample 2 shows how to prepare an IPv6 socket. For more information on
279*177d5b5fSRobert MustacchiIPv6, please see
280*177d5b5fSRobert Mustacchi.Xr inet6 7P
281*177d5b5fSRobert Mustacchiand
282*177d5b5fSRobert Mustacchi.Xr ip6 7P .
283*177d5b5fSRobert Mustacchi.Ss struct sockaddr_un
284*177d5b5fSRobert MustacchiThe
285*177d5b5fSRobert Mustacchi.Sy sockaddr_un
286*177d5b5fSRobert Mustacchistructure specifies the address of a socket used to communicate between
287*177d5b5fSRobert Mustacchiprocesses running on a single system, commonly known as a
288*177d5b5fSRobert Mustacchi.Em UNIX domain socket .
289*177d5b5fSRobert MustacchiSockets of this type are identified by a path in the file system. The
290*177d5b5fSRobert Mustacchi.Sy struct sockaddr_un
291*177d5b5fSRobert Mustacchihas the following members:
292*177d5b5fSRobert Mustacchi.Bd -literal -offset indent
293*177d5b5fSRobert Mustacchisa_family_t	sun_family	/* address family */
294*177d5b5fSRobert Mustacchichar		sun_path[108]	/* path name */
295*177d5b5fSRobert Mustacchi.Ed
296*177d5b5fSRobert Mustacchi.Lp
297*177d5b5fSRobert MustacchiThe member
298*177d5b5fSRobert Mustacchi.Em sun_family
299*177d5b5fSRobert Mustacchimust always have the value
300*177d5b5fSRobert Mustacchi.Sy AF_UNIX .
301*177d5b5fSRobert MustacchiThe member
302*177d5b5fSRobert Mustacchi.Em sun_path
303*177d5b5fSRobert Mustacchiis populated with a
304*177d5b5fSRobert Mustacchi.Sy NUL
305*177d5b5fSRobert Mustacchiterminated array of characters that specify a file system path. The maximum
306*177d5b5fSRobert Mustacchilength of any such path, including the
307*177d5b5fSRobert Mustacchi.Sy NUL
308*177d5b5fSRobert Mustacchiterminator, is 108 bytes.
309*177d5b5fSRobert Mustacchi.Ss struct sockaddr_dl
310*177d5b5fSRobert MustacchiThe
311*177d5b5fSRobert Mustacchi.Sy sockaddr_dl
312*177d5b5fSRobert Mustacchistructure is used to describe a layer 2 link-level address. This is used
313*177d5b5fSRobert Mustacchias part of various socket ioctls, such as those for
314*177d5b5fSRobert Mustacchi.Xr arp 7P .
315*177d5b5fSRobert MustacchiThe structure has the following members:
316*177d5b5fSRobert Mustacchi.Bd -literal -offset indent
317*177d5b5fSRobert Mustacchiushort_t	sdl_family;	/* address family */
318*177d5b5fSRobert Mustacchiushort_t	sdl_index;	/* if != 0, system interface index */
319*177d5b5fSRobert Mustacchiuchar_t		sdl_type;	/* interface type */
320*177d5b5fSRobert Mustacchiuchar_t		sdl_nlen;	/* interface name length */
321*177d5b5fSRobert Mustacchiuchar_t		sdl_alen;	/* link level address length */
322*177d5b5fSRobert Mustacchiuchar_t		sdl_slen;	/* link layer selector length */
323*177d5b5fSRobert Mustacchichar		sdl_data[244];	/* contains both if name and ll address
324*177d5b5fSRobert Mustacchi.Ed
325*177d5b5fSRobert Mustacchi.Lp
326*177d5b5fSRobert MustacchiThe member
327*177d5b5fSRobert Mustacchi.Em sdl_family
328*177d5b5fSRobert Mustacchimust always have the value
329*177d5b5fSRobert Mustacchi.Sy AF_LINK .
330*177d5b5fSRobert MustacchiWhen the member
331*177d5b5fSRobert Mustacchi.Em sdl_index
332*177d5b5fSRobert Mustacchiis non-zero this refers to the interface identifier that corresponds to
333*177d5b5fSRobert Mustacchithe
334*177d5b5fSRobert Mustacchi.Sy struct sockaddr_dl .
335*177d5b5fSRobert MustacchiThis identifier is the same identifier that's shown by tools like
336*177d5b5fSRobert Mustacchi.Xr ifconfig 1M
337*177d5b5fSRobert Mustacchiand used in the SIOC* set of socket ioctls. The member
338*177d5b5fSRobert Mustacchi.Em sdl_type
339*177d5b5fSRobert Mustacchirefers to the media that is used for the socket. The most common case is
340*177d5b5fSRobert Mustacchithat the medium for the interface is Ethernet which has the value
341*177d5b5fSRobert Mustacchi.Sy IFT_ETHER .
342*177d5b5fSRobert MustacchiThe full set of types is derived from RFC1573 and recorded in the file
343*177d5b5fSRobert Mustacchi.In net/if_types.h .
344*177d5b5fSRobert MustacchiThe member
345*177d5b5fSRobert Mustacchi.Em sdl_slen
346*177d5b5fSRobert Mustacchidescribes the length of a selector, if it exists, for the specified
347*177d5b5fSRobert Mustacchimedium. This is used in protocols such as Trill.
348*177d5b5fSRobert Mustacchi.Lp
349*177d5b5fSRobert MustacchiThe
350*177d5b5fSRobert Mustacchi.Em sdl_data ,
351*177d5b5fSRobert Mustacchi.Em sdl_nlen
352*177d5b5fSRobert Mustacchiand
353*177d5b5fSRobert Mustacchi.Em sdl_alen
354*177d5b5fSRobert Mustacchimembers together describe a character string containing the interface name and
355*177d5b5fSRobert Mustacchithe link-layer network address. The name starts at the beginning of
356*177d5b5fSRobert Mustacchi.Em sdl_data ,
357*177d5b5fSRobert Mustacchii.e. at
358*177d5b5fSRobert Mustacchi.Em sdl_data[0] .
359*177d5b5fSRobert MustacchiThe name of the interface occupies the next
360*177d5b5fSRobert Mustacchi.Em sdl_nlen
361*177d5b5fSRobert Mustacchibytes and is not
362*177d5b5fSRobert Mustacchi.Sy NUL
363*177d5b5fSRobert Mustacchiterminated. The link-layer network address begins immediately after the
364*177d5b5fSRobert Mustacchiinterface name, and is
365*177d5b5fSRobert Mustacchi.Em sdl_alen
366*177d5b5fSRobert Mustacchibytes long. The macro
367*177d5b5fSRobert Mustacchi.Sy LLADDR(struct sockaddr_dl *)
368*177d5b5fSRobert Mustacchireturns the start of the link-layer network address.
369*177d5b5fSRobert MustacchiThe interpretation of the link-layer address depends on the value of
370*177d5b5fSRobert Mustacchi.Em sdl_type .
371*177d5b5fSRobert MustacchiFor example, if the type is
372*177d5b5fSRobert Mustacchi.Sy IFT_ETHER
373*177d5b5fSRobert Mustacchithen the address is expressed as a 6-byte MAC address.
374*177d5b5fSRobert Mustacchi.Ss struct sockaddr_ll
375*177d5b5fSRobert MustacchiThe
376*177d5b5fSRobert Mustacchi.Sy sockaddr_ll
377*177d5b5fSRobert Mustacchiis used as part of a socket type which is responsible for packet
378*177d5b5fSRobert Mustacchicapture:
379*177d5b5fSRobert Mustacchi.Sy AF_PACKET
380*177d5b5fSRobert Mustacchisockets. It is generally designed for use with Ethernet networks. The members
381*177d5b5fSRobert Mustacchiof the
382*177d5b5fSRobert Mustacchi.Sy struct sockaddr_ll
383*177d5b5fSRobert Mustacchiare:
384*177d5b5fSRobert Mustacchi.Bd -literal -offset indent
385*177d5b5fSRobert Mustacchiuint16_t        sll_family;	/* address family */
386*177d5b5fSRobert Mustacchiuint16_t        sll_protocol;	/* link layer protocol */
387*177d5b5fSRobert Mustacchiint32_t         sll_ifindex;	/* interface index */
388*177d5b5fSRobert Mustacchiuint16_t        sll_hatype;	/* ARP hardware type */
389*177d5b5fSRobert Mustacchiuint8_t         sll_pkttype;	/* packet type */
390*177d5b5fSRobert Mustacchiuint8_t         sll_halen;	/* hardware address length */
391*177d5b5fSRobert Mustacchiuint8_t         sll_addr[8];	/* hardware type */
392*177d5b5fSRobert Mustacchi.Ed
393*177d5b5fSRobert Mustacchi.Lp
394*177d5b5fSRobert MustacchiThe member
395*177d5b5fSRobert Mustacchi.Em sll_family
396*177d5b5fSRobert Mustacchimust be
397*177d5b5fSRobert Mustacchi.Sy AF_PACKET .
398*177d5b5fSRobert MustacchiThe member
399*177d5b5fSRobert Mustacchi.Em sll_protocol
400*177d5b5fSRobert Mustacchirefers to a link-layer protocol. For example, when capturing Ethernet frames
401*177d5b5fSRobert Mustacchithe value of
402*177d5b5fSRobert Mustacchi.Em sll_protocol
403*177d5b5fSRobert Mustacchiis the Ethertype. This member is written in network byte order and
404*177d5b5fSRobert Mustacchiapplications should use
405*177d5b5fSRobert Mustacchi.Xr htons 3SOCKET
406*177d5b5fSRobert Mustacchiand
407*177d5b5fSRobert Mustacchi.Xr ntohs 3SOCKET
408*177d5b5fSRobert Mustacchito read and write the member.
409*177d5b5fSRobert Mustacchi.Lp
410*177d5b5fSRobert MustacchiThe member
411*177d5b5fSRobert Mustacchi.Em sll_ifindex
412*177d5b5fSRobert Mustacchiis the interface's index. It is used as an identifier in various ioctls
413*177d5b5fSRobert Mustacchiand included in the output of
414*177d5b5fSRobert Mustacchi.Xr ifconfig 1M .
415*177d5b5fSRobert MustacchiWhen calling
416*177d5b5fSRobert Mustacchi.Xr bind 3SOCKET
417*177d5b5fSRobert Mustacchiit should be filled in with the index that corresponds to the interface
418*177d5b5fSRobert Mustacchifor which packets should be captured on.
419*177d5b5fSRobert Mustacchi.Lp
420*177d5b5fSRobert MustacchiThe member
421*177d5b5fSRobert Mustacchi.Em sll_pkttype
422*177d5b5fSRobert Mustacchidescribes the type of the packet based on a list of types in the header
423*177d5b5fSRobert Mustacchifile
424*177d5b5fSRobert Mustacchi.In netpacket/packet.h .
425*177d5b5fSRobert MustacchiThese types include:
426*177d5b5fSRobert Mustacchi.Sy PACKET_OUTGOING ,
427*177d5b5fSRobert Mustacchia packet that was leaving the host and has been looped back for packet capture;
428*177d5b5fSRobert Mustacchi.Sy PACKET_HOST ,
429*177d5b5fSRobert Mustacchia packet that was destined for this host;
430*177d5b5fSRobert Mustacchi.Sy PACKET_BROADCAST ,
431*177d5b5fSRobert Mustacchia packet that was broadcast across the link-layer;
432*177d5b5fSRobert Mustacchi.Sy PACKET_MULTICAST ,
433*177d5b5fSRobert Mustacchia packet that was sent to a link-layer multicast address; and
434*177d5b5fSRobert Mustacchi.Sy PACKET_OTHERHOST ,
435*177d5b5fSRobert Mustacchia packet that was captured only because the device in question was in
436*177d5b5fSRobert Mustacchipromiscuous mode.
437*177d5b5fSRobert Mustacchi.Lp
438*177d5b5fSRobert MustacchiThe member
439*177d5b5fSRobert Mustacchi.Em sll_hatype
440*177d5b5fSRobert Mustacchicontains the hardware type as defined by
441*177d5b5fSRobert Mustacchi.Xr arp 7P .
442*177d5b5fSRobert MustacchiThe list of types can be found in
443*177d5b5fSRobert Mustacchi.In net/if_arp.h .
444*177d5b5fSRobert MustacchiThe member
445*177d5b5fSRobert Mustacchi.Em sll_halen
446*177d5b5fSRobert Mustacchicontains the length, in bytes, of the hardware address, while the member
447*177d5b5fSRobert Mustacchi.Em sll_addr
448*177d5b5fSRobert Mustacchicontains the actual address in network byte order.
449*177d5b5fSRobert Mustacchi.Sh EXAMPLES
450*177d5b5fSRobert Mustacchi.Sy Example 1
451*177d5b5fSRobert MustacchiPreparing an IPv4
452*177d5b5fSRobert Mustacchi.Sy sockaddr_in
453*177d5b5fSRobert Mustacchito connect to a remote host
454*177d5b5fSRobert Mustacchi.Lp
455*177d5b5fSRobert MustacchiThe following example shows how one would open a socket and prepare it
456*177d5b5fSRobert Mustacchito connect to the remote host whose address is the IP address 127.0.0.1
457*177d5b5fSRobert Mustacchion port 80. This program should be compiled with the C compiler
458*177d5b5fSRobert Mustacchi.Sy cc
459*177d5b5fSRobert Mustacchiand linked against the libraries libsocket and libnsl. If this example
460*177d5b5fSRobert Mustacchiwas named ip4.c, then the full link line would be
461*177d5b5fSRobert Mustacchi.Ic cc ip4.c -lsocket -lnsl .
462*177d5b5fSRobert Mustacchi.Bd -literal
463*177d5b5fSRobert Mustacchi#include <sys/types.h>
464*177d5b5fSRobert Mustacchi#include <sys/socket.h>
465*177d5b5fSRobert Mustacchi#include <stdio.h>
466*177d5b5fSRobert Mustacchi#include <netinet/in.h>
467*177d5b5fSRobert Mustacchi#include <inttypes.h>
468*177d5b5fSRobert Mustacchi#include <strings.h>
469*177d5b5fSRobert Mustacchi
470*177d5b5fSRobert Mustacchiint
471*177d5b5fSRobert Mustacchimain(void)
472*177d5b5fSRobert Mustacchi{
473*177d5b5fSRobert Mustacchi	int sock;
474*177d5b5fSRobert Mustacchi	struct sockaddr_in in;
475*177d5b5fSRobert Mustacchi
476*177d5b5fSRobert Mustacchi	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
477*177d5b5fSRobert Mustacchi		perror("socket");
478*177d5b5fSRobert Mustacchi		return (1);
479*177d5b5fSRobert Mustacchi	}
480*177d5b5fSRobert Mustacchi
481*177d5b5fSRobert Mustacchi	bzero(&in, sizeof (struct sockaddr_in));
482*177d5b5fSRobert Mustacchi	in.sin_family = AF_INET;
483*177d5b5fSRobert Mustacchi	in.sin_port = htons(80);
484*177d5b5fSRobert Mustacchi	if (inet_pton(AF_INET, "127.0.0.1", &in.sin_addr) != 1) {
485*177d5b5fSRobert Mustacchi		perror("inet_pton");
486*177d5b5fSRobert Mustacchi		return (1);
487*177d5b5fSRobert Mustacchi	}
488*177d5b5fSRobert Mustacchi
489*177d5b5fSRobert Mustacchi	if (connect(sock, (struct sockaddr *)&in,
490*177d5b5fSRobert Mustacchi	    sizeof (struct sockaddr_in)) != 0) {
491*177d5b5fSRobert Mustacchi		perror("connect");
492*177d5b5fSRobert Mustacchi		return (1);
493*177d5b5fSRobert Mustacchi	}
494*177d5b5fSRobert Mustacchi
495*177d5b5fSRobert Mustacchi	/* use socket */
496*177d5b5fSRobert Mustacchi
497*177d5b5fSRobert Mustacchi	return (0);
498*177d5b5fSRobert Mustacchi}
499*177d5b5fSRobert Mustacchi.Ed
500*177d5b5fSRobert Mustacchi.Lp
501*177d5b5fSRobert Mustacchi.Sy Example 2
502*177d5b5fSRobert MustacchiPreparing an IPv6
503*177d5b5fSRobert Mustacchi.Sy sockaddr_in6
504*177d5b5fSRobert Mustacchito bind to a local address
505*177d5b5fSRobert Mustacchi.Lp
506*177d5b5fSRobert MustacchiThe following example shows how one would open a socket and prepare it
507*177d5b5fSRobert Mustacchito bind to the local IPv6 address ::1 port on port 12345. This program
508*177d5b5fSRobert Mustacchishould be compiled with the C compiler
509*177d5b5fSRobert Mustacchi.Sy cc
510*177d5b5fSRobert Mustacchiand linked aginst the libraries libsocket and libnsl. If this example
511*177d5b5fSRobert Mustacchiwas named ip6.c, then the full compiler line would be
512*177d5b5fSRobert Mustacchi.Ic cc ip6.c -lsocket -lnsl .
513*177d5b5fSRobert Mustacchi.Bd -literal
514*177d5b5fSRobert Mustacchi#include <sys/types.h>
515*177d5b5fSRobert Mustacchi#include <sys/socket.h>
516*177d5b5fSRobert Mustacchi#include <stdio.h>
517*177d5b5fSRobert Mustacchi#include <netinet/in.h>
518*177d5b5fSRobert Mustacchi#include <inttypes.h>
519*177d5b5fSRobert Mustacchi#include <strings.h>
520*177d5b5fSRobert Mustacchi
521*177d5b5fSRobert Mustacchiint
522*177d5b5fSRobert Mustacchimain(void)
523*177d5b5fSRobert Mustacchi{
524*177d5b5fSRobert Mustacchi	int sock6;
525*177d5b5fSRobert Mustacchi	struct sockaddr_in6 in6;
526*177d5b5fSRobert Mustacchi
527*177d5b5fSRobert Mustacchi	if ((sock6 = socket(AF_INET6, SOCK_STREAM, 0)) < 0) {
528*177d5b5fSRobert Mustacchi		perror("socket");
529*177d5b5fSRobert Mustacchi		return (1);
530*177d5b5fSRobert Mustacchi	}
531*177d5b5fSRobert Mustacchi
532*177d5b5fSRobert Mustacchi	bzero(&in6, sizeof (struct sockaddr_in6));
533*177d5b5fSRobert Mustacchi	in6.sin6_family = AF_INET6;
534*177d5b5fSRobert Mustacchi	in6.sin6_port = htons(12345);
535*177d5b5fSRobert Mustacchi	if (inet_pton(AF_INET6, "::1", &in6.sin6_addr) != 1) {
536*177d5b5fSRobert Mustacchi		perror("inet_pton");
537*177d5b5fSRobert Mustacchi		return (1);
538*177d5b5fSRobert Mustacchi	}
539*177d5b5fSRobert Mustacchi
540*177d5b5fSRobert Mustacchi	if (bind(sock6, (struct sockaddr *)&in6,
541*177d5b5fSRobert Mustacchi	    sizeof (struct sockaddr_in6)) != 0) {
542*177d5b5fSRobert Mustacchi		perror("bind");
543*177d5b5fSRobert Mustacchi		return (1);
544*177d5b5fSRobert Mustacchi	}
545*177d5b5fSRobert Mustacchi
546*177d5b5fSRobert Mustacchi	/* use server socket */
547*177d5b5fSRobert Mustacchi
548*177d5b5fSRobert Mustacchi	return (0);
549*177d5b5fSRobert Mustacchi}
550*177d5b5fSRobert Mustacchi.Ed
551*177d5b5fSRobert Mustacchi.Sh SEE ALSO
552*177d5b5fSRobert Mustacchi.Xr socket 3HEAD ,
553*177d5b5fSRobert Mustacchi.Xr uh.h 3HEAD ,
554*177d5b5fSRobert Mustacchi.Xr accept 3SOCKET ,
555*177d5b5fSRobert Mustacchi.Xr bind 3SOCKET ,
556*177d5b5fSRobert Mustacchi.Xr connect 3SOCKET ,
557*177d5b5fSRobert Mustacchi.Xr socket 3SOCKET ,
558*177d5b5fSRobert Mustacchi.Xr arp 7P ,
559*177d5b5fSRobert Mustacchi.Xr inet 7P ,
560*177d5b5fSRobert Mustacchi.Xr inet6 7P ,
561*177d5b5fSRobert Mustacchi.Xr ip 7P ,
562*177d5b5fSRobert Mustacchi.Xr ip6 7P ,
563