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