xref: /titanic_41/usr/src/man/man3socket/sockaddr.3socket (revision 6aa162920eb3dd899ca64c57f0bf9138fadd6fcb)
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