diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1999-01-06 23:26:59 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1999-01-06 23:26:59 +0000 |
commit | 003294c571f5404cf3bb2ab3cf33eba8643b932b (patch) | |
tree | 0efc8463ff2d3c2555c4a6a830fe508568cc5e07 /sys/netinet6/ipv6_var.h | |
parent | 21e642825078d715499c3110ace9c6e61f6c6db4 (diff) |
first few files of NRL ipv6. This NRL release was officially exported
to me by US DOD officials, with the crypto already removed.
Diffstat (limited to 'sys/netinet6/ipv6_var.h')
-rw-r--r-- | sys/netinet6/ipv6_var.h | 346 |
1 files changed, 346 insertions, 0 deletions
diff --git a/sys/netinet6/ipv6_var.h b/sys/netinet6/ipv6_var.h new file mode 100644 index 00000000000..f0e88034bcd --- /dev/null +++ b/sys/netinet6/ipv6_var.h @@ -0,0 +1,346 @@ +/* +%%% copyright-nrl-95 +This software is Copyright 1995-1998 by Randall Atkinson, Ronald Lee, +Daniel McDonald, Bao Phan, and Chris Winters. All Rights Reserved. All +rights under this copyright have been assigned to the US Naval Research +Laboratory (NRL). The NRL Copyright Notice and License Agreement Version +1.1 (January 17, 1995) applies to this software. +You should have received a copy of the license with this software. If you +didn't get a copy, you may request one from <license@ipv6.nrl.navy.mil>. + +*/ +#ifndef _NETINET6_IPV6_VAR_H +#define _NETINET6_IPV6_VAR_H 1 + +#include <netinet6/in6.h> + +/* + * IPv6 multicast "options". Session state for multicast, including + * weird per-session multicast things. + */ + +struct ipv6_moptions +{ + struct ifnet *i6mo_multicast_ifp; /* ifp for outgoing multicasts */ + u_char i6mo_multicast_ttl; /* TTL for outgoing multicasts. + Does this matter in IPv6? */ + u_char i6mo_multicast_loop; /* 1 => hear sends if a member */ + u_short i6mo_num_memberships; /* no. memberships this socket */ + struct in6_multi *i6mo_membership[IN6_MAX_MEMBERSHIPS]; +}; + +/* + * IPv6 stats. + */ + +#if defined(_BSDI_VERSION) && _BSDI_VERSION >= 199802 +#define _IPV6STAT_TYPE u_quad_t +#else /* defined(_BSDI_VERSION) && _BSDI_VERSION >= 199802 */ +#define _IPV6STAT_TYPE u_long +#endif /* defined(_BSDI_VERSION) && _BSDI_VERSION >= 199802 */ + +struct ipv6stat { + _IPV6STAT_TYPE ips_total; /* total packets received */ + _IPV6STAT_TYPE ips_tooshort; /* packet too short */ + _IPV6STAT_TYPE ips_toosmall; /* not enough data */ + _IPV6STAT_TYPE ips_fragments; /* fragments received */ + _IPV6STAT_TYPE ips_fragdropped; /* frags dropped (dups, out of space) */ + _IPV6STAT_TYPE ips_fragtimeout; /* fragments timed out */ + _IPV6STAT_TYPE ips_forward; /* packets forwarded */ + _IPV6STAT_TYPE ips_cantforward; /* packets rcvd for unreachable dest */ + _IPV6STAT_TYPE ips_redirectsent; /* packets forwarded on same net */ + _IPV6STAT_TYPE ips_noproto; /* unknown or unsupported protocol */ + _IPV6STAT_TYPE ips_delivered; /* datagrams delivered to upper level*/ + _IPV6STAT_TYPE ips_localout; /* total ip packets generated here */ + _IPV6STAT_TYPE ips_odropped; /* lost packets due to nobufs, etc. */ + _IPV6STAT_TYPE ips_reassembled; /* total packets reassembled ok */ + _IPV6STAT_TYPE ips_fragmented; /* datagrams sucessfully fragmented */ + _IPV6STAT_TYPE ips_ofragments; /* output fragments created */ + _IPV6STAT_TYPE ips_cantfrag; /* don't fragment flag was set, etc. */ + _IPV6STAT_TYPE ips_badoptions; /* error in option processing */ + _IPV6STAT_TYPE ips_noroute; /* packets discarded due to no route */ + _IPV6STAT_TYPE ips_badvers; /* IPv6 version != 6 */ + _IPV6STAT_TYPE ips_rawout; /* total raw ip packets generated */ +}; + +#ifdef KERNEL + +/* + * The IPv6 fragment queue entry structure. + * Notes: + * Nodes are stored in ttl order. + * prefix comes from whichever packet gets here first. + * data contains a chain of chains of mbufs (m_next down a chain, m_nextpkt + * chaining chains together) where the chains are ordered by assembly + * position. When two chains are contiguous for reassembly, they are + * combined and the frag header disappears. + * The structure is deliberately sized so MALLOC will round up on the order + * of much less than the total size instead of doubling the size. + */ + +struct ipv6_fragment +{ + struct ipv6_fragment *next; /* Next fragment chain */ + struct mbuf *prefix; /* Headers before frag header(s) */ + struct mbuf *data; /* Frag headers + whatever data */ + u_char ttl; /* Fragment chain TTL. */ + u_char flags; /* Bit 0 indicates got end of chain */ +}; + +/* + * Structures and definitions for discovery mechanisms in IPv6. + */ + +/* + * Neighbor cache: + * + * Number of unanswered probes is in discq. + * "Time of next event" will be in rt->rt_rmx.rmx_expire + * (rmx_expire will actually be quite overloaded, actually.) + * Status REACHABLE will be dq_unanswered < 0 + * Status PROBE will be dq_unanswered >= 0 + * Status INCOMPLETE will be link addr length of 0 if held, + * or deleted if not held. + * + * If held, but INCOMPLETE fails set RTF_REJECT and make sure + * IPv6 and HLP's know how to deal with RTF_REJECT being set. + */ + +struct discq /* Similar to v4's llinfo_arp, discovery's "neighbor entry". */ +{ + struct discq *dq_next,*dq_prev; /* For {ins,rem}que(). */ + struct rtentry *dq_rt; /* Back pointer to routing entry for + an address that may be dead. */ + struct mbuf *dq_queue; /* Queue of outgoing messages. */ + int dq_unanswered; /* Number of unanswered probes. */ +}; + +#if !defined(_BSDI_VERSION) || (_BSDI_VERSION < 199802) +/* Routing flag redefinitions */ +#define RTF_ISAROUTER RTF_PROTO2 /* Neighbor is a router. */ +#define RTF_DEFAULT RTF_PROTO1 /* Default route. */ +#endif /* !defined(_BSDI_VERSION) || (_BSDI_VERSION < 199802) */ + +/* + * These should be configurable parameters, see ipv6_discovery.c. + * All units are in comments besides constants. + */ + +#define MAX_INITIAL_RTR_ADVERT_INTERVAL 16 /* seconds */ +#define MAX_INITIAL_RTR_ADVERTISEMENTS 3 /* transmissions */ +#define MAX_RTR_RESPONSE_DELAY 2 /* seconds */ + +#define MAX_RTR_SOLICITATION_DELAY 1 /* second */ +#define RTR_SOLICITATION_INTERVAL 3 /* seconds */ +#define MAX_RTR_SOLICITATIONS 3 /* transmissions */ + +#define MAX_MULTICAST_SOLICIT 3 /* transmissions */ +#define MAX_UNICAST_SOLICIT 3 /* transmissions */ +#define MAX_ANYCAST_DELAY_TIME 1 /* seconds */ +#define MAX_NEIGHBOR_ADVERTISEMENTS 3 /* transmissions */ +#define MIN_NEIGHBOR_ADVERT_INTERVAL 16 /* seconds */ +#define REACHABLE_TIME 30 /* seconds */ +#define RETRANS_TIMER 3 /* seconds */ +#define DELAY_FIRST_PROBE_TIME 3 /* seconds */ +/* Need to somehow define random factors. */ + +#define NEXTHOP_CLEAN_INTERVAL 600 /* seconds */ +#define REJECT_TIMER 20 /* seconds */ + +/* + * Child of a router or tunnel. Is a "meta-entry" for garbage collection. + */ + +struct v6child +{ + struct v6child *v6c_next,*v6c_prev; /* For {ins,rem}que() */ + struct v6router *v6c_parent; /* Parent router. I'm null if + I'm the router, or a tunnel + child. */ + struct rtentry *v6c_route; /* Next-hop cache entry. I won't + be holding it, but I'm attached + to it, like discq is to neighbor + cache entries. */ +}; + +/* + * Default router list entry. Should be inserted + * in priority order. Will also have entries for non- + * default routers, because I may be a router myself. + */ + +struct v6router +{ + struct v6router *v6r_next,*v6r_prev; /* For {ins,rem}que() */ + struct rtentry *v6r_rt; /* Route for this. Could be neighbor, + could be tunnel. */ + struct v6child v6r_children; /* Children of this router. */ + + /* Metric information? */ + uint32_t v6r_expire; /* Expiration time. */ +}; +#define V6R_SIN6(v6r) ((struct sockaddr_in6 *)rt_key((v6r)->v6r_rt)) + +/* + * Flags for "flags" argument in ipv6_output(). + */ + +#define IPV6_FORWARDING 0x1 /* Most of IPv6 header exists? */ +#define IPV6_RAWOUTPUT 0x2 /* Raw IPv6 packet! */ +#define IPV6_ROUTETOIF SO_DONTROUTE /* Include sys/socket.h... */ + +void ipv6_init __P((void)); +void ipv6_drain __P((void)); +void ipv6_slowtimo __P((void)); +int ipv6_sysctl __P((int *, uint, void *, size_t *, void *, size_t)); +struct route6; + +#if __FreeBSD__ +int ipv6_ctloutput __P((struct socket *, struct sockopt *)); +int ripv6_ctloutput __P((struct socket *, struct sockopt *)); +#else /* __FreeBSD__ */ +int ipv6_ctloutput __P((int, struct socket *,int,int, struct mbuf **)); +int ripv6_ctloutput __P((int, struct socket *, int, int, struct mbuf **)); +#endif /* __FreeBSD__ */ +void ripv6_init __P((void)); +#if __OpenBSD__ +void ripv6_input __P((struct mbuf *, ...)); +int ripv6_output __P((struct mbuf *, ...)); +#else /* __OpenBSD__ */ +void ripv6_input __P((struct mbuf *, int)); +int ripv6_output __P((struct mbuf *, struct socket *, struct in6_addr *, struct mbuf *)); +#endif /* __OpenBSD__ */ + +#if __NetBSD__ || __FreeBSD__ +int ripv6_usrreq_send(struct socket *, int, struct mbuf *, struct sockaddr *, + struct mbuf *, struct proc *); +#else /* __NetBSD__ || __FreeBSD__ */ +int ripv6_usrreq_send(struct socket *, int, struct mbuf *, struct sockaddr *, + struct mbuf *); +#endif /* __NetBSD__ || __FreeBSD__ */ + +#if __FreeBSD__ +int ripv6_usrreq_abort(struct socket *); +int ripv6_usrreq_attach(struct socket *, int , struct proc *); +int ripv6_usrreq_bind(struct socket *, struct sockaddr *, struct proc *); +int ripv6_usrreq_connect(struct socket *, struct sockaddr *, struct proc *); +int ripv6_usrreq_control(struct socket *, u_long, caddr_t, struct ifnet *, + struct proc *); +int ripv6_usrreq_detach(struct socket *); +int ripv6_usrreq_peeraddr(struct socket *, struct sockaddr **); +int ripv6_usrreq_sense(struct socket *, struct stat *); +int ripv6_usrreq_shutdown(struct socket *); +int ripv6_usrreq_sockaddr(struct socket *, struct sockaddr **); +#else /* __FreeBSD__ */ +#if __NetBSD__ +int ripv6_usrreq __P((struct socket *, int, struct mbuf *, struct mbuf *, + struct mbuf *, struct proc *)); +#else /* __NetBSD__ */ +int ripv6_usrreq __P((struct socket *, int, struct mbuf *, struct mbuf *, + struct mbuf *)); +#endif /* __NetBSD__ */ +#endif /* __FreeBSD__ */ + +#if 0 /* __OpenBSD__ */ +void ipv6_input __P((struct mbuf *, ...)); +int ipv6_output __P((struct mbuf *, ...)); +#else /* __OpenBSD__ */ +void ipv6_input __P((struct mbuf *, int)); +int ipv6_output __P((struct mbuf *, struct route6 *, int, struct ipv6_moptions *, struct ifnet *, struct socket *)); +#endif /* __OpenBSD__ */ +void ipv6_reasm __P((struct mbuf *, int)); +void ipv6_hop __P((struct mbuf *, int)); + +#if __FreeBSD__ +int in6_control __P((struct socket *,int, caddr_t, struct ifnet *,int, struct proc *)); +#else /* __FreeBSD__ */ +#if __NetBSD__ +int in6_control __P((struct socket *,u_long, caddr_t, struct ifnet *,int, struct proc *)); +#else /* __NetBSD__ */ +int in6_control __P((struct socket *,int, caddr_t, struct ifnet *,int)); +#endif /* __NetBSD__ */ +#endif /* __FreeBSD__ */ +void ipv6_stripoptions __P((struct mbuf *, int)); +struct in6_multi *in6_addmulti __P((struct in6_addr *,struct ifnet *)); +void in6_delmulti __P((struct in6_multi *)); + +#if __FreeBSD__ +/* ripv6_usrreq and ipv6_icmp_usrreq functions */ +extern struct pr_usrreqs ripv6_usrreqs; +extern struct pr_usrreqs ipv6_icmp_usrreqs; + +extern int ripv6_usr_attach(struct socket *, int , struct proc *); +extern int ripv6_usr_disconnect(struct socket *); +extern int ripv6_usr_abort(struct socket *); +extern int ripv6_usr_detach(struct socket *); +extern int ripv6_usr_bind(struct socket *, struct sockaddr *, struct proc *); +extern int ripv6_usr_connect(struct socket *, struct sockaddr *, struct proc *); +extern int ripv6_usr_shutdown(struct socket *); +extern int ripv6_usr_send(struct socket *, int, struct mbuf *, + struct sockaddr *, struct mbuf *, struct proc *); +extern int ripv6_usr_control(struct socket *, int, caddr_t, + struct ifnet *, struct proc *); +extern int ripv6_usr_sense(struct socket *, struct stat *); +extern int ripv6_usr_sockaddr(struct socket *, struct sockaddr **); +extern int ripv6_usr_peeraddr(struct socket *, struct sockaddr **); +#endif /* __FreeBSD__ */ + +extern int ipv6_icmp_send(struct socket *, int, struct mbuf *, + struct sockaddr *, struct mbuf *, struct proc *); + +#if __OpenBSD__ +void *ipv6_trans_ctlinput __P((int, struct sockaddr *, void *, struct mbuf *)); +#else /* __OpenBSD__ */ +struct ip; +void ipv6_trans_ctlinput __P((int, struct sockaddr *, struct ip *, struct mbuf *)); +#endif /* __OpenBSD__ */ + +/* These might belong in in_pcb.h */ +struct inpcb; +#if __FreeBSD__ +/* + * FreeBSD, having done away with the *_usrreq() functions no longer needs to + * pass mbufs to these functions. Thus they pass in sockaddrs instead. + */ +int in6_pcbbind(struct inpcb *, struct sockaddr *); +int in6_pcbconnect(struct inpcb *, struct sockaddr *); +int in6_setsockaddr(struct inpcb *, struct sockaddr **); +int in6_setpeeraddr(struct inpcb *, struct sockaddr **); +#else /* __FreeBSD__ */ +int in6_pcbbind(struct inpcb *, struct mbuf *); +int in6_pcbconnect(struct inpcb *, struct mbuf *); +int in6_setsockaddr(struct inpcb *, struct mbuf *); +int in6_setpeeraddr(struct inpcb *, struct mbuf *); +#endif /* __FreeBSD__ */ +void ipv6_onlink_query(struct sockaddr_in6 *); +int ipv6_verify_onlink(struct sockaddr_in6 *); + +#if __FreeBSD__ +struct inpcbhead; /* XXX? Forward declaration needed. */ +#define __IN6_PCBNOTIFY_FIRSTARG struct inpcbhead * +#endif /* __FreeBSD__ */ +#if __NetBSD__ || __OpenBSD__ +struct inpcbtable; +#define __IN6_PCBNOTIFY_FIRSTARG struct inpcbtable * +#endif /* __NetBSD__ || __OpenBSD__ */ +#if __bsdi__ +struct inpcb; +#define __IN6_PCBNOTIFY_FIRSTARG struct inpcb * +#endif /* __bsdi__ */ + +#if (!__OpenBSD__ && defined(IPSEC)) || (__OpenBSD__ && defined(NRL_IPSEC)) +int in6_pcbnotify __P((__IN6_PCBNOTIFY_FIRSTARG, struct sockaddr *, uint, + struct in6_addr *, uint, int, void (*)(struct inpcb *, + int), struct mbuf *, int)); +#else /* (!__OpenBSD__ && defined(IPSEC)) || (__OpenBSD__ && defined(NRL_IPSEC)) */ +int in6_pcbnotify __P((__IN6_PCBNOTIFY_FIRSTARG, struct sockaddr *, uint, + struct in6_addr *, uint, int, void (*)(struct inpcb *, + int))); +#endif /* (!__OpenBSD__ && defined(IPSEC)) || (__OpenBSD__ && defined(NRL_IPSEC)) */ + +#undef __IN6_PCBNOTIFY_FIRSTARG + +void ipv6_freemoptions __P((struct ipv6_moptions *)); +#endif /* KERNEL */ + +#endif /* _NETINET6_IPV6_VAR_H */ |