1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _IP_ARP_H 28 #define _IP_ARP_H 29 30 /* 31 * Data-structures and functions related to the IP STREAMS queue that handles 32 * packets with the SAP set to 0x806 (ETHERTYPE_ARP). 33 */ 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 #include <sys/types.h> 40 #include <inet/ip.h> 41 #include <inet/ip_ndp.h> 42 #include <sys/stream.h> 43 44 #ifdef _KERNEL 45 extern struct streamtab dummymodinfo; 46 47 struct arl_ill_common_s; 48 /* 49 * The arl_s structure tracks the state of the associated ARP stream. 50 */ 51 typedef struct arl_s { 52 queue_t *arl_rq; 53 queue_t *arl_wq; 54 ip_stack_t *arl_ipst; 55 zoneid_t arl_zoneid; 56 cred_t *arl_credp; 57 ip_m_t arl_media; 58 struct arl_ill_common_s *arl_common; 59 int arl_muxid; 60 uint_t arl_ppa; 61 t_uscalar_t arl_sap; 62 t_uscalar_t arl_sap_length; 63 uint_t arl_phys_addr_length; 64 char *arl_name; 65 int arl_name_length; 66 t_uscalar_t arl_mactype; 67 #define arl_first_mp_to_free arl_dlpi_deferred 68 mblk_t *arl_dlpi_deferred; 69 mblk_t *arl_unbind_mp; 70 mblk_t *arl_detach_mp; 71 #define arl_last_mp_to_free arl_detach_mp 72 uint_t arl_state_flags; 73 uint_t 74 arl_needs_attach:1, 75 arl_dlpi_style_set:1, 76 arl_pad_to_bit_31:30; 77 uint_t arl_refcnt; 78 kcondvar_t arl_cv; 79 t_uscalar_t arl_dlpi_pending; 80 kmutex_t arl_lock; 81 int arl_error; 82 } arl_t; 83 84 /* 85 * The arl_ill_common_t structure is a super-structure that contains pointers 86 * to a pair of matching ill_t, arl_t structures. Given an arl_t (or 87 * ill_t) the corresponding ill_t (or arl_t) must be obtained by 88 * synchronizing on the ai_lock, and ensuring that the desired ill/arl 89 * pointer is non-null, not condemned. The arl_ill_common_t is allocated in 90 * arl_init() and freed only when both the ill_t and the arl_t structures 91 * become NULL. 92 * Lock hierarchy: the ai_lock must be take before the ill_lock or arl_lock. 93 */ 94 95 typedef struct arl_ill_common_s { 96 kmutex_t ai_lock; 97 ill_t *ai_ill; 98 arl_t *ai_arl; 99 kcondvar_t ai_ill_unplumb_done; /* sent from ip_modclose() */ 100 } arl_ill_common_t; 101 102 extern boolean_t arp_no_defense; 103 104 extern struct module_info arp_mod_info; 105 extern int arp_ll_up(ill_t *); 106 extern int arp_ll_down(ill_t *); 107 extern boolean_t arp_announce(ncec_t *); 108 extern boolean_t arp_probe(ncec_t *); 109 extern int arp_request(ncec_t *, in_addr_t, ill_t *); 110 extern void arp_failure(mblk_t *, ip_recv_attr_t *); 111 extern int arl_wait_for_info_ack(arl_t *); 112 extern int arl_init(queue_t *, arl_t *); 113 extern void arl_set_muxid(ill_t *, int); 114 extern int arl_get_muxid(ill_t *); 115 extern void arp_send_replumb_conf(ill_t *); 116 extern void arp_unbind_complete(ill_t *); 117 extern ill_t *arl_to_ill(arl_t *); 118 #endif 119 120 #define ARP_RETRANS_TIMER 500 /* time in milliseconds */ 121 122 /* The following are arl_state_flags */ 123 #define ARL_LL_SUBNET_PENDING 0x01 /* Waiting for DL_INFO_ACK from drv */ 124 #define ARL_CONDEMNED 0x02 /* No more new ref's to the ILL */ 125 #define ARL_DL_UNBIND_IN_PROGRESS 0x04 /* UNBIND_REQ is sent */ 126 #define ARL_LL_BIND_PENDING 0x0020 /* BIND sent */ 127 #define ARL_LL_UP 0x0040 /* BIND acked */ 128 #define ARL_LL_DOWN 0x0080 129 #define ARL_LL_UNBOUND 0x0100 /* UNBIND acked */ 130 #define ARL_LL_REPLUMBING 0x0200 /* replumb in progress */ 131 132 #ifdef __cplusplus 133 } 134 #endif 135 136 #endif /* _IP_ARP_H */ 137