The project team is ready to integrate this case, and implementation
differs slightly from the approved spec. Below are the details of these
deviations. In my opinion, these are minor enough that they can be
included in this case as spec updates. Please let me know if you
disagree, and I can also file a separate case (which would likely be
self-reviewed).
1. Additions for libdlpi.so
The approved spec contained the following text:
Moreover, in order to shield applications from the details of
accessing these and other upcoming DLPI devices proposed by
Clearview, we will be proposing a public libdlpi.so library as
part of an upcoming case.
That case was PSARC 2006/436, and the dlpi_open() function is the
function that shields applications from the details of DLPI device
access. Two new dlpi_open() flags are being included with this
case to implement this:
DLPI_DEVIPNET Causes dlpi_open() to only open DLPI style-1
devices from the /dev/ipnet directory.
DLPI_IPNETINFO Causes dlpi_open() to issue a DLIPNETINFO
ioctl to the DLPI device after opening it,
thereby enabling the inclusion of
dl_ipnetinfo_t headers in front of received
packets from /dev/ipnet or /dev/lo0 devices.
A new libdlpi error code, DLPI_EIPNETINFONOTSUP, is also included.
The dlpi_open() function fails with this error if the
DLPI_IPNETINFO flag was set but the device opened doesn't support
the DLIOCIPNETINFO ioctl.
2. Miscellaneous Symbol Name Changes
Original Interface New Interface Comment
-----------------------------------------------------------------------
DL_IOC_IPNET_INFO DLIOCIPNETINFO <sys/dlpi.h>
struct dl_ipnet_info dl_ipnetinfo_t <sys/dlpi.h>
net_getlif_flags() net_getlifflags() <sys/neti.h>
ips_register_hook() ipobs_register_hook() (Project Private)
ips_unregister_hook() ipobs_unregister_hook() (Project Private)
zoneid zone snoop keyword
PRIV_IP_OBSERVABILITY PRIV_NET_OBSERVABILITY
3. <inet/ipnet.h> Not Committed
As approved, the <inet/ipnet.h> was a Committed interface because
it contained the Committed DL_IOC_IPNET_INFO ioctl, the
dl_ipnet_info header, and the DL_IPNETINFO_VERSION constant. These
are moved to <sys/dlpi.h> (and renamed in some cases, see section
2), and <inet/ipnet.h> is now Project-Private.
4. Changes to Netinfo
The project did not need to introduce the NE_SET_ZONE NIC event as
originally anticipated, so this is no longer included in this case.
The previously Committed net_getlifflags() and net_getlifzone()
functions, and NE_LIF_UP and NE_LIF_DOWN NIC events will be
Consolidation-Private, as there is very little implementation
experience to warrant their being Committed, and the project team
doesn't feel confident further sedimenting the concept of "logical
interfaces" into this API.
5. Clarification of Project-Private ipobs_* Kernel Interfaces
The case documented the use of ipobs_register_hook() and
ipobs_unregister_hook() for consumers like the ipnet module to gain
access to IP packets.
The case was silent on how access to those packets would be
achieved. The following set of Project-Private functions are used
for this purpose:
ipobs_init(ip_stack_t *ipst)
Called in IP's stack initialization function to initialize
the IP observability callback list and other private
per-stack data structures.
ipobs_fini(ip_stack_t *ipst)
Called in IP's stack tear-down function to free what was
instantiated in ipobs_init().
ipobs_hook(mblk_t *mp, ipobs_hook_type_t htype, zoneid_t zsrc,
zoneid_t zdst, ill_t *ill, int ipver, uint32_t hlen,
ip_stack_t ipst)
The function used to distribute an IP packet to registered
consumers.