17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5e11c3f44Smeem * Common Development and Distribution License (the "License"). 6e11c3f44Smeem * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 210406ceaaSmeem 227c478bd9Sstevel@tonic-gate /* 23*64639aafSDarren Reed * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. 247c478bd9Sstevel@tonic-gate */ 257c478bd9Sstevel@tonic-gate 267c478bd9Sstevel@tonic-gate #ifndef _LIBINETUTIL_H 277c478bd9Sstevel@tonic-gate #define _LIBINETUTIL_H 287c478bd9Sstevel@tonic-gate 297c478bd9Sstevel@tonic-gate /* 300406ceaaSmeem * Contains SMI-private API for general Internet functionality 317c478bd9Sstevel@tonic-gate */ 327c478bd9Sstevel@tonic-gate 337c478bd9Sstevel@tonic-gate #ifdef __cplusplus 347c478bd9Sstevel@tonic-gate extern "C" { 357c478bd9Sstevel@tonic-gate #endif 367c478bd9Sstevel@tonic-gate 377c478bd9Sstevel@tonic-gate #include <netinet/inetutil.h> 387c478bd9Sstevel@tonic-gate #include <sys/types.h> 397c478bd9Sstevel@tonic-gate #include <sys/socket.h> 407c478bd9Sstevel@tonic-gate #include <netinet/in.h> 417c478bd9Sstevel@tonic-gate #include <net/if.h> 427c478bd9Sstevel@tonic-gate 437c478bd9Sstevel@tonic-gate #if !defined(_KERNEL) && !defined(_BOOT) 447c478bd9Sstevel@tonic-gate 457c478bd9Sstevel@tonic-gate typedef struct { 467c478bd9Sstevel@tonic-gate uint_t ifsp_ppa; /* Physical Point of Attachment */ 477c478bd9Sstevel@tonic-gate uint_t ifsp_lun; /* Logical Unit number */ 487c478bd9Sstevel@tonic-gate boolean_t ifsp_lunvalid; /* TRUE if lun is valid */ 497c478bd9Sstevel@tonic-gate char ifsp_devnm[LIFNAMSIZ]; /* only the device name */ 507c478bd9Sstevel@tonic-gate } ifspec_t; 517c478bd9Sstevel@tonic-gate 527c478bd9Sstevel@tonic-gate extern boolean_t ifparse_ifspec(const char *, ifspec_t *); 537c478bd9Sstevel@tonic-gate extern void get_netmask4(const struct in_addr *, struct in_addr *); 54e11c3f44Smeem extern boolean_t sockaddrcmp(const struct sockaddr_storage *, 55e11c3f44Smeem const struct sockaddr_storage *); 56*64639aafSDarren Reed extern int plen2mask(uint_t, sa_family_t, struct sockaddr *); 57*64639aafSDarren Reed extern int mask2plen(const struct sockaddr *); 58*64639aafSDarren Reed extern boolean_t sockaddrunspec(const struct sockaddr *); 597c478bd9Sstevel@tonic-gate 607c478bd9Sstevel@tonic-gate /* 610406ceaaSmeem * Extended version of the classic BSD ifaddrlist() interface: 620406ceaaSmeem * 63e11c3f44Smeem * int ifaddrlist(struct ifaddrlist **addrlistp, int af, uint_t flags, 64e11c3f44Smeem * char *errbuf); 650406ceaaSmeem * 660406ceaaSmeem * * addrlistp: Upon success, ifaddrlist() sets *addrlistp to a 670406ceaaSmeem * dynamically-allocated array of addresses. 680406ceaaSmeem * 690406ceaaSmeem * * af: Either AF_INET to obtain IPv4 addresses, or AF_INET6 to 700406ceaaSmeem * obtain IPv6 addresses. 710406ceaaSmeem * 72e11c3f44Smeem * * flags: LIFC_* flags that control the classes of interfaces that 73e11c3f44Smeem * will be visible. 74e11c3f44Smeem * 750406ceaaSmeem * * errbuf: A caller-supplied buffer of ERRBUFSIZE. Upon failure, 760406ceaaSmeem * provides the reason for the failure. 770406ceaaSmeem * 780406ceaaSmeem * Upon success, ifaddrlist() returns the number of addresses in the array 790406ceaaSmeem * pointed to by `addrlistp'. If the count is 0, then `addrlistp' is NULL. 800406ceaaSmeem */ 810406ceaaSmeem union any_in_addr { 820406ceaaSmeem struct in6_addr addr6; 830406ceaaSmeem struct in_addr addr; 840406ceaaSmeem }; 850406ceaaSmeem 860406ceaaSmeem struct ifaddrlist { 870406ceaaSmeem int index; /* interface index */ 880406ceaaSmeem union any_in_addr addr; /* interface address */ 890406ceaaSmeem char device[LIFNAMSIZ + 1]; /* interface name */ 900406ceaaSmeem uint64_t flags; /* interface flags */ 910406ceaaSmeem }; 920406ceaaSmeem 93e11c3f44Smeem #define ERRBUFSIZE 128 /* expected size of fourth argument */ 940406ceaaSmeem 95e11c3f44Smeem extern int ifaddrlist(struct ifaddrlist **, int, uint_t, char *); 96e11c3f44Smeem 97e11c3f44Smeem /* 98e11c3f44Smeem * Similar to ifaddrlist(), but returns a linked-list of addresses for a 99e11c3f44Smeem * *specific* interface name, and allows specific address flags to be matched 100e11c3f44Smeem * against. A linked list is used rather than an array so that information 101e11c3f44Smeem * can grow over time without affecting binary compatibility. Also, leaves 102e11c3f44Smeem * error-handling up to the caller. Returns the number of ifaddrlistx's 103e11c3f44Smeem * chained through ifaddrp. 104e11c3f44Smeem * 105e11c3f44Smeem * int ifaddrlistx(const char *ifname, uint64_t set, uint64_t clear, 106e11c3f44Smeem * ifaddrlistx_t **ifaddrp); 107e11c3f44Smeem * 108e11c3f44Smeem * * ifname: Interface name to match against. 109e11c3f44Smeem * 110e11c3f44Smeem * * set: One or more flags that must be set on the address for 111e11c3f44Smeem * it to be returned. 112e11c3f44Smeem * 113e11c3f44Smeem * * clear: Flags that must be clear on the address for it to be 114e11c3f44Smeem * returned. 115e11c3f44Smeem * 116e11c3f44Smeem * * ifaddrp: Upon success, ifaddrlistx() sets *ifaddrp to the head 117e11c3f44Smeem * of a dynamically-allocated array of ifaddrlistx structures. 118e11c3f44Smeem * 119e11c3f44Smeem * Once done, the caller must free `ifaddrp' by calling ifaddrlistx_free(). 120e11c3f44Smeem */ 121e11c3f44Smeem typedef struct ifaddrlistx { 122e11c3f44Smeem struct ifaddrlistx *ia_next; 123e11c3f44Smeem char ia_name[LIFNAMSIZ]; 124e11c3f44Smeem uint64_t ia_flags; 125e11c3f44Smeem struct sockaddr_storage ia_addr; 126e11c3f44Smeem } ifaddrlistx_t; 127e11c3f44Smeem 128e11c3f44Smeem extern int ifaddrlistx(const char *, uint64_t, uint64_t, ifaddrlistx_t **); 129e11c3f44Smeem extern void ifaddrlistx_free(ifaddrlistx_t *); 1300406ceaaSmeem 1310406ceaaSmeem /* 1327c478bd9Sstevel@tonic-gate * Timer queues 1337c478bd9Sstevel@tonic-gate * 1347c478bd9Sstevel@tonic-gate * timer queues are a facility for managing timeouts in unix. in the 1357c478bd9Sstevel@tonic-gate * event driven model, unix provides us with poll(2)/select(3C), which 1367c478bd9Sstevel@tonic-gate * allow us to coordinate waiting on multiple descriptors with an 1377c478bd9Sstevel@tonic-gate * optional timeout. however, often (as is the case with the DHCP 1387c478bd9Sstevel@tonic-gate * agent), we want to manage multiple independent timeouts (say, one 1397c478bd9Sstevel@tonic-gate * for waiting for an OFFER to come back from a server in response to 1407c478bd9Sstevel@tonic-gate * a DISCOVER sent out on one interface, and another for waiting for 1417c478bd9Sstevel@tonic-gate * the T1 time on another interface). timer queues allow us to do 1427c478bd9Sstevel@tonic-gate * this in the event-driven model. 1437c478bd9Sstevel@tonic-gate * 1447c478bd9Sstevel@tonic-gate * note that timer queues do not in and of themselves provide the 1457c478bd9Sstevel@tonic-gate * event driven model (for instance, there is no handle_events() 1467c478bd9Sstevel@tonic-gate * routine). they merely provide the hooks to support multiple 1477c478bd9Sstevel@tonic-gate * independent timeouts. this is done for both simplicity and 1487c478bd9Sstevel@tonic-gate * applicability (for instance, while one approach would be to use 1497c478bd9Sstevel@tonic-gate * this timer queue with poll(2), another one would be to use SIGALRM 1507c478bd9Sstevel@tonic-gate * to wake up periodically, and then process all the expired timers.) 1517c478bd9Sstevel@tonic-gate */ 1527c478bd9Sstevel@tonic-gate 1537c478bd9Sstevel@tonic-gate typedef struct iu_timer_queue iu_tq_t; 1547c478bd9Sstevel@tonic-gate 1557c478bd9Sstevel@tonic-gate /* 1567c478bd9Sstevel@tonic-gate * a iu_timer_id_t refers to a given timer. its value should not be 1577c478bd9Sstevel@tonic-gate * interpreted by the interface consumer. it is a signed arithmetic 1587c478bd9Sstevel@tonic-gate * type, and no valid iu_timer_id_t has the value `-1'. 1597c478bd9Sstevel@tonic-gate */ 1607c478bd9Sstevel@tonic-gate 1617c478bd9Sstevel@tonic-gate typedef int iu_timer_id_t; 1627c478bd9Sstevel@tonic-gate 163dbed73cbSSangeeta Misra #define IU_TIMER_ID_MAX 4096 /* max number of concurrent timers */ 1647c478bd9Sstevel@tonic-gate 1657c478bd9Sstevel@tonic-gate /* 1667c478bd9Sstevel@tonic-gate * a iu_tq_callback_t is a function that is called back in response to a 1677c478bd9Sstevel@tonic-gate * timer expiring. it may then carry out any necessary work, 1687c478bd9Sstevel@tonic-gate * including rescheduling itself for callback or scheduling / 1697c478bd9Sstevel@tonic-gate * cancelling other timers. the `void *' argument is the same value 1707c478bd9Sstevel@tonic-gate * that was passed into iu_schedule_timer(), and if it is dynamically 1717c478bd9Sstevel@tonic-gate * allocated, it is the callback's responsibility to know that, and to 1727c478bd9Sstevel@tonic-gate * free it. 1737c478bd9Sstevel@tonic-gate */ 1747c478bd9Sstevel@tonic-gate 1757c478bd9Sstevel@tonic-gate typedef void iu_tq_callback_t(iu_tq_t *, void *); 1767c478bd9Sstevel@tonic-gate 1777c478bd9Sstevel@tonic-gate iu_tq_t *iu_tq_create(void); 1787c478bd9Sstevel@tonic-gate void iu_tq_destroy(iu_tq_t *); 1797c478bd9Sstevel@tonic-gate iu_timer_id_t iu_schedule_timer(iu_tq_t *, uint32_t, iu_tq_callback_t *, 1807c478bd9Sstevel@tonic-gate void *); 1817c478bd9Sstevel@tonic-gate iu_timer_id_t iu_schedule_timer_ms(iu_tq_t *, uint64_t, iu_tq_callback_t *, 1827c478bd9Sstevel@tonic-gate void *); 1837c478bd9Sstevel@tonic-gate int iu_adjust_timer(iu_tq_t *, iu_timer_id_t, uint32_t); 1847c478bd9Sstevel@tonic-gate int iu_cancel_timer(iu_tq_t *, iu_timer_id_t, void **); 1857c478bd9Sstevel@tonic-gate int iu_expire_timers(iu_tq_t *); 1867c478bd9Sstevel@tonic-gate int iu_earliest_timer(iu_tq_t *); 1877c478bd9Sstevel@tonic-gate 1887c478bd9Sstevel@tonic-gate /* 1897c478bd9Sstevel@tonic-gate * Event Handler 1907c478bd9Sstevel@tonic-gate * 1917c478bd9Sstevel@tonic-gate * an event handler is an object-oriented "wrapper" for select(3C) / 1927c478bd9Sstevel@tonic-gate * poll(2), aimed to make the event demultiplexing system calls easier 1937c478bd9Sstevel@tonic-gate * to use and provide a generic reusable component. instead of 1947c478bd9Sstevel@tonic-gate * applications directly using select(3C) / poll(2), they register 1957c478bd9Sstevel@tonic-gate * events that should be received with the event handler, providing a 1967c478bd9Sstevel@tonic-gate * callback function to call when the event occurs. they then call 1977c478bd9Sstevel@tonic-gate * iu_handle_events() to wait and callback the registered functions 1987c478bd9Sstevel@tonic-gate * when events occur. also called a `reactor'. 1997c478bd9Sstevel@tonic-gate */ 2007c478bd9Sstevel@tonic-gate 2017c478bd9Sstevel@tonic-gate typedef struct iu_event_handler iu_eh_t; 2027c478bd9Sstevel@tonic-gate 2037c478bd9Sstevel@tonic-gate /* 2047c478bd9Sstevel@tonic-gate * an iu_event_id_t refers to a given event. its value should not be 2057c478bd9Sstevel@tonic-gate * interpreted by the interface consumer. it is a signed arithmetic 2067c478bd9Sstevel@tonic-gate * type, and no valid iu_event_id_t has the value `-1'. 2077c478bd9Sstevel@tonic-gate */ 2087c478bd9Sstevel@tonic-gate 2097c478bd9Sstevel@tonic-gate typedef int iu_event_id_t; 2107c478bd9Sstevel@tonic-gate 2117c478bd9Sstevel@tonic-gate /* 2127c478bd9Sstevel@tonic-gate * an iu_eh_callback_t is a function that is called back in response to 2137c478bd9Sstevel@tonic-gate * an event occurring. it may then carry out any work necessary in 2147c478bd9Sstevel@tonic-gate * response to the event. it receives the file descriptor upon which 2157c478bd9Sstevel@tonic-gate * the event occurred, a bit array of events that occurred (the same 2167c478bd9Sstevel@tonic-gate * array used as the revents by poll(2)), and its context through the 2177c478bd9Sstevel@tonic-gate * `void *' that was originally passed into iu_register_event(). 2187c478bd9Sstevel@tonic-gate * 2197c478bd9Sstevel@tonic-gate * NOTE: the same descriptor may not be registered multiple times for 2207c478bd9Sstevel@tonic-gate * different callbacks. if this behavior is desired, either use dup(2) 2217c478bd9Sstevel@tonic-gate * to get a unique descriptor, or demultiplex in the callback function 2227c478bd9Sstevel@tonic-gate * based on the events. 2237c478bd9Sstevel@tonic-gate */ 2247c478bd9Sstevel@tonic-gate 2257c478bd9Sstevel@tonic-gate typedef void iu_eh_callback_t(iu_eh_t *, int, short, iu_event_id_t, void *); 2267c478bd9Sstevel@tonic-gate typedef void iu_eh_sighandler_t(iu_eh_t *, int, void *); 2277c478bd9Sstevel@tonic-gate typedef boolean_t iu_eh_shutdown_t(iu_eh_t *, void *); 2287c478bd9Sstevel@tonic-gate 2297c478bd9Sstevel@tonic-gate iu_eh_t *iu_eh_create(void); 2307c478bd9Sstevel@tonic-gate void iu_eh_destroy(iu_eh_t *); 2317c478bd9Sstevel@tonic-gate iu_event_id_t iu_register_event(iu_eh_t *, int, short, iu_eh_callback_t *, 2327c478bd9Sstevel@tonic-gate void *); 2337c478bd9Sstevel@tonic-gate int iu_unregister_event(iu_eh_t *, iu_event_id_t, void **); 2347c478bd9Sstevel@tonic-gate int iu_handle_events(iu_eh_t *, iu_tq_t *); 2357c478bd9Sstevel@tonic-gate void iu_stop_handling_events(iu_eh_t *, unsigned int, 2367c478bd9Sstevel@tonic-gate iu_eh_shutdown_t *, void *); 2377c478bd9Sstevel@tonic-gate int iu_eh_register_signal(iu_eh_t *, int, iu_eh_sighandler_t *, 2387c478bd9Sstevel@tonic-gate void *); 2397c478bd9Sstevel@tonic-gate int iu_eh_unregister_signal(iu_eh_t *, int, void **); 2407c478bd9Sstevel@tonic-gate 2417c478bd9Sstevel@tonic-gate #endif /* !defined(_KERNEL) && !defined(_BOOT) */ 2427c478bd9Sstevel@tonic-gate 2437c478bd9Sstevel@tonic-gate #ifdef __cplusplus 2447c478bd9Sstevel@tonic-gate } 2457c478bd9Sstevel@tonic-gate #endif 2467c478bd9Sstevel@tonic-gate 2477c478bd9Sstevel@tonic-gate #endif /* !_LIBINETUTIL_H */ 248