summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/truss/codes.c3
-rw-r--r--usr/src/uts/common/inet/ip/ip.c7
-rw-r--r--usr/src/uts/common/inet/ip/ip_arp.c2
-rw-r--r--usr/src/uts/common/inet/ip/ip_if.c111
-rw-r--r--usr/src/uts/common/inet/ip_arp.h4
-rw-r--r--usr/src/uts/common/inet/ip_if.h5
-rw-r--r--usr/src/uts/common/inet/sockmods/netpacket/packet.h34
-rw-r--r--usr/src/uts/common/inet/sockmods/sockmod_pfp.c115
-rw-r--r--usr/src/uts/common/net/if_arp.h9
-rw-r--r--usr/src/uts/common/sys/sockio.h12
-rw-r--r--usr/src/uts/intel/sockpfp/Makefile2
-rw-r--r--usr/src/uts/sparc/sockpfp/Makefile2
12 files changed, 271 insertions, 35 deletions
diff --git a/usr/src/cmd/truss/codes.c b/usr/src/cmd/truss/codes.c
index 313bc2e6d1..119dba0aac 100644
--- a/usr/src/cmd/truss/codes.c
+++ b/usr/src/cmd/truss/codes.c
@@ -878,6 +878,9 @@ const struct ioc {
{ (uint_t)SIOCSIPMSFILTER, "SIOCSIPMSFILTER", "ip_msfilter" },
{ (uint_t)SIOCGLIFDADSTATE, "SIOCGLIFDADSTATE", "lifreq" },
{ (uint_t)SIOCSLIFPREFIX, "SIOCSLIFPREFIX", "lifreq" },
+ { (uint_t)SIOCGSTAMP, "SIOCGSTAMP", "timeval" },
+ { (uint_t)SIOCGIFHWADDR, "SIOCGIFHWADDR", "ifreq" },
+ { (uint_t)SIOCGLIFHWADDR, "SIOCGLIFHWADDR", "lifreq" },
/* DES encryption */
{ (uint_t)DESIOCBLOCK, "DESIOCBLOCK", "desparams" },
diff --git a/usr/src/uts/common/inet/ip/ip.c b/usr/src/uts/common/inet/ip/ip.c
index 4399164c1e..20ac270d97 100644
--- a/usr/src/uts/common/inet/ip/ip.c
+++ b/usr/src/uts/common/inet/ip/ip.c
@@ -1101,7 +1101,8 @@ ip_ioctl_cmd_t ip_ndx_ioctl_table[] = {
/* SIOCSENABLESDP is handled by SDP */
/* 183 */ { IPI_DONTCARE /* SIOCSENABLESDP */, 0, 0, 0, NULL, NULL },
/* 184 */ { IPI_DONTCARE /* SIOCSQPTR */, 0, 0, 0, NULL, NULL },
- /* 185 */ { IPI_DONTCARE /* SIOCGIFHWADDR */, 0, 0, 0, NULL, NULL },
+ /* 185 */ { SIOCGIFHWADDR, sizeof (struct ifreq), IPI_GET_CMD,
+ IF_CMD, ip_sioctl_get_ifhwaddr, NULL },
/* 186 */ { IPI_DONTCARE /* SIOCGSTAMP */, 0, 0, 0, NULL, NULL },
/* 187 */ { SIOCILB, 0, IPI_PRIV | IPI_GET_CMD, MISC_CMD,
ip_sioctl_ilb_cmd, NULL },
@@ -1110,7 +1111,9 @@ ip_ioctl_cmd_t ip_ndx_ioctl_table[] = {
/* 190 */ { SIOCGLIFDADSTATE, sizeof (struct lifreq),
IPI_GET_CMD, LIF_CMD, ip_sioctl_get_dadstate, NULL },
/* 191 */ { SIOCSLIFPREFIX, sizeof (struct lifreq), IPI_PRIV | IPI_WR,
- LIF_CMD, ip_sioctl_prefix, ip_sioctl_prefix_restart }
+ LIF_CMD, ip_sioctl_prefix, ip_sioctl_prefix_restart },
+ /* 192 */ { SIOCGLIFHWADDR, sizeof (struct lifreq), IPI_GET_CMD,
+ LIF_CMD, ip_sioctl_get_lifhwaddr, NULL }
};
int ip_ndx_ioctl_count = sizeof (ip_ndx_ioctl_table) / sizeof (ip_ioctl_cmd_t);
diff --git a/usr/src/uts/common/inet/ip/ip_arp.c b/usr/src/uts/common/inet/ip/ip_arp.c
index d4e217d29f..683fcf577e 100644
--- a/usr/src/uts/common/inet/ip/ip_arp.c
+++ b/usr/src/uts/common/inet/ip/ip_arp.c
@@ -355,7 +355,7 @@ arp_m_lookup(t_uscalar_t mac_type)
return (NULL);
}
-static uint32_t
+uint32_t
arp_hw_type(t_uscalar_t mactype)
{
arp_m_t *arm;
diff --git a/usr/src/uts/common/inet/ip/ip_if.c b/usr/src/uts/common/inet/ip/ip_if.c
index 96e638838a..5cf0f76bcd 100644
--- a/usr/src/uts/common/inet/ip/ip_if.c
+++ b/usr/src/uts/common/inet/ip/ip_if.c
@@ -19042,3 +19042,114 @@ ill_lookup_usesrc(ill_t *usill)
rw_exit(&ipst->ips_ill_g_usesrc_lock);
return (ill);
}
+
+/*
+ * This comment applies to both ip_sioctl_get_ifhwaddr and
+ * ip_sioctl_get_lifhwaddr as the basic function of these two functions
+ * is the same.
+ *
+ * The goal here is to find an IP interface that corresponds to the name
+ * provided by the caller in the ifreq/lifreq structure held in the mblk_t
+ * chain and to fill out a sockaddr/sockaddr_storage structure with the
+ * mac address.
+ *
+ * The SIOCGIFHWADDR/SIOCGLIFHWADDR ioctl may return an error for a number
+ * of different reasons:
+ * ENXIO - the device name is not known to IP.
+ * EADDRNOTAVAIL - the device has no hardware address. This is indicated
+ * by ill_phys_addr not pointing to an actual address.
+ * EPFNOSUPPORT - this will indicate that a request is being made for a
+ * mac address that will not fit in the data structure supplier (struct
+ * sockaddr).
+ *
+ */
+/* ARGSUSED */
+int
+ip_sioctl_get_ifhwaddr(ipif_t *ipif, sin_t *dummy_sin, queue_t *q, mblk_t *mp,
+ ip_ioctl_cmd_t *ipip, void *if_req)
+{
+ struct sockaddr *sock;
+ struct ifreq *ifr;
+ mblk_t *mp1;
+ ill_t *ill;
+
+ ASSERT(ipif != NULL);
+ ill = ipif->ipif_ill;
+
+ if (ill->ill_phys_addr == NULL) {
+ return (EADDRNOTAVAIL);
+ }
+ if (ill->ill_phys_addr_length > sizeof (sock->sa_data)) {
+ return (EPFNOSUPPORT);
+ }
+
+ ip1dbg(("ip_sioctl_get_hwaddr(%s)\n", ill->ill_name));
+
+ /* Existence of mp1 has been checked in ip_wput_nondata */
+ mp1 = mp->b_cont->b_cont;
+ ifr = (struct ifreq *)mp1->b_rptr;
+
+ sock = &ifr->ifr_addr;
+ /*
+ * The "family" field in the returned structure is set to a value
+ * that represents the type of device to which the address belongs.
+ * The value returned may differ to that on Linux but it will still
+ * represent the correct symbol on Solaris.
+ */
+ sock->sa_family = arp_hw_type(ill->ill_mactype);
+ bcopy(ill->ill_phys_addr, &sock->sa_data, ill->ill_phys_addr_length);
+
+ return (0);
+}
+
+/*
+ * The expection of applications using SIOCGIFHWADDR is that data will
+ * be returned in the sa_data field of the sockaddr structure. With
+ * SIOCGLIFHWADDR, we're breaking new ground as there is no Linux
+ * equivalent. In light of this, struct sockaddr_dl is used as it
+ * offers more space for address storage in sll_data.
+ */
+/* ARGSUSED */
+int
+ip_sioctl_get_lifhwaddr(ipif_t *ipif, sin_t *dummy_sin, queue_t *q, mblk_t *mp,
+ ip_ioctl_cmd_t *ipip, void *if_req)
+{
+ struct sockaddr_dl *sock;
+ struct lifreq *lifr;
+ mblk_t *mp1;
+ ill_t *ill;
+
+ ASSERT(ipif != NULL);
+ ill = ipif->ipif_ill;
+
+ if (ill->ill_phys_addr == NULL) {
+ return (EADDRNOTAVAIL);
+ }
+ if (ill->ill_phys_addr_length > sizeof (sock->sdl_data)) {
+ return (EPFNOSUPPORT);
+ }
+
+ ip1dbg(("ip_sioctl_get_lifhwaddr(%s)\n", ill->ill_name));
+
+ /* Existence of mp1 has been checked in ip_wput_nondata */
+ mp1 = mp->b_cont->b_cont;
+ lifr = (struct lifreq *)mp1->b_rptr;
+
+ /*
+ * sockaddr_ll is used here because it is also the structure used in
+ * responding to the same ioctl in sockpfp. The only other choice is
+ * sockaddr_dl which contains fields that are not required here
+ * because its purpose is different.
+ */
+ lifr->lifr_type = ill->ill_type;
+ sock = (struct sockaddr_dl *)&lifr->lifr_addr;
+ sock->sdl_family = AF_LINK;
+ sock->sdl_index = ill->ill_phyint->phyint_ifindex;
+ sock->sdl_type = ill->ill_mactype;
+ sock->sdl_nlen = 0;
+ sock->sdl_slen = 0;
+ sock->sdl_alen = ill->ill_phys_addr_length;
+ bcopy(ill->ill_phys_addr, sock->sdl_data, ill->ill_phys_addr_length);
+
+ return (0);
+}
diff --git a/usr/src/uts/common/inet/ip_arp.h b/usr/src/uts/common/inet/ip_arp.h
index 2cb7e7a05a..91ce356549 100644
--- a/usr/src/uts/common/inet/ip_arp.h
+++ b/usr/src/uts/common/inet/ip_arp.h
@@ -20,8 +20,7 @@
*/
/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#ifndef _IP_ARP_H
@@ -115,6 +114,7 @@ extern int arl_get_muxid(ill_t *);
extern void arp_send_replumb_conf(ill_t *);
extern void arp_unbind_complete(ill_t *);
extern ill_t *arl_to_ill(arl_t *);
+extern uint32_t arp_hw_type(t_uscalar_t);
#endif
#define ARP_RETRANS_TIMER 500 /* time in milliseconds */
diff --git a/usr/src/uts/common/inet/ip_if.h b/usr/src/uts/common/inet/ip_if.h
index e36dcc1ff5..a625ec9238 100644
--- a/usr/src/uts/common/inet/ip_if.h
+++ b/usr/src/uts/common/inet/ip_if.h
@@ -479,6 +479,11 @@ extern int ip_sioctl_get_lifsrcof(ipif_t *, sin_t *, queue_t *,
extern int ip_sioctl_get_dadstate(ipif_t *, sin_t *, queue_t *, mblk_t *,
ip_ioctl_cmd_t *, void *);
+extern int ip_sioctl_get_ifhwaddr(ipif_t *, sin_t *, queue_t *, mblk_t *,
+ ip_ioctl_cmd_t *, void *);
+extern int ip_sioctl_get_lifhwaddr(ipif_t *, sin_t *, queue_t *, mblk_t *,
+ ip_ioctl_cmd_t *, void *);
+
extern void ip_sioctl_copyin_resume(ipsq_t *, queue_t *, mblk_t *, void *);
extern void ip_sioctl_copyin_setup(queue_t *, mblk_t *);
extern ip_ioctl_cmd_t *ip_sioctl_lookup(int);
diff --git a/usr/src/uts/common/inet/sockmods/netpacket/packet.h b/usr/src/uts/common/inet/sockmods/netpacket/packet.h
index 4d00ca9c60..1ac16dd02e 100644
--- a/usr/src/uts/common/inet/sockmods/netpacket/packet.h
+++ b/usr/src/uts/common/inet/sockmods/netpacket/packet.h
@@ -20,14 +20,14 @@
*/
/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#ifndef _PACKET_H
#define _PACKET_H
#include <sys/socket_impl.h>
+#include <net/if_arp.h>
#include <net/bpf.h>
/*
@@ -116,26 +116,25 @@ struct sock_fprog {
*
* The numbers above 50000 are because their real value is unknown from
* libpcap's source, so a number has been chosen that is unlikely to be
- * confused with the real one on Linux.
+ * confused with the real one on Linux. Those that are already found in
+ * Solaris inside <net/if_arp.h> may have a different value to that found
+ * in Linux but it should be used instead as the Solaris value originates
+ * from the IANA whereas the Linux values seem to ignore it.
*/
-#define ARPHRD_ADAPT 50001
-#define ARPHRD_ARCNET 50002
-#define ARPHRD_ATM 19
-#define ARPHRD_AX25 50003
-#define ARPHRD_CHAOS 50004
-#define ARPHRD_CISCO 513
+/* ARPHRD_AX25 see <net/if_arp.h> */
+/* ARPHRD_CHAOS see <net/if_arp.h> */
#define ARPHRD_CSLIP 50005
#define ARPHRD_CSLIP6 50006
#define ARPHRD_DLCI 15
-#define ARPHRD_EETHER 50007
-#define ARPHRD_ETHER 50008
+/* ARPHRD_EETHER see <net/if_arp.h> */
+/* ARPHRD_ETHER see <net/if_arp.h> */
#define ARPHRD_FCAL 785
#define ARPHRD_FCFABRIC 787
#define ARPHRD_FCPL 786
#define ARPHRD_FCPP 784
#define ARPHRD_FRAD 770
#define ARPHRD_FDDI 774
-#define ARPHRD_IEEE802 50009
+/* ARPHRD_IEEE802 see <net/if_arp.h> */
#define ARPHRD_IEEE802_TR 800
#define ARPHRD_IEEE80211 801
#define ARPHRD_IEEE80211_PRISM 802
@@ -144,14 +143,21 @@ struct sock_fprog {
#define ARPHRD_LAPD 8445
#define ARPHRD_LOCALTLK 50010
#define ARPHRD_LOOPBACK 50011
-#define ARPHRD_METRICOM 50012
+/* ARPHRD_METRICOM see <net/if_arp.h> */
#define ARPHRD_PRONET 50013
#define ARPHRD_PPP 50014
#define ARPHRD_RAWHDLC 518
#define ARPHRD_SIT 776
#define ARPHRD_SLIP6 50015
#define ARPHRD_SLIP 50016
-#define ARPHRD_TUNNEL 50017
+/* ARPHRD_TUNNEL see <net/if_arp.h> */
+
+#define ETH_P_ALL 0
+#define ETH_P_802_2 0xaa /* LSAP_SAP */
+#define ETH_P_803_3 0
+#define ETH_P_IP 0x800
+#define ETH_P_ARP 0x806
+#define ETH_P_IPV6 0x86dd
#ifdef _KERNEL
/*
diff --git a/usr/src/uts/common/inet/sockmods/sockmod_pfp.c b/usr/src/uts/common/inet/sockmods/sockmod_pfp.c
index f090dbb329..ed2a8ff5b1 100644
--- a/usr/src/uts/common/inet/sockmods/sockmod_pfp.c
+++ b/usr/src/uts/common/inet/sockmods/sockmod_pfp.c
@@ -39,8 +39,11 @@
#include <sys/tihdr.h>
#include <sys/zone.h>
#include <sys/time.h>
+#include <sys/ethernet.h>
+#include <sys/llc1.h>
#include <fs/sockfs/sockcommon.h>
#include <net/if.h>
+#include <inet/ip_arp.h>
#include <sys/dls.h>
#include <sys/mac.h>
@@ -151,6 +154,12 @@ static smod_reg_t sinfo = {
NULL
};
+static int accepted_protos[3][2] = {
+ { ETH_P_ALL, 0 },
+ { ETH_P_802_2, LLC_SNAP_SAP },
+ { ETH_P_803_3, 0 },
+};
+
/*
* Module linkage information for the kernel.
*/
@@ -252,6 +261,8 @@ sockpfp_create(int family, int type, int proto,
{
struct pfpsock *ps;
int kmflags;
+ int newproto;
+ int i;
if (secpolicy_net_rawaccess(cred) != 0) {
*errorp = EACCES;
@@ -268,6 +279,33 @@ sockpfp_create(int family, int type, int proto,
return (NULL);
}
+ /*
+ * First check to see if the protocol number passed in via the socket
+ * creation should be mapped to a different number for internal use.
+ */
+ for (i = 0, newproto = -1;
+ i < sizeof (accepted_protos)/ sizeof (accepted_protos[0]); i++) {
+ if (accepted_protos[i][0] == proto) {
+ newproto = accepted_protos[i][1];
+ break;
+ }
+ }
+
+ /*
+ * If the mapping of the protocol that was under 0x800 failed to find
+ * a local equivalent then fail the socket creation. If the protocol
+ * for the socket is over 0x800 and it was not found in the mapping
+ * table above, then use the value as is.
+ */
+ if (newproto == -1) {
+ if (proto < 0x800) {
+ *errorp = ENOPROTOOPT;
+ return (NULL);
+ }
+ newproto = proto;
+ }
+ proto = newproto;
+
kmflags = (sflags & SOCKET_NOSLEEP) ? KM_NOSLEEP : KM_SLEEP;
ps = kmem_zalloc(sizeof (*ps), kmflags);
if (ps == NULL) {
@@ -838,6 +876,7 @@ sdpfp_ioctl(sock_lower_handle_t handle, int cmd, intptr_t arg, int mod,
struct timeval tival;
#endif
mac_client_promisc_type_t mtype;
+ struct sockaddr_dl *sock;
datalink_id_t linkid;
struct lifreq lifreq;
struct ifreq ifreq;
@@ -854,6 +893,7 @@ sdpfp_ioctl(sock_lower_handle_t handle, int cmd, intptr_t arg, int mod,
case SIOCGLIFINDEX :
case SIOCGLIFFLAGS :
case SIOCGLIFMTU :
+ case SIOCGLIFHWADDR :
error = pfp_lifreq_getlinkid(arg, &lifreq, &linkid);
if (error != 0)
return (error);
@@ -936,10 +976,56 @@ sdpfp_ioctl(sock_lower_handle_t handle, int cmd, intptr_t arg, int mod,
break;
case SIOCGIFHWADDR :
- mac_unicast_primary_get(mh, (uint8_t *)ifreq.ifr_addr.sa_data);
+ if (mac_addr_len(mh) > sizeof (ifreq.ifr_addr.sa_data)) {
+ error = EPFNOSUPPORT;
+ break;
+ }
+
+ if (mac_addr_len(mh) == 0) {
+ (void) memset(ifreq.ifr_addr.sa_data, 0,
+ sizeof (ifreq.ifr_addr.sa_data));
+ } else {
+ mac_unicast_primary_get(mh,
+ (uint8_t *)ifreq.ifr_addr.sa_data);
+ }
+
+ /*
+ * The behaviour here in setting sa_family is consistent
+ * with what applications such as tcpdump would expect
+ * for a Linux PF_PACKET socket.
+ */
ifreq.ifr_addr.sa_family = pfp_dl_to_arphrd(mac_type(mh));
break;
+ case SIOCGLIFHWADDR :
+ lifreq.lifr_type = 0;
+ sock = (struct sockaddr_dl *)&lifreq.lifr_addr;
+
+ if (mac_addr_len(mh) > sizeof (sock->sdl_data)) {
+ error = EPFNOSUPPORT;
+ break;
+ }
+
+ /*
+ * Fill in the sockaddr_dl with link layer details. Of note,
+ * the index is returned as 0 for a couple of reasons:
+ * (1) there is no public API that uses or requires it
+ * (2) the MAC index is currently 32bits and sdl_index is 16.
+ */
+ sock->sdl_family = AF_LINK;
+ sock->sdl_index = 0;
+ sock->sdl_type = mac_type(mh);
+ sock->sdl_nlen = 0;
+ sock->sdl_alen = mac_addr_len(mh);
+ sock->sdl_slen = 0;
+ if (mac_addr_len(mh) == 0) {
+ (void) memset(sock->sdl_data, 0,
+ sizeof (sock->sdl_data));
+ } else {
+ mac_unicast_primary_get(mh, (uint8_t *)sock->sdl_data);
+ }
+ break;
+
case SIOCGSTAMP :
(void) gethrestime(&tv);
tival.tv_sec = (time_t)tv.tv_sec;
@@ -961,6 +1047,7 @@ sdpfp_ioctl(sock_lower_handle_t handle, int cmd, intptr_t arg, int mod,
case SIOCGLIFINDEX :
case SIOCGLIFFLAGS :
case SIOCGLIFMTU :
+ case SIOCGLIFHWADDR :
error = ddi_copyout(&lifreq, (void *)arg,
sizeof (lifreq), 0);
break;
@@ -1128,16 +1215,16 @@ pfp_setpacket_sockopt(sock_lower_handle_t handle, int option_name,
bcopy(optval, &mreq, sizeof (mreq));
if (ps->ps_linkid != mreq.mr_ifindex)
return (EINVAL);
-
- if (mreq.mr_alen !=
- ((struct sockaddr_ll *)&ps->ps_sock)->sll_halen)
- return (EINVAL);
}
switch (option_name) {
case PACKET_ADD_MEMBERSHIP :
switch (mreq.mr_type) {
case PACKET_MR_MULTICAST :
+ if (mreq.mr_alen !=
+ ((struct sockaddr_ll *)&ps->ps_sock)->sll_halen)
+ return (EINVAL);
+
error = mac_multicast_add(ps->ps_mch, mreq.mr_address);
break;
@@ -1154,6 +1241,10 @@ pfp_setpacket_sockopt(sock_lower_handle_t handle, int option_name,
case PACKET_DROP_MEMBERSHIP :
switch (mreq.mr_type) {
case PACKET_MR_MULTICAST :
+ if (mreq.mr_alen !=
+ ((struct sockaddr_ll *)&ps->ps_sock)->sll_halen)
+ return (EINVAL);
+
mac_multicast_remove(ps->ps_mch, mreq.mr_address);
break;
@@ -1393,11 +1484,19 @@ pfp_set_promisc(struct pfpsock *ps, mac_client_promisc_type_t turnon)
/*
* This table maps the MAC types in Solaris to the ARPHRD_* values used
- * on Linux. This is used with the SIOCGIFHWADDR ioctl.
+ * on Linux. This is used with the SIOCGIFHWADDR/SIOCGLIFHWADDR ioctl.
+ *
+ * The symbols in this table are *not* pulled in from <net/if_arp.h>,
+ * they are pulled from <netpacket/packet.h>, thus it acts as a source
+ * of supplementary information to the ARP table.
*/
static uint_t arphrd_to_dl[][2] = {
- { ARPHRD_ETHER, DL_ETHER },
{ ARPHRD_IEEE80211, DL_WIFI },
+ { ARPHRD_TUNNEL, DL_IPV4 },
+ { ARPHRD_TUNNEL, DL_IPV6 },
+ { ARPHRD_TUNNEL, DL_6TO4 },
+ { ARPHRD_AX25, DL_X25 },
+ { ARPHRD_ATM, DL_ATM },
{ 0, 0 }
};
@@ -1409,5 +1508,5 @@ pfp_dl_to_arphrd(int dltype)
for (i = 0; arphrd_to_dl[i][0] != 0; i++)
if (arphrd_to_dl[i][1] == dltype)
return (arphrd_to_dl[i][0]);
- return (0);
+ return (arp_hw_type(dltype));
}
diff --git a/usr/src/uts/common/net/if_arp.h b/usr/src/uts/common/net/if_arp.h
index 073ce5cf2a..20cb83f4ee 100644
--- a/usr/src/uts/common/net/if_arp.h
+++ b/usr/src/uts/common/net/if_arp.h
@@ -1,6 +1,5 @@
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved.
*/
/*
@@ -12,7 +11,6 @@
#ifndef _NET_IF_ARP_H
#define _NET_IF_ARP_H
-#pragma ident "%Z%%M% %I% %E% SMI"
/* if_arp.h 1.5 88/08/19 SMI; from UCB 7.1 1/24/86 */
#include <sys/types.h>
@@ -35,12 +33,17 @@ extern "C" {
struct arphdr {
ushort_t ar_hrd; /* format of hardware address */
#define ARPHRD_ETHER 1 /* ethernet hardware address */
+#define ARPHRD_EETHER 2 /* experimental ethernet */
+#define ARPHRD_AX25 3 /* amateur readio ax.25 */
+#define ARPHRD_CHAOS 5 /* Chaos net */
#define ARPHRD_IEEE802 6 /* IEEE 802 hardware address */
+#define ARPHRD_ARCNET 7 /* ARCNET */
#define ARPHRD_FRAME 15 /* Frame relay */
#define ARPHRD_ATM 16 /* ATM */
#define ARPHRD_HDLC 17 /* HDLC */
#define ARPHRD_FC 18 /* Fibre Channel RFC 4338 */
#define ARPHRD_IPATM 19 /* ATM RFC 2225 */
+#define ARPHRD_METRICOM 23 /* Metricom */
#define ARPHRD_TUNNEL 31 /* IPsec Tunnel RFC 3456 */
#define ARPHRD_IB 32 /* IPoIB hardware address */
ushort_t ar_pro; /* format of protocol address */
diff --git a/usr/src/uts/common/sys/sockio.h b/usr/src/uts/common/sys/sockio.h
index b81c30b373..e7ce53eb16 100644
--- a/usr/src/uts/common/sys/sockio.h
+++ b/usr/src/uts/common/sys/sockio.h
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
*/
/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
@@ -310,7 +309,12 @@ extern "C" {
#define SIOCSQPTR _IOWR('i', 184, int) /* set q_ptr of stream */
-#define SIOCGIFHWADDR _IOWR('i', 185, int) /* PF_PACKET */
+/*
+ * SIOCGIFHWADDR and SIOCGLIFHWADDR (below) are available for PF_PACKET,
+ * PF_INET and PF_INET6 sockets.
+ */
+#define SIOCGIFHWADDR _IOWR('i', 185, struct ifreq)
+
#define SIOCGSTAMP _IOWR('i', 186, struct timeval) /* PF_PACKET */
/*
@@ -337,6 +341,8 @@ extern "C" {
*/
#define SIOCSLIFPREFIX _IOWR('i', 191, struct lifreq)
+#define SIOCGLIFHWADDR _IOWR('i', 192, struct lifreq)
+
#ifdef __cplusplus
}
#endif
diff --git a/usr/src/uts/intel/sockpfp/Makefile b/usr/src/uts/intel/sockpfp/Makefile
index 75552bd987..0273c7a909 100644
--- a/usr/src/uts/intel/sockpfp/Makefile
+++ b/usr/src/uts/intel/sockpfp/Makefile
@@ -58,7 +58,7 @@ INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
#
CFLAGS += $(CCVERBOSE)
-LDFLAGS += -dy -Nfs/sockfs -Nmisc/dls -Nmisc/mac -Ndrv/bpf
+LDFLAGS += -dy -Nfs/sockfs -Nmisc/dls -Nmisc/mac -Ndrv/bpf -Nsrc/ip
INC_PATH += -I$(UTSBASE)/common/inet/sockmods -I$(UTSBASE)/common/io/bpf
#
diff --git a/usr/src/uts/sparc/sockpfp/Makefile b/usr/src/uts/sparc/sockpfp/Makefile
index f329b33e62..612575651a 100644
--- a/usr/src/uts/sparc/sockpfp/Makefile
+++ b/usr/src/uts/sparc/sockpfp/Makefile
@@ -58,7 +58,7 @@ INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
#
CFLAGS += $(CCVERBOSE)
-LDFLAGS += -dy -Nfs/sockfs -Nmisc/dls -Nmisc/mac -Ndrv/bpf
+LDFLAGS += -dy -Nfs/sockfs -Nmisc/dls -Nmisc/mac -Ndrv/bpf -Ndrv/ip
INC_PATH += -I$(UTSBASE)/common/inet/sockmods -I$(UTSBASE)/common/io/bpf
#