|  | /*	@(#)ip_var.h 1.11 88/08/19 SMI; from UCB 7.1 6/5/86	*/ | 
|  |  | 
|  | /* | 
|  | * Copyright (c) 1982, 1986 Regents of the University of California. | 
|  | * All rights reserved.  The Berkeley software License Agreement | 
|  | * specifies the terms and conditions for redistribution. | 
|  | */ | 
|  |  | 
|  | /* | 
|  | * Overlay for ip header used by other protocols (tcp, udp). | 
|  | */ | 
|  |  | 
|  | #ifndef _netinet_ip_var_h | 
|  | #define _netinet_ip_var_h | 
|  |  | 
|  | struct ipovly { | 
|  | caddr_t	ih_next, ih_prev;	/* for protocol sequence q's */ | 
|  | u_char	ih_x1;			/* (unused) */ | 
|  | u_char	ih_pr;			/* protocol */ | 
|  | short	ih_len;			/* protocol length */ | 
|  | struct	in_addr ih_src;		/* source internet address */ | 
|  | struct	in_addr ih_dst;		/* destination internet address */ | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * Ip reassembly queue structure.  Each fragment | 
|  | * being reassembled is attached to one of these structures. | 
|  | * They are timed out after ipq_ttl drops to 0, and may also | 
|  | * be reclaimed if memory becomes tight. | 
|  | */ | 
|  | struct ipq { | 
|  | struct	ipq *next,*prev;	/* to other reass headers */ | 
|  | u_char	ipq_ttl;		/* time for reass q to live */ | 
|  | u_char	ipq_p;			/* protocol of this fragment */ | 
|  | u_short	ipq_id;			/* sequence id for reassembly */ | 
|  | struct	ipasfrag *ipq_next,*ipq_prev; | 
|  | /* to ip headers of fragments */ | 
|  | struct	in_addr ipq_src,ipq_dst; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * Ip header, when holding a fragment. | 
|  | * | 
|  | * Note: ipf_next must be at same offset as ipq_next above | 
|  | */ | 
|  | struct	ipasfrag { | 
|  | #if defined(vax) || defined(i386) | 
|  | u_char	ip_hl:4, | 
|  | ip_v:4; | 
|  | #endif | 
|  | #if defined(mc68000) || defined(sparc) | 
|  | u_char	ip_v:4, | 
|  | ip_hl:4; | 
|  | #endif | 
|  | u_char	ipf_mff;		/* copied from (ip_off&IP_MF) */ | 
|  | short	ip_len; | 
|  | u_short	ip_id; | 
|  | short	ip_off; | 
|  | u_char	ip_ttl; | 
|  | u_char	ip_p; | 
|  | u_short	ip_sum; | 
|  | struct	ipasfrag *ipf_next;	/* next fragment */ | 
|  | struct	ipasfrag *ipf_prev;	/* previous fragment */ | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * Structure stored in mbuf in inpcb.ip_options | 
|  | * and passed to ip_output when ip options are in use. | 
|  | * The actual length of the options (including ipopt_dst) | 
|  | * is in m_len. | 
|  | */ | 
|  | #define MAX_IPOPTLEN	40 | 
|  |  | 
|  | struct ipoption { | 
|  | struct	in_addr ipopt_dst;	/* first-hop dst if source routed */ | 
|  | char	ipopt_list[MAX_IPOPTLEN];	/* options proper */ | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * Structure stored in an mbuf attached to inpcb.ip_moptions and | 
|  | * passed to ip_output when IP multicast options are in use. | 
|  | */ | 
|  | struct ip_moptions { | 
|  | struct	ifnet   *imo_multicast_ifp;  /* ifp for outgoing multicasts */ | 
|  | u_char		 imo_multicast_ttl;  /* TTL for outgoing multicasts */ | 
|  | u_char		 imo_multicast_loop; /* 1 => hear sends if a member */ | 
|  | u_short		 imo_num_memberships;/* no. memberships this socket */ | 
|  | struct in_multi *imo_membership[IP_MAX_MEMBERSHIPS]; | 
|  | #ifdef RSVP_ISI | 
|  | long		 imo_multicast_vif;  /* vif for outgoing multicasts */ | 
|  | #endif /* RSVP_ISI */ | 
|  | }; | 
|  |  | 
|  | struct	ipstat { | 
|  | long	ips_total;		/* total packets received */ | 
|  | long	ips_badsum;		/* checksum bad */ | 
|  | long	ips_tooshort;		/* packet too short */ | 
|  | long	ips_toosmall;		/* not enough data */ | 
|  | long	ips_badhlen;		/* ip header length < data size */ | 
|  | long	ips_badlen;		/* ip length < ip header length */ | 
|  | long	ips_fragments;		/* fragments received */ | 
|  | long	ips_fragdropped;	/* frags dropped (dups, out of space) */ | 
|  | long	ips_fragtimeout;	/* fragments timed out */ | 
|  | long	ips_forward;		/* packets forwarded */ | 
|  | long	ips_cantforward;	/* packets rcvd for unreachable dest */ | 
|  | long	ips_redirectsent;	/* packets forwarded on same net */ | 
|  | }; | 
|  |  | 
|  | #ifdef KERNEL | 
|  | /* flags passed to ip_output as last parameter */ | 
|  | #define	IP_FORWARDING		0x1		/* most of ip header exists */ | 
|  | #define IP_MULTICASTOPTS	0x2		/* multicast opts present */ | 
|  | #define	IP_ROUTETOIF		SO_DONTROUTE	/* bypass routing tables */ | 
|  | #define	IP_ALLOWBROADCAST	SO_BROADCAST	/* can send broadcast packets */ | 
|  |  | 
|  | struct	ipstat	ipstat; | 
|  | struct	ipq	ipq;			/* ip reass. queue */ | 
|  | u_short	ip_id;				/* ip packet ctr, for ids */ | 
|  |  | 
|  | struct	mbuf *ip_srcroute(); | 
|  | #endif | 
|  |  | 
|  | #endif /*!_netinet_ip_var_h*/ |