diff options
Diffstat (limited to 'usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.h')
-rw-r--r-- | usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.h | 366 |
1 files changed, 366 insertions, 0 deletions
diff --git a/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.h b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.h new file mode 100644 index 0000000000..36cfd59f47 --- /dev/null +++ b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.h @@ -0,0 +1,366 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2003 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _NDPD_TABLES_H +#define _NDPD_TABLES_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +#ifdef __cplusplus +extern "C" { +#endif + +enum adv_states { NO_ADV = 0, REG_ADV, INIT_ADV, SOLICIT_ADV, FINAL_ADV }; +enum adv_events { ADV_OFF, START_INIT_ADV, START_FINAL_ADV, RECEIVED_SOLICIT, + ADV_TIMER }; + +enum solicit_states { NO_SOLICIT = 0, INIT_SOLICIT, DONE_SOLICIT }; +enum solicit_events { SOLICIT_OFF, START_INIT_SOLICIT, SOL_TIMER, + SOLICIT_DONE }; + +/* + * Data structures used to handle configuration variables set in ndpd.conf. + * cf_notdefault is set for variables explicitly set in ndpd.conf. + */ +struct confvar { + uint_t cf_value; + boolean_t cf_notdefault; +}; + +extern struct confvar ifdefaults[]; + +/* + * Interfaces configuration variable indicies + */ +#define I_DupAddrDetectTransmits 0 /* From RFC 2462 */ +#define I_AdvSendAdvertisements 1 +#define I_MaxRtrAdvInterval 2 /* In seconds */ +#define I_MinRtrAdvInterval 3 /* In seconds */ +#define I_AdvManagedFlag 4 +#define I_AdvOtherConfigFlag 5 +#define I_AdvLinkMTU 6 +#define I_AdvReachableTime 7 /* In milliseconds */ +#define I_AdvRetransTimer 8 /* In milliseconds */ +#define I_AdvCurHopLimit 9 +#define I_AdvDefaultLifetime 10 /* In seconds */ +#define I_StatelessAddrConf 11 +#define I_TmpAddrsEnabled 12 /* From RFC 3041 */ +#define I_TmpValidLifetime 13 /* In seconds */ +#define I_TmpPreferredLifetime 14 /* In seconds */ +#define I_TmpRegenAdvance 15 /* In seconds */ +#define I_TmpMaxDesyncFactor 16 /* In seconds */ +#define I_IFSIZE 17 /* # of variables */ + +/* + * A doubly linked list of all physical interfaces that each contain a + * doubly linked list of prefixes (i.e. logical interfaces) and default + * routers. + */ +struct phyint { + struct phyint *pi_next; + struct phyint *pi_prev; + struct prefix *pi_prefix_list; /* Doubly linked prefixes */ + struct router *pi_router_list; /* Doubly linked routers */ + struct adv_prefix *pi_adv_prefix_list; /* Doubly linked adv.prefixes */ + + uint_t pi_index; /* Identifier > 0 */ + char pi_name[LIFNAMSIZ]; /* Used to identify it */ + int pi_sock; /* For sending and receiving */ + struct in6_addr pi_ifaddr; /* Local address */ + uint_t pi_flags; /* IFF_* flags */ + uint_t pi_hdw_addr_len; + uchar_t pi_hdw_addr[ND_MAX_HDW_LEN]; + uint_t pi_mtu; /* From SIOCGLIFMTU */ + struct in6_addr pi_token; + uint_t pi_token_length; + struct in6_addr pi_tmp_token; /* For RFC3041 addrs */ + struct in6_addr pi_dst_token; /* For POINTOPOINT */ + + uint_t pi_state; /* PI_* below */ + uint_t pi_kernel_state; /* PI_* below */ + boolean_t pi_onlink_default; /* Has onlink default route */ + uint_t pi_num_k_routers; /* # routers in kernel */ + uint_t pi_reach_time_since_random; /* In milliseconds */ + + /* Applies if pi_AdvSendAdvertisements */ + uint_t pi_adv_time_left; /* In milliseconds */ + uint_t pi_adv_time_since_sent; /* In milliseconds */ + enum adv_states pi_adv_state; + uint_t pi_adv_count; + + /* Applies if not pi_AdvSendAdvertisements */ + uint_t pi_sol_time_left; /* In milliseconds */ + enum solicit_states pi_sol_state; + uint_t pi_sol_count; + + /* Interface specific configurable variables */ + struct confvar pi_config[I_IFSIZE]; +#define pi_DupAddrDetectTransmits pi_config[I_DupAddrDetectTransmits].cf_value +#define pi_AdvSendAdvertisements pi_config[I_AdvSendAdvertisements].cf_value +#define pi_MaxRtrAdvInterval pi_config[I_MaxRtrAdvInterval].cf_value +#define pi_MinRtrAdvInterval pi_config[I_MinRtrAdvInterval].cf_value +#define pi_AdvManagedFlag pi_config[I_AdvManagedFlag].cf_value +#define pi_AdvOtherConfigFlag pi_config[I_AdvOtherConfigFlag].cf_value +#define pi_AdvLinkMTU pi_config[I_AdvLinkMTU].cf_value +#define pi_AdvReachableTime pi_config[I_AdvReachableTime].cf_value +#define pi_AdvRetransTimer pi_config[I_AdvRetransTimer].cf_value +#define pi_AdvCurHopLimit pi_config[I_AdvCurHopLimit].cf_value +#define pi_AdvDefaultLifetime pi_config[I_AdvDefaultLifetime].cf_value +#define pi_StatelessAddrConf pi_config[I_StatelessAddrConf].cf_value +#define pi_TmpAddrsEnabled pi_config[I_TmpAddrsEnabled].cf_value +#define pi_TmpValidLifetime pi_config[I_TmpValidLifetime].cf_value +#define pi_TmpPreferredLifetime pi_config[I_TmpPreferredLifetime].cf_value +#define pi_TmpRegenAdvance pi_config[I_TmpRegenAdvance].cf_value +#define pi_TmpMaxDesyncFactor pi_config[I_TmpMaxDesyncFactor].cf_value + + /* Recorded variables for RFC3041 addresses */ + uint_t pi_TmpDesyncFactor; /* In milliseconds */ + uint_t pi_TmpRegenCountdown; /* In milliseconds */ + + /* Recorded variables on node/host */ + uint_t pi_LinkMTU; + uint_t pi_CurHopLimit; + uint_t pi_BaseReachableTime; /* In milliseconds */ + uint_t pi_ReachableTime; /* In milliseconds */ + /* + * The above value should be a uniformly-distributed random + * value between ND_MIN_RANDOM_FACTOR and + * ND_MAX_RANDOM_FACTOR times BaseReachableTime + * milliseconds. A new random value should be + * calculated when BaseReachableTime changes (due to + * Router Advertisements) or at least every few hours + * even if no Router Advertisements are received. + * Tracked using pi_each_time_since_random. + */ + uint_t pi_RetransTimer; /* In milliseconds */ + char *pi_group_name; +}; + +/* + * pi_state/pr_kernel_state values + */ +#define PI_PRESENT 0x01 +#define PI_JOINED_ALLNODES 0x02 /* allnodes multicast joined */ +#define PI_JOINED_ALLROUTERS 0x04 /* allrouters multicast joined */ + +/* + * Prefix configuration variable indices + */ +#define I_AdvValidLifetime 0 /* In seconds */ +#define I_AdvOnLinkFlag 1 +#define I_AdvPreferredLifetime 2 /* In seconds */ +#define I_AdvAutonomousFlag 3 +#define I_AdvValidExpiration 4 /* Seconds left */ +#define I_AdvPreferredExpiration 5 /* Seconds left */ +#define I_PREFIXSIZE 6 /* # of variables */ + +/* + * A doubly linked list of prefixes for onlink and addrconf. + */ +struct prefix { + struct prefix *pr_next; /* Next prefix for this physical */ + struct prefix *pr_prev; /* Prev prefix for this physical */ + struct phyint *pr_physical; /* Back pointer */ + + struct in6_addr pr_prefix; /* Used to indentify prefix */ + uint_t pr_prefix_len; /* Num bits valid */ + + char pr_name[LIFNAMSIZ]; + struct in6_addr pr_address; + uint64_t pr_flags; /* IFF_* flags */ + + uint_t pr_state; /* PR_ONLINK | PR_AUTO etc */ + uint_t pr_kernel_state; /* PR_ONLINK | PR_AUTO etc */ + boolean_t pr_in_use; /* To detect removed prefixes */ + + /* Recorded variables on node/host */ + uint_t pr_ValidLifetime; /* In ms w/ 2 hour rule */ + uint_t pr_PreferredLifetime; /* In millseconds */ + uint_t pr_OnLinkLifetime; /* ms valid w/o 2 hour rule */ + boolean_t pr_OnLinkFlag; + boolean_t pr_AutonomousFlag; + + uint_t pr_CreateTime; /* tmpaddr creation time */ + /* in SECONDS */ +}; + +/* + * Flags used for pr_kernel_state and pr_state where the latter is + * user-level state. + */ +#define PR_ONLINK 0x01 /* On-link */ +#define PR_AUTO 0x02 /* Stateless addrconf */ +#define PR_DEPRECATED 0x04 /* Address is deprecated */ +#define PR_STATIC 0x08 /* Not created by ndpd */ + +/* + * The sum of all possible state string lengths, plus terminating + * null character; if new states are added, this needs to be updated. + * Useful for passing an appropriately sized buffer to prefix_print_state(). + * + * Current strings: "ONLINK ", "AUTO ", "DEPRECATED ", "STATIC ", "\n" + * 7 + 5 + 11 + 7 + 1 + */ +#define PREFIX_STATESTRLEN 31 + +/* Prefix used for storing advertisement specific stuff */ +struct adv_prefix { + struct adv_prefix *adv_pr_next; /* Next prefix */ + struct adv_prefix *adv_pr_prev; /* Prev prefix */ + struct phyint *adv_pr_physical; /* Back pointer */ + + struct in6_addr adv_pr_prefix; /* Used to indentify prefix */ + uint_t adv_pr_prefix_len; /* Num bits valid */ + + /* Used when sending advertisements */ + struct confvar adv_pr_config[I_PREFIXSIZE]; +#define adv_pr_AdvValidLifetime adv_pr_config[I_AdvValidLifetime].cf_value +#define adv_pr_AdvOnLinkFlag adv_pr_config[I_AdvOnLinkFlag].cf_value +#define adv_pr_AdvPreferredLifetime \ + adv_pr_config[I_AdvPreferredLifetime].cf_value +#define adv_pr_AdvAutonomousFlag \ + adv_pr_config[I_AdvAutonomousFlag].cf_value +#define adv_pr_AdvValidExpiration \ + adv_pr_config[I_AdvValidExpiration].cf_value +#define adv_pr_AdvPreferredExpiration \ + adv_pr_config[I_AdvPreferredExpiration].cf_value + /* The two below are set if the timers decrement in real time */ +#define adv_pr_AdvValidRealTime \ + adv_pr_config[I_AdvValidExpiration].cf_notdefault +#define adv_pr_AdvPreferredRealTime \ + adv_pr_config[I_AdvPreferredExpiration].cf_notdefault +}; + +/* + * Doubly-linked list of default routers on a phyint. + */ +struct router { + struct router *dr_next; /* Next router for this physical */ + struct router *dr_prev; /* Prev router for this physical */ + struct phyint *dr_physical; /* Back pointer */ + + struct in6_addr dr_address; /* Used to identify the router */ + uint_t dr_lifetime; /* In milliseconds */ + boolean_t dr_inkernel; /* Route added to kernel */ + boolean_t dr_onlink; /* Is this the onlink default route? */ +}; + +/* + * Globals + */ +extern struct phyint *phyints; + + +/* + * Functions + */ +extern uint_t getcurrenttime(void); + +extern struct phyint *phyint_lookup(char *name); +extern struct phyint *phyint_lookup_on_index(uint_t ifindex); +extern struct phyint *phyint_create(char *name); +extern int phyint_init_from_k(struct phyint *pi); +extern void phyint_delete(struct phyint *pi); +extern uint_t phyint_timer(struct phyint *pi, uint_t elapsed); +extern void phyint_print_all(void); +extern void phyint_reach_random(struct phyint *pi, + boolean_t set_needed); +extern void phyint_cleanup(struct phyint *pi); + +extern boolean_t tmptoken_create(struct phyint *pi); +extern void tmptoken_delete(struct phyint *pi); +extern uint_t tmptoken_timer(struct phyint *pi, uint_t elapsed); +extern boolean_t token_equal(struct in6_addr t1, struct in6_addr t2, + int bits); + +extern struct prefix *prefix_create(struct phyint *pi, struct in6_addr addr, + int addrlen, uint64_t flags); +extern struct prefix *prefix_lookup_name(struct phyint *pi, char *name); +extern struct prefix *prefix_lookup_addr_match(struct prefix *pr); +extern struct prefix *prefix_create_name(struct phyint *pi, char *name); +extern int prefix_init_from_k(struct prefix *pr); +extern void prefix_delete(struct prefix *pr); +extern boolean_t prefix_equal(struct in6_addr p1, struct in6_addr p2, + int bits); +extern void prefix_update_k(struct prefix *pr); +extern uint_t prefix_timer(struct prefix *pr, uint_t elapsed); +extern uint_t adv_prefix_timer(struct adv_prefix *adv_pr, + uint_t elapsed); +extern boolean_t prefix_token_match(struct phyint *pi, + struct prefix *pr, uint64_t flags); +extern struct prefix *prefix_lookup_addr(struct phyint *pi, + struct in6_addr prefix); + +extern struct adv_prefix *adv_prefix_lookup(struct phyint *pi, + struct in6_addr addr, int addrlen); +extern struct adv_prefix *adv_prefix_create(struct phyint *pi, + struct in6_addr addr, int addrlen); + +extern struct router *router_lookup(struct phyint *pi, struct in6_addr addr); +extern struct router *router_create(struct phyint *pi, struct in6_addr addr, + uint_t lifetime); +extern struct router *router_create_onlink(struct phyint *pi); +extern void router_update_k(struct router *dr); +extern uint_t router_timer(struct router *dr, uint_t elapsed); + + +extern void logperror_pi(struct phyint *pi, char *str); +extern void logperror_pr(struct prefix *pr, char *str); +extern void check_to_advertise(struct phyint *pi, enum adv_events event); +extern void check_to_solicit(struct phyint *pi, + enum solicit_events event); +extern uint_t advertise_event(struct phyint *pi, enum adv_events event, + uint_t elapsed); +extern uint_t solicit_event(struct phyint *pi, enum solicit_events event, + uint_t elapsed); + +extern void print_route_sol(char *str, struct phyint *pi, + struct nd_router_solicit *rs, int len, + struct sockaddr_in6 *addr); +extern void print_route_adv(char *str, struct phyint *pi, + struct nd_router_advert *ra, int len, + struct sockaddr_in6 *addr); +extern void print_iflist(struct confvar *confvar); +extern void print_prefixlist(struct confvar *confvar); + +extern void in_data(struct phyint *pi); + +extern void incoming_ra(struct phyint *pi, struct nd_router_advert *ra, + int len, struct sockaddr_in6 *from, boolean_t loopback); + +extern boolean_t incoming_prefix_addrconf_process(struct phyint *pi, + struct prefix *pr, uchar_t *opt, + struct sockaddr_in6 *from, boolean_t loopback, + boolean_t new_prefix); + +extern void incoming_prefix_onlink_process(struct prefix *pr, + uchar_t *opt); + +#ifdef __cplusplus +} +#endif + +#endif /* _NDPD_TABLES_H */ |