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