169d5a931SRobert Mustacchi.\" 269d5a931SRobert Mustacchi.\" This file and its contents are supplied under the terms of the 369d5a931SRobert Mustacchi.\" Common Development and Distribution License ("CDDL"), version 1.0. 469d5a931SRobert Mustacchi.\" You may only use this file in accordance with the terms of version 569d5a931SRobert Mustacchi.\" 1.0 of the CDDL. 669d5a931SRobert Mustacchi.\" 769d5a931SRobert Mustacchi.\" A full copy of the text of the CDDL should have accompanied this 869d5a931SRobert Mustacchi.\" source. A copy of the CDDL is also available via the Internet at 969d5a931SRobert Mustacchi.\" http://www.illumos.org/license/CDDL. 1069d5a931SRobert Mustacchi.\" 1169d5a931SRobert Mustacchi.\" 12*6aa16292SRobert Mustacchi.\" Copyright 2015, Joyent, Inc. 1369d5a931SRobert Mustacchi.\" 14*6aa16292SRobert Mustacchi.Dd May 18, 2015 1569d5a931SRobert Mustacchi.Dt SOCKADDR 3SOCKET 1669d5a931SRobert Mustacchi.Os 1769d5a931SRobert Mustacchi.Sh NAME 1869d5a931SRobert Mustacchi.Nm sockaddr , 1969d5a931SRobert Mustacchi.Nm sockaddr_dl , 2069d5a931SRobert Mustacchi.Nm sockaddr_in , 2169d5a931SRobert Mustacchi.Nm sockaddr_in6 , 2269d5a931SRobert Mustacchi.Nm sockaddr_ll , 2369d5a931SRobert Mustacchi.Nm sockaddr_storage , 2469d5a931SRobert Mustacchi.Nm sockaddr_un 2569d5a931SRobert Mustacchi.Nd Socket Address Structures 2669d5a931SRobert Mustacchi.Sh SYNOPSIS 2769d5a931SRobert Mustacchi.In sys/socket.h 2869d5a931SRobert Mustacchi.Lp 2969d5a931SRobert Mustacchi.Sy struct sockaddr 3069d5a931SRobert Mustacchi.Em sock ; 3169d5a931SRobert Mustacchi.Lp 3269d5a931SRobert Mustacchi.In sys/socket.h 3369d5a931SRobert Mustacchi.In net/if_dl.h 3469d5a931SRobert Mustacchi.Lp 3569d5a931SRobert Mustacchi.Sy struct sockaddr_dl 3669d5a931SRobert Mustacchi.Em dl_sock ; 3769d5a931SRobert Mustacchi.Lp 3869d5a931SRobert Mustacchi.In sys/socket.h 3969d5a931SRobert Mustacchi.In netinet/in.h 4069d5a931SRobert Mustacchi.Lp 4169d5a931SRobert Mustacchi.Sy struct sockaddr_in 4269d5a931SRobert Mustacchi.Em in_sock ; 4369d5a931SRobert Mustacchi.Lp 4469d5a931SRobert Mustacchi.In sys/socket.h 45*6aa16292SRobert Mustacchi.In netinet/in.h 4669d5a931SRobert Mustacchi.Lp 4769d5a931SRobert Mustacchi.Sy struct sockaddr_in6 4869d5a931SRobert Mustacchi.Em in6_sock ; 4969d5a931SRobert Mustacchi.Lp 5069d5a931SRobert Mustacchi.In sys/socket.h 5169d5a931SRobert Mustacchi.Lp 5269d5a931SRobert Mustacchi.Sy struct sockaddr_ll 5369d5a931SRobert Mustacchi.Em ll_sock ; 5469d5a931SRobert Mustacchi.Lp 5569d5a931SRobert Mustacchi.In sys/socket.h 5669d5a931SRobert Mustacchi.Lp 5769d5a931SRobert Mustacchi.Sy struct sockaddr_storage 5869d5a931SRobert Mustacchi.Em storage_sock ; 5969d5a931SRobert Mustacchi.Lp 6069d5a931SRobert Mustacchi.In sys/un.h 6169d5a931SRobert Mustacchi.Lp 6269d5a931SRobert Mustacchi.Sy struct sockaddr_un 6369d5a931SRobert Mustacchi.Em un_sock ; 6469d5a931SRobert Mustacchi.Sh DESCRIPTION 6569d5a931SRobert MustacchiThe 6669d5a931SRobert Mustacchi.Nm 6769d5a931SRobert Mustacchifamily of structures are designed to represent network addresses for 6869d5a931SRobert Mustacchidifferent networking protocols. The structure 6969d5a931SRobert Mustacchi.Sy struct sockaddr 7069d5a931SRobert Mustacchiis a generic structure that is used across calls to various socket 7169d5a931SRobert Mustacchilibrary routines 7269d5a931SRobert Mustacchi.Po 7369d5a931SRobert Mustacchi.Xr libsocket 3LIB 7469d5a931SRobert Mustacchi.Pc 7569d5a931SRobert Mustacchisuch as 7669d5a931SRobert Mustacchi.Xr accept 3SOCKET 7769d5a931SRobert Mustacchiand 7869d5a931SRobert Mustacchi.Xr bind 3SOCKET . 7969d5a931SRobert MustacchiApplications do not use the 8069d5a931SRobert Mustacchi.Sy struct sockaddr 8169d5a931SRobert Mustacchidirectly, but instead cast the appropriate networking family specific 8269d5a931SRobert Mustacchi.Nm 8369d5a931SRobert Mustacchistructure to a 8469d5a931SRobert Mustacchi.Sy struct sockaddr * . 8569d5a931SRobert Mustacchi.Lp 8669d5a931SRobert MustacchiEvery structure in the 8769d5a931SRobert Mustacchi.Nm 8869d5a931SRobert Mustacchifamily begins with a member of the same type, the 8969d5a931SRobert Mustacchi.Sy sa_family_t , 9069d5a931SRobert Mustacchithough the different structures all have different names for the member. 9169d5a931SRobert MustacchiFor example, the structure 9269d5a931SRobert Mustacchi.Sy struct sockaddr 9369d5a931SRobert Mustacchihas the following members defined: 9469d5a931SRobert Mustacchi.Bd -literal -offset indent 9569d5a931SRobert Mustacchisa_family_t sa_family /* address family */ 9669d5a931SRobert Mustacchichar sa_data[] /* socket address (variable-length data) */ 9769d5a931SRobert Mustacchi.Ed 9869d5a931SRobert Mustacchi.Lp 9969d5a931SRobert MustacchiThe member 10069d5a931SRobert Mustacchi.Em sa_family 10169d5a931SRobert Mustacchicorresponds to the socket family that's actually in use. The following 10269d5a931SRobert Mustacchitable describes the mapping between the address family and the 10369d5a931SRobert Mustacchicorresponding socket structure that's used. Note that both the generic 10469d5a931SRobert Mustacchi.Sy struct sockaddr 10569d5a931SRobert Mustacchiand the 10669d5a931SRobert Mustacchi.Sy struct sockaddr_storage 10769d5a931SRobert Mustacchiare not included, because these are both generic structures. More on the 10869d5a931SRobert Mustacchi.Sy struct sockaddr_storage 10969d5a931SRobert Mustacchican be found in the next section. 11069d5a931SRobert Mustacchi.Bl -column -offset indent ".Sy Socket Structure" ".Sy Address Family" 11169d5a931SRobert Mustacchi.It Sy Socket Structure Ta Sy Address Family 11269d5a931SRobert Mustacchi.It struct sockaddr_dl Ta AF_LINK 11369d5a931SRobert Mustacchi.It struct sockaddr_in Ta AF_INET 11469d5a931SRobert Mustacchi.It struct sockaddr_in6 Ta AF_INET6 11569d5a931SRobert Mustacchi.It struct sockaddr_ll Ta AF_PACKET 11669d5a931SRobert Mustacchi.It struct sockaddr_un Ta AF_UNIX 11769d5a931SRobert Mustacchi.El 11869d5a931SRobert Mustacchi.Ss struct sockaddr_storage 11969d5a931SRobert MustacchiThe 12069d5a931SRobert Mustacchi.Sy sockaddr_storage 12169d5a931SRobert Mustacchistructure is a 12269d5a931SRobert Mustacchi.Nm 12369d5a931SRobert Mustacchithat is not associated with an address family. Instead, it is large 12469d5a931SRobert Mustacchienough to hold the contents of any of the other 12569d5a931SRobert Mustacchi.Nm 12669d5a931SRobert Mustacchistructures. It can be used to embed sufficient storage for a 12769d5a931SRobert Mustacchi.Sy sockaddr 12869d5a931SRobert Mustacchiof any type within a larger structure. 12969d5a931SRobert Mustacchi.Lp 13069d5a931SRobert MustacchiThe structure only has a single member defined. While there are other 13169d5a931SRobert Mustacchimembers that are used to pad out the size of the 13269d5a931SRobert Mustacchi.Sy struct sockaddr_storage , 13369d5a931SRobert Mustacchithey are not defined and must not be consumed. The only valid 13469d5a931SRobert Mustacchimember is: 13569d5a931SRobert Mustacchi.Bd -literal -offset indent 13669d5a931SRobert Mustacchisa_family_t ss_family /* address family */ 13769d5a931SRobert Mustacchi.Ed 13869d5a931SRobert Mustacchi.Lp 13969d5a931SRobert MustacchiFor example, 14069d5a931SRobert Mustacchi.Sy struct sockaddr_storage 14169d5a931SRobert Mustacchiis useful when running a service that accepts traffic over both 14269d5a931SRobert Mustacchi.Sy IPv4 14369d5a931SRobert Mustacchiand 14469d5a931SRobert Mustacchi.Sy IPv6 14569d5a931SRobert Mustacchiwhere it is common to use a single socket for both address families. In that 14669d5a931SRobert Mustacchicase, rather than guessing whether a 14769d5a931SRobert Mustacchi.Sy struct sockaddr_in 14869d5a931SRobert Mustacchior a 14969d5a931SRobert Mustacchi.Sy struct sockaddr_in6 15069d5a931SRobert Mustacchiis more appropriate, one can simply use a 15169d5a931SRobert Mustacchi.Sy struct sockaddr_storage 15269d5a931SRobert Mustacchiand cast to the appropriate family-specific structure type based on the 15369d5a931SRobert Mustacchivalue of the member 15469d5a931SRobert Mustacchi.Em ss_family . 15569d5a931SRobert Mustacchi.Ss struct sockaddr_in 15669d5a931SRobert MustacchiThe 15769d5a931SRobert Mustacchi.Sy sockaddr_in 15869d5a931SRobert Mustacchiis the socket type which is used for for the Internet Protocol version 15969d5a931SRobert Mustacchifour (IPv4). It has the following members defined: 16069d5a931SRobert Mustacchi.Bd -literal -offset indent 16169d5a931SRobert Mustacchisa_family_t sin_family /* address family */ 16269d5a931SRobert Mustacchiin_port_t sin_port /* IP port */ 16369d5a931SRobert Mustacchistruct in_addr sin_addr /* IP address */ 16469d5a931SRobert Mustacchi.Ed 16569d5a931SRobert Mustacchi.Lp 16669d5a931SRobert MustacchiThe member 16769d5a931SRobert Mustacchi.Em sin_family 16869d5a931SRobert Mustacchimust always have the value 16969d5a931SRobert Mustacchi.Sy AF_INET 17069d5a931SRobert Mustacchifor 17169d5a931SRobert Mustacchi.Sy IPv4 . 17269d5a931SRobert MustacchiThe members 17369d5a931SRobert Mustacchi.Em sin_port 17469d5a931SRobert Mustacchiand 17569d5a931SRobert Mustacchi.Em sin_addr 17669d5a931SRobert Mustacchidescribe the IP address and IP port to use. In the case of a call to 17769d5a931SRobert Mustacchi.Xr connect 3SOCKET 17869d5a931SRobert Mustacchithese represent the remote IP address and port to which the connection 17969d5a931SRobert Mustacchiis being made. In the case of 18069d5a931SRobert Mustacchi.Xr bind 3SOCKET 18169d5a931SRobert Mustacchithese represent the IP address and port on the local host to which the socket 18269d5a931SRobert Mustacchiis to be bound. In the case of 18369d5a931SRobert Mustacchi.Xr accept 3SOCKET 18469d5a931SRobert Mustacchithese represent the remote IP address and port of the machine whose 18569d5a931SRobert Mustacchiconnection was accepted. 18669d5a931SRobert Mustacchi.Lp 18769d5a931SRobert MustacchiThe member 18869d5a931SRobert Mustacchi.Em sin_port 18969d5a931SRobert Mustacchiis always stored in 19069d5a931SRobert Mustacchi.Sy Network Byte Order . 19169d5a931SRobert MustacchiOn many systems, this differs from the native host byte order. 19269d5a931SRobert MustacchiApplications should read from the member with the function 19369d5a931SRobert Mustacchi.Xr ntohs 3SOCKET 19469d5a931SRobert Mustacchiand write to the member with the function 19569d5a931SRobert Mustacchi.Xr htons 3SOCKET . 19669d5a931SRobert MustacchiThe member 19769d5a931SRobert Mustacchi.Em sin_addr 19869d5a931SRobert Mustacchiis the four byte IPv4 address. It is also stored in network byte order. 19969d5a931SRobert MustacchiThe common way to write out the address is to use the function 20069d5a931SRobert Mustacchi.Xr inet_pton 3SOCKET 20169d5a931SRobert Mustacchiwhich converts between a human readable IP address such as "10.1.2.3" 20269d5a931SRobert Mustacchiand the corresponding representation. 20369d5a931SRobert Mustacchi.Lp 20469d5a931SRobert MustacchiExample 1 shows how to prepare an IPv4 socket and deal with 20569d5a931SRobert Mustacchinetwork byte-order. See 20669d5a931SRobert Mustacchi.Xr inet 7P 20769d5a931SRobert Mustacchiand 20869d5a931SRobert Mustacchi.Xr ip 7P 20969d5a931SRobert Mustacchifor more information on IPv4, socket options, etc. 21069d5a931SRobert Mustacchi.Ss struct sockaddr_in6 21169d5a931SRobert MustacchiThe 21269d5a931SRobert Mustacchi.Sy sockaddr_in6 21369d5a931SRobert Mustacchistructure is the 21469d5a931SRobert Mustacchi.Nm 21569d5a931SRobert Mustacchifor the Internet Protocol version six (IPv6). Unlike the 21669d5a931SRobert Mustacchi.Sy struct sockaddr_in , 21769d5a931SRobert Mustacchithe 21869d5a931SRobert Mustacchi.Sy struct sockaddr_in6 21969d5a931SRobert Mustacchihas additional members beyond those shown here which are required to be 22069d5a931SRobert Mustacchiinitialized to zero through a function such as 22169d5a931SRobert Mustacchi.Xr bzero 3C 22269d5a931SRobert Mustacchior 22369d5a931SRobert Mustacchi.Xr memset 3C . 22469d5a931SRobert MustacchiIf the entire 22569d5a931SRobert Mustacchi.Sy struct sockaddr_in6 22669d5a931SRobert Mustacchiis not zeroed before use, applications will experience undefined behavior. The 22769d5a931SRobert Mustacchi.Sy struct sockaddr_in6 22869d5a931SRobert Mustacchihas the following public members: 22969d5a931SRobert Mustacchi.Bd -literal -offset indent 23069d5a931SRobert Mustacchisa_family_t sin6_family /* address family */ 23169d5a931SRobert Mustacchiin_port_t sin6_port /* IPv6 port */ 23269d5a931SRobert Mustacchistruct in6_addr sin6_addr /* IPv6 address */ 23369d5a931SRobert Mustacchiuint32_t sin6_flowinfo; /* traffic class and flow info */ 23469d5a931SRobert Mustacchiuint32_t sin6_scope_id; /* interface scope */ 23569d5a931SRobert Mustacchi.Ed 23669d5a931SRobert Mustacchi.Lp 23769d5a931SRobert MustacchiThe member 23869d5a931SRobert Mustacchi.Em sin6_family 23969d5a931SRobert Mustacchimust always have the value 24069d5a931SRobert Mustacchi.Sy AF_INET6 . 24169d5a931SRobert MustacchiThe members 24269d5a931SRobert Mustacchi.Em sin6_port 24369d5a931SRobert Mustacchiand 24469d5a931SRobert Mustacchi.Em sin6_addr 24569d5a931SRobert Mustacchiare the IPv6 equivalents of the 24669d5a931SRobert Mustacchi.Sy struct sockaddr_in 24769d5a931SRobert Mustacchi.Em sin_port 24869d5a931SRobert Mustacchiand 24969d5a931SRobert Mustacchi.Em sin_addr . 25069d5a931SRobert MustacchiLike their IPv4 counterparts, both of these members must be in network 25169d5a931SRobert Mustacchibyte order. The member 25269d5a931SRobert Mustacchi.Em sin6_port 25369d5a931SRobert Mustacchidescribes the IPv6 port and should be manipulated with the functions 25469d5a931SRobert Mustacchi.Xr ntohs 3SOCKET 25569d5a931SRobert Mustacchiand 25669d5a931SRobert Mustacchi.Xr htons 3SOCKET . 25769d5a931SRobert MustacchiThe member 25869d5a931SRobert Mustacchi.Em sin6_addr 25969d5a931SRobert Mustacchidescribes the 16-byte IPv6 address. In addition to the function 26069d5a931SRobert Mustacchi.Xr inet_pton 3SOCKET , 26169d5a931SRobert Mustacchithe header file 26269d5a931SRobert Mustacchi.In netinet/in.h 26369d5a931SRobert Mustacchidefines many macros for manipulating and testing IPv6 addresses. 26469d5a931SRobert Mustacchi.Lp 26569d5a931SRobert MustacchiThe member 26669d5a931SRobert Mustacchi.Em sin6_flowinfo 26769d5a931SRobert Mustacchicontains the traffic class and flow label associated with the IPv6 26869d5a931SRobert Mustacchiheader. The member 26969d5a931SRobert Mustacchi.Em sin6_scope_id 27069d5a931SRobert Mustacchimay contain an identifier which varies based on the scope of the address 27169d5a931SRobert Mustacchiin 27269d5a931SRobert Mustacchi.Em sin6_addr . 27369d5a931SRobert MustacchiApplications do not need to initialize 27469d5a931SRobert Mustacchi.Em sin6_scope_id ; 27569d5a931SRobert Mustacchiit will be populated by the operating system as a result of various library 27669d5a931SRobert Mustacchicalls. 27769d5a931SRobert Mustacchi.Lp 27869d5a931SRobert MustacchiExample 2 shows how to prepare an IPv6 socket. For more information on 27969d5a931SRobert MustacchiIPv6, please see 28069d5a931SRobert Mustacchi.Xr inet6 7P 28169d5a931SRobert Mustacchiand 28269d5a931SRobert Mustacchi.Xr ip6 7P . 28369d5a931SRobert Mustacchi.Ss struct sockaddr_un 28469d5a931SRobert MustacchiThe 28569d5a931SRobert Mustacchi.Sy sockaddr_un 28669d5a931SRobert Mustacchistructure specifies the address of a socket used to communicate between 28769d5a931SRobert Mustacchiprocesses running on a single system, commonly known as a 28869d5a931SRobert Mustacchi.Em UNIX domain socket . 28969d5a931SRobert MustacchiSockets of this type are identified by a path in the file system. The 29069d5a931SRobert Mustacchi.Sy struct sockaddr_un 29169d5a931SRobert Mustacchihas the following members: 29269d5a931SRobert Mustacchi.Bd -literal -offset indent 29369d5a931SRobert Mustacchisa_family_t sun_family /* address family */ 29469d5a931SRobert Mustacchichar sun_path[108] /* path name */ 29569d5a931SRobert Mustacchi.Ed 29669d5a931SRobert Mustacchi.Lp 29769d5a931SRobert MustacchiThe member 29869d5a931SRobert Mustacchi.Em sun_family 29969d5a931SRobert Mustacchimust always have the value 30069d5a931SRobert Mustacchi.Sy AF_UNIX . 30169d5a931SRobert MustacchiThe member 30269d5a931SRobert Mustacchi.Em sun_path 30369d5a931SRobert Mustacchiis populated with a 30469d5a931SRobert Mustacchi.Sy NUL 30569d5a931SRobert Mustacchiterminated array of characters that specify a file system path. The maximum 30669d5a931SRobert Mustacchilength of any such path, including the 30769d5a931SRobert Mustacchi.Sy NUL 30869d5a931SRobert Mustacchiterminator, is 108 bytes. 30969d5a931SRobert Mustacchi.Ss struct sockaddr_dl 31069d5a931SRobert MustacchiThe 31169d5a931SRobert Mustacchi.Sy sockaddr_dl 31269d5a931SRobert Mustacchistructure is used to describe a layer 2 link-level address. This is used 31369d5a931SRobert Mustacchias part of various socket ioctls, such as those for 31469d5a931SRobert Mustacchi.Xr arp 7P . 31569d5a931SRobert MustacchiThe structure has the following members: 31669d5a931SRobert Mustacchi.Bd -literal -offset indent 31769d5a931SRobert Mustacchiushort_t sdl_family; /* address family */ 31869d5a931SRobert Mustacchiushort_t sdl_index; /* if != 0, system interface index */ 31969d5a931SRobert Mustacchiuchar_t sdl_type; /* interface type */ 32069d5a931SRobert Mustacchiuchar_t sdl_nlen; /* interface name length */ 32169d5a931SRobert Mustacchiuchar_t sdl_alen; /* link level address length */ 32269d5a931SRobert Mustacchiuchar_t sdl_slen; /* link layer selector length */ 32369d5a931SRobert Mustacchichar sdl_data[244]; /* contains both if name and ll address 32469d5a931SRobert Mustacchi.Ed 32569d5a931SRobert Mustacchi.Lp 32669d5a931SRobert MustacchiThe member 32769d5a931SRobert Mustacchi.Em sdl_family 32869d5a931SRobert Mustacchimust always have the value 32969d5a931SRobert Mustacchi.Sy AF_LINK . 33069d5a931SRobert MustacchiWhen the member 33169d5a931SRobert Mustacchi.Em sdl_index 33269d5a931SRobert Mustacchiis non-zero this refers to the interface identifier that corresponds to 33369d5a931SRobert Mustacchithe 33469d5a931SRobert Mustacchi.Sy struct sockaddr_dl . 33569d5a931SRobert MustacchiThis identifier is the same identifier that's shown by tools like 33669d5a931SRobert Mustacchi.Xr ifconfig 1M 33769d5a931SRobert Mustacchiand used in the SIOC* set of socket ioctls. The member 33869d5a931SRobert Mustacchi.Em sdl_type 33969d5a931SRobert Mustacchirefers to the media that is used for the socket. The most common case is 34069d5a931SRobert Mustacchithat the medium for the interface is Ethernet which has the value 34169d5a931SRobert Mustacchi.Sy IFT_ETHER . 34269d5a931SRobert MustacchiThe full set of types is derived from RFC1573 and recorded in the file 34369d5a931SRobert Mustacchi.In net/if_types.h . 34469d5a931SRobert MustacchiThe member 34569d5a931SRobert Mustacchi.Em sdl_slen 34669d5a931SRobert Mustacchidescribes the length of a selector, if it exists, for the specified 34769d5a931SRobert Mustacchimedium. This is used in protocols such as Trill. 34869d5a931SRobert Mustacchi.Lp 34969d5a931SRobert MustacchiThe 35069d5a931SRobert Mustacchi.Em sdl_data , 35169d5a931SRobert Mustacchi.Em sdl_nlen 35269d5a931SRobert Mustacchiand 35369d5a931SRobert Mustacchi.Em sdl_alen 35469d5a931SRobert Mustacchimembers together describe a character string containing the interface name and 35569d5a931SRobert Mustacchithe link-layer network address. The name starts at the beginning of 35669d5a931SRobert Mustacchi.Em sdl_data , 35769d5a931SRobert Mustacchii.e. at 35869d5a931SRobert Mustacchi.Em sdl_data[0] . 35969d5a931SRobert MustacchiThe name of the interface occupies the next 36069d5a931SRobert Mustacchi.Em sdl_nlen 36169d5a931SRobert Mustacchibytes and is not 36269d5a931SRobert Mustacchi.Sy NUL 36369d5a931SRobert Mustacchiterminated. The link-layer network address begins immediately after the 36469d5a931SRobert Mustacchiinterface name, and is 36569d5a931SRobert Mustacchi.Em sdl_alen 36669d5a931SRobert Mustacchibytes long. The macro 36769d5a931SRobert Mustacchi.Sy LLADDR(struct sockaddr_dl *) 36869d5a931SRobert Mustacchireturns the start of the link-layer network address. 36969d5a931SRobert MustacchiThe interpretation of the link-layer address depends on the value of 37069d5a931SRobert Mustacchi.Em sdl_type . 37169d5a931SRobert MustacchiFor example, if the type is 37269d5a931SRobert Mustacchi.Sy IFT_ETHER 37369d5a931SRobert Mustacchithen the address is expressed as a 6-byte MAC address. 37469d5a931SRobert Mustacchi.Ss struct sockaddr_ll 37569d5a931SRobert MustacchiThe 37669d5a931SRobert Mustacchi.Sy sockaddr_ll 37769d5a931SRobert Mustacchiis used as part of a socket type which is responsible for packet 37869d5a931SRobert Mustacchicapture: 37969d5a931SRobert Mustacchi.Sy AF_PACKET 38069d5a931SRobert Mustacchisockets. It is generally designed for use with Ethernet networks. The members 38169d5a931SRobert Mustacchiof the 38269d5a931SRobert Mustacchi.Sy struct sockaddr_ll 38369d5a931SRobert Mustacchiare: 38469d5a931SRobert Mustacchi.Bd -literal -offset indent 38569d5a931SRobert Mustacchiuint16_t sll_family; /* address family */ 38669d5a931SRobert Mustacchiuint16_t sll_protocol; /* link layer protocol */ 38769d5a931SRobert Mustacchiint32_t sll_ifindex; /* interface index */ 38869d5a931SRobert Mustacchiuint16_t sll_hatype; /* ARP hardware type */ 38969d5a931SRobert Mustacchiuint8_t sll_pkttype; /* packet type */ 39069d5a931SRobert Mustacchiuint8_t sll_halen; /* hardware address length */ 39169d5a931SRobert Mustacchiuint8_t sll_addr[8]; /* hardware type */ 39269d5a931SRobert Mustacchi.Ed 39369d5a931SRobert Mustacchi.Lp 39469d5a931SRobert MustacchiThe member 39569d5a931SRobert Mustacchi.Em sll_family 39669d5a931SRobert Mustacchimust be 39769d5a931SRobert Mustacchi.Sy AF_PACKET . 39869d5a931SRobert MustacchiThe member 39969d5a931SRobert Mustacchi.Em sll_protocol 40069d5a931SRobert Mustacchirefers to a link-layer protocol. For example, when capturing Ethernet frames 40169d5a931SRobert Mustacchithe value of 40269d5a931SRobert Mustacchi.Em sll_protocol 40369d5a931SRobert Mustacchiis the Ethertype. This member is written in network byte order and 40469d5a931SRobert Mustacchiapplications should use 40569d5a931SRobert Mustacchi.Xr htons 3SOCKET 40669d5a931SRobert Mustacchiand 40769d5a931SRobert Mustacchi.Xr ntohs 3SOCKET 40869d5a931SRobert Mustacchito read and write the member. 40969d5a931SRobert Mustacchi.Lp 41069d5a931SRobert MustacchiThe member 41169d5a931SRobert Mustacchi.Em sll_ifindex 41269d5a931SRobert Mustacchiis the interface's index. It is used as an identifier in various ioctls 41369d5a931SRobert Mustacchiand included in the output of 41469d5a931SRobert Mustacchi.Xr ifconfig 1M . 41569d5a931SRobert MustacchiWhen calling 41669d5a931SRobert Mustacchi.Xr bind 3SOCKET 41769d5a931SRobert Mustacchiit should be filled in with the index that corresponds to the interface 41869d5a931SRobert Mustacchifor which packets should be captured on. 41969d5a931SRobert Mustacchi.Lp 42069d5a931SRobert MustacchiThe member 42169d5a931SRobert Mustacchi.Em sll_pkttype 42269d5a931SRobert Mustacchidescribes the type of the packet based on a list of types in the header 42369d5a931SRobert Mustacchifile 42469d5a931SRobert Mustacchi.In netpacket/packet.h . 42569d5a931SRobert MustacchiThese types include: 42669d5a931SRobert Mustacchi.Sy PACKET_OUTGOING , 42769d5a931SRobert Mustacchia packet that was leaving the host and has been looped back for packet capture; 42869d5a931SRobert Mustacchi.Sy PACKET_HOST , 42969d5a931SRobert Mustacchia packet that was destined for this host; 43069d5a931SRobert Mustacchi.Sy PACKET_BROADCAST , 43169d5a931SRobert Mustacchia packet that was broadcast across the link-layer; 43269d5a931SRobert Mustacchi.Sy PACKET_MULTICAST , 43369d5a931SRobert Mustacchia packet that was sent to a link-layer multicast address; and 43469d5a931SRobert Mustacchi.Sy PACKET_OTHERHOST , 43569d5a931SRobert Mustacchia packet that was captured only because the device in question was in 43669d5a931SRobert Mustacchipromiscuous mode. 43769d5a931SRobert Mustacchi.Lp 43869d5a931SRobert MustacchiThe member 43969d5a931SRobert Mustacchi.Em sll_hatype 44069d5a931SRobert Mustacchicontains the hardware type as defined by 44169d5a931SRobert Mustacchi.Xr arp 7P . 44269d5a931SRobert MustacchiThe list of types can be found in 44369d5a931SRobert Mustacchi.In net/if_arp.h . 44469d5a931SRobert MustacchiThe member 44569d5a931SRobert Mustacchi.Em sll_halen 44669d5a931SRobert Mustacchicontains the length, in bytes, of the hardware address, while the member 44769d5a931SRobert Mustacchi.Em sll_addr 44869d5a931SRobert Mustacchicontains the actual address in network byte order. 44969d5a931SRobert Mustacchi.Sh EXAMPLES 45069d5a931SRobert Mustacchi.Sy Example 1 45169d5a931SRobert MustacchiPreparing an IPv4 45269d5a931SRobert Mustacchi.Sy sockaddr_in 45369d5a931SRobert Mustacchito connect to a remote host 45469d5a931SRobert Mustacchi.Lp 45569d5a931SRobert MustacchiThe following example shows how one would open a socket and prepare it 45669d5a931SRobert Mustacchito connect to the remote host whose address is the IP address 127.0.0.1 45769d5a931SRobert Mustacchion port 80. This program should be compiled with the C compiler 45869d5a931SRobert Mustacchi.Sy cc 45969d5a931SRobert Mustacchiand linked against the libraries libsocket and libnsl. If this example 46069d5a931SRobert Mustacchiwas named ip4.c, then the full link line would be 46169d5a931SRobert Mustacchi.Ic cc ip4.c -lsocket -lnsl . 46269d5a931SRobert Mustacchi.Bd -literal 46369d5a931SRobert Mustacchi#include <sys/types.h> 46469d5a931SRobert Mustacchi#include <sys/socket.h> 46569d5a931SRobert Mustacchi#include <stdio.h> 46669d5a931SRobert Mustacchi#include <netinet/in.h> 46769d5a931SRobert Mustacchi#include <inttypes.h> 46869d5a931SRobert Mustacchi#include <strings.h> 46969d5a931SRobert Mustacchi 47069d5a931SRobert Mustacchiint 47169d5a931SRobert Mustacchimain(void) 47269d5a931SRobert Mustacchi{ 47369d5a931SRobert Mustacchi int sock; 47469d5a931SRobert Mustacchi struct sockaddr_in in; 47569d5a931SRobert Mustacchi 47669d5a931SRobert Mustacchi if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 47769d5a931SRobert Mustacchi perror("socket"); 47869d5a931SRobert Mustacchi return (1); 47969d5a931SRobert Mustacchi } 48069d5a931SRobert Mustacchi 48169d5a931SRobert Mustacchi bzero(&in, sizeof (struct sockaddr_in)); 48269d5a931SRobert Mustacchi in.sin_family = AF_INET; 48369d5a931SRobert Mustacchi in.sin_port = htons(80); 48469d5a931SRobert Mustacchi if (inet_pton(AF_INET, "127.0.0.1", &in.sin_addr) != 1) { 48569d5a931SRobert Mustacchi perror("inet_pton"); 48669d5a931SRobert Mustacchi return (1); 48769d5a931SRobert Mustacchi } 48869d5a931SRobert Mustacchi 48969d5a931SRobert Mustacchi if (connect(sock, (struct sockaddr *)&in, 49069d5a931SRobert Mustacchi sizeof (struct sockaddr_in)) != 0) { 49169d5a931SRobert Mustacchi perror("connect"); 49269d5a931SRobert Mustacchi return (1); 49369d5a931SRobert Mustacchi } 49469d5a931SRobert Mustacchi 49569d5a931SRobert Mustacchi /* use socket */ 49669d5a931SRobert Mustacchi 49769d5a931SRobert Mustacchi return (0); 49869d5a931SRobert Mustacchi} 49969d5a931SRobert Mustacchi.Ed 50069d5a931SRobert Mustacchi.Lp 50169d5a931SRobert Mustacchi.Sy Example 2 50269d5a931SRobert MustacchiPreparing an IPv6 50369d5a931SRobert Mustacchi.Sy sockaddr_in6 50469d5a931SRobert Mustacchito bind to a local address 50569d5a931SRobert Mustacchi.Lp 50669d5a931SRobert MustacchiThe following example shows how one would open a socket and prepare it 50769d5a931SRobert Mustacchito bind to the local IPv6 address ::1 port on port 12345. This program 50869d5a931SRobert Mustacchishould be compiled with the C compiler 50969d5a931SRobert Mustacchi.Sy cc 51069d5a931SRobert Mustacchiand linked aginst the libraries libsocket and libnsl. If this example 51169d5a931SRobert Mustacchiwas named ip6.c, then the full compiler line would be 51269d5a931SRobert Mustacchi.Ic cc ip6.c -lsocket -lnsl . 51369d5a931SRobert Mustacchi.Bd -literal 51469d5a931SRobert Mustacchi#include <sys/types.h> 51569d5a931SRobert Mustacchi#include <sys/socket.h> 51669d5a931SRobert Mustacchi#include <stdio.h> 51769d5a931SRobert Mustacchi#include <netinet/in.h> 51869d5a931SRobert Mustacchi#include <inttypes.h> 51969d5a931SRobert Mustacchi#include <strings.h> 52069d5a931SRobert Mustacchi 52169d5a931SRobert Mustacchiint 52269d5a931SRobert Mustacchimain(void) 52369d5a931SRobert Mustacchi{ 52469d5a931SRobert Mustacchi int sock6; 52569d5a931SRobert Mustacchi struct sockaddr_in6 in6; 52669d5a931SRobert Mustacchi 52769d5a931SRobert Mustacchi if ((sock6 = socket(AF_INET6, SOCK_STREAM, 0)) < 0) { 52869d5a931SRobert Mustacchi perror("socket"); 52969d5a931SRobert Mustacchi return (1); 53069d5a931SRobert Mustacchi } 53169d5a931SRobert Mustacchi 53269d5a931SRobert Mustacchi bzero(&in6, sizeof (struct sockaddr_in6)); 53369d5a931SRobert Mustacchi in6.sin6_family = AF_INET6; 53469d5a931SRobert Mustacchi in6.sin6_port = htons(12345); 53569d5a931SRobert Mustacchi if (inet_pton(AF_INET6, "::1", &in6.sin6_addr) != 1) { 53669d5a931SRobert Mustacchi perror("inet_pton"); 53769d5a931SRobert Mustacchi return (1); 53869d5a931SRobert Mustacchi } 53969d5a931SRobert Mustacchi 54069d5a931SRobert Mustacchi if (bind(sock6, (struct sockaddr *)&in6, 54169d5a931SRobert Mustacchi sizeof (struct sockaddr_in6)) != 0) { 54269d5a931SRobert Mustacchi perror("bind"); 54369d5a931SRobert Mustacchi return (1); 54469d5a931SRobert Mustacchi } 54569d5a931SRobert Mustacchi 54669d5a931SRobert Mustacchi /* use server socket */ 54769d5a931SRobert Mustacchi 54869d5a931SRobert Mustacchi return (0); 54969d5a931SRobert Mustacchi} 55069d5a931SRobert Mustacchi.Ed 55169d5a931SRobert Mustacchi.Sh SEE ALSO 55269d5a931SRobert Mustacchi.Xr socket 3HEAD , 55369d5a931SRobert Mustacchi.Xr uh.h 3HEAD , 55469d5a931SRobert Mustacchi.Xr accept 3SOCKET , 55569d5a931SRobert Mustacchi.Xr bind 3SOCKET , 55669d5a931SRobert Mustacchi.Xr connect 3SOCKET , 55769d5a931SRobert Mustacchi.Xr socket 3SOCKET , 55869d5a931SRobert Mustacchi.Xr arp 7P , 55969d5a931SRobert Mustacchi.Xr inet 7P , 56069d5a931SRobert Mustacchi.Xr inet6 7P , 56169d5a931SRobert Mustacchi.Xr ip 7P , 56269d5a931SRobert Mustacchi.Xr ip6 7P , 563