|  | #ifndef ROS_INC_NIXIP_H | 
|  | #define ROS_INC_NIXIP_H | 
|  |  | 
|  | #include <ros/common.h> | 
|  |  | 
|  | enum | 
|  | { | 
|  | IPaddrlen=	16, | 
|  | IPv4addrlen=	4, | 
|  | IPv4off=	12, | 
|  | IPllen=		4, | 
|  | IPV4HDR_LEN=	20, | 
|  |  | 
|  | /* vihl & vcf[0] values */ | 
|  | IP_VER4= 	0x40, | 
|  | IP_VER6=	0x60, | 
|  | NETPATHLEN=	40, | 
|  | }; | 
|  |  | 
|  | /* | 
|  | *  for reading /net/ipifc | 
|  | */ | 
|  |  | 
|  | /* local address */ | 
|  | struct iplifc | 
|  | { | 
|  | struct iplifc	*next; | 
|  |  | 
|  | /* per address on the ip interface */ | 
|  | uint8_t	ip[IPaddrlen]; | 
|  | uint8_t	mask[IPaddrlen]; | 
|  | uint8_t	net[IPaddrlen];		/* ip & mask */ | 
|  | uint32_t	preflt;			/* preferred lifetime */ | 
|  | uint32_t	validlt;		/* valid lifetime */ | 
|  | }; | 
|  |  | 
|  | /* default values, one per stack */ | 
|  | struct ipv6rp | 
|  | { | 
|  | int	mflag; | 
|  | int	oflag; | 
|  | int 	maxraint; | 
|  | int	minraint; | 
|  | int	linkmtu; | 
|  | int	reachtime; | 
|  | int	rxmitra; | 
|  | int	ttl; | 
|  | int	routerlt; | 
|  | }; | 
|  |  | 
|  | /* actual interface */ | 
|  | struct ipifc | 
|  | { | 
|  | struct ipifc	*next; | 
|  | struct iplifc	*lifc; | 
|  |  | 
|  | /* per ip interface */ | 
|  | int	index;			/* number of interface in ipifc dir */ | 
|  | char	dev[64]; | 
|  | uint8_t	sendra6;		/* on == send router adv */ | 
|  | uint8_t	recvra6;		/* on == rcv router adv */ | 
|  | int	mtu; | 
|  | uint32_t	pktin; | 
|  | uint32_t	pktout; | 
|  | uint32_t	errin; | 
|  | uint32_t	errout; | 
|  | struct ipv6rp	rp; | 
|  | }; | 
|  |  | 
|  | #define ISIPV6MCAST(addr)	((addr)[0] == 0xff) | 
|  | #define ISIPV6LINKLOCAL(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80) | 
|  |  | 
|  | /* | 
|  | * ipv6 constants | 
|  | * `ra' is `router advertisement', `rs' is `router solicitation'. | 
|  | * `na' is `neighbour advertisement'. | 
|  | */ | 
|  | enum { | 
|  | IPV6HDR_LEN	= 40, | 
|  |  | 
|  | /* neighbour discovery option types */ | 
|  | V6nd_srclladdr	= 1, | 
|  | V6nd_targlladdr	= 2, | 
|  | V6nd_pfxinfo	= 3, | 
|  | V6nd_redirhdr	= 4, | 
|  | V6nd_mtu	= 5, | 
|  | /* new since rfc2461; see iana.org/assignments/icmpv6-parameters */ | 
|  | V6nd_home	= 8, | 
|  | V6nd_srcaddrs	= 9,		/* rfc3122 */ | 
|  | V6nd_ip		= 17, | 
|  | /* /lib/rfc/drafts/draft-jeong-dnsop-ipv6-dns-discovery-12.txt */ | 
|  | V6nd_rdns	= 25, | 
|  | /* plan 9 extensions */ | 
|  | V6nd_9fs	= 250, | 
|  | V6nd_9auth	= 251, | 
|  |  | 
|  | /* Router constants (all times in ms.) */ | 
|  | Maxv6initraintvl= 16000, | 
|  | Maxv6initras	= 3, | 
|  | Maxv6finalras	= 3, | 
|  | Minv6interradelay= 3000, | 
|  | Maxv6radelay	= 500, | 
|  |  | 
|  | /* Host constants */ | 
|  | Maxv6rsdelay	= 1000, | 
|  | V6rsintvl	= 4000, | 
|  | Maxv6rss	= 3, | 
|  |  | 
|  | /* Node constants */ | 
|  | Maxv6mcastrss	= 3, | 
|  | Maxv6unicastrss	= 3, | 
|  | Maxv6anycastdelay= 1000, | 
|  | Maxv6na		= 3, | 
|  | V6reachabletime	= 30000, | 
|  | V6retranstimer	= 1000, | 
|  | V6initprobedelay= 5000, | 
|  | }; | 
|  |  | 
|  | # if 0 | 
|  | /* in icmp.h? */ | 
|  | struct ip4hdr | 
|  | { | 
|  | uint8_t	vihl;		/* Version and header length */ | 
|  | uint8_t	tos;		/* Type of service */ | 
|  | uint8_t	length[2];	/* packet length */ | 
|  | uint8_t	id[2];		/* ip->identification */ | 
|  | uint8_t	frag[2];	/* Fragment information */ | 
|  | uint8_t	ttl;      	/* Time to live */ | 
|  | uint8_t	proto;		/* Protocol */ | 
|  | uint8_t	cksum[2];	/* Header checksum */ | 
|  | uint8_t	src[4];		/* IP source */ | 
|  | uint8_t	dst[4];		/* IP destination */ | 
|  | }; | 
|  | #endif | 
|  |  | 
|  | /* V6 header on the wire */ | 
|  |  | 
|  | struct ip6hdr { | 
|  | uint8_t	vcf[4];		/* version:4, traffic class:8, flow label:20 */ | 
|  | uint8_t	ploadlen[2];	/* payload length: packet length - 40 */ | 
|  | uint8_t	proto;		/* next header type */ | 
|  | uint8_t	ttl;		/* hop limit */ | 
|  | uint8_t	src[IPaddrlen];	/* source address */ | 
|  | uint8_t	dst[IPaddrlen];	/* destination address */ | 
|  | uint8_t	payload[]; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | *  user-level icmpv6 with control message "headers" | 
|  | */ | 
|  |  | 
|  | struct icmp6hdr { | 
|  | uint8_t	_0_[8]; | 
|  | uint8_t	laddr[IPaddrlen];	/* local address */ | 
|  | uint8_t	raddr[IPaddrlen];	/* remote address */ | 
|  | }; | 
|  |  | 
|  | /* | 
|  | *  user level udp headers with control message "headers" | 
|  | */ | 
|  | enum | 
|  | { | 
|  | Udphdrsize=	52,	/* size of a Udphdr */ | 
|  | }; | 
|  |  | 
|  | struct udphdr | 
|  | { | 
|  | uint8_t	raddr[IPaddrlen];	/* V6 remote address */ | 
|  | uint8_t	laddr[IPaddrlen];	/* V6 local address */ | 
|  | uint8_t	ifcaddr[IPaddrlen];	/* V6 ifc addr msg was received on */ | 
|  | uint8_t	rport[2];		/* remote port */ | 
|  | uint8_t	lport[2];		/* local port */ | 
|  | }; | 
|  |  | 
|  | uint8_t*	defmask(uint8_t*); | 
|  | void	maskip(uint8_t*, uint8_t*, uint8_t*); | 
|  | //int	eipfmt(Fmt*); | 
|  | int	isv4(uint8_t*); | 
|  | int64_t	parseip(uint8_t*, char*); | 
|  | int64_t	parseipmask(uint8_t*, char*); | 
|  | char*	v4parseip(uint8_t*, char*); | 
|  | char*	v4parsecidr(uint8_t*, uint8_t*, char*); | 
|  | int	parseether(uint8_t*, char*); | 
|  | int	myipaddr(uint8_t*, char*); | 
|  | int	myetheraddr(uint8_t*, char*); | 
|  | int	equivip4(uint8_t*, uint8_t*); | 
|  | int	equivip6(uint8_t*, uint8_t*); | 
|  |  | 
|  | struct ipifc*	readipifc(char*, struct ipifc*, int); | 
|  |  | 
|  | void	hnputv(void*, uint64_t); | 
|  | void	hnputl(void*, unsigned int); | 
|  | void	hnputs(void*, uint16_t); | 
|  | uint64_t	nhgetv(void*); | 
|  | unsigned int	nhgetl(void*); | 
|  | uint16_t	nhgets(void*); | 
|  | uint16_t	ptclbsum(uint8_t*, int); | 
|  |  | 
|  | int	v6tov4(uint8_t*, uint8_t*); | 
|  | void	v4tov6(uint8_t*, uint8_t*); | 
|  |  | 
|  | #define	ipcmp(x, y) memcmp(x, y, IPaddrlen) | 
|  | #define	ipmove(x, y) memmove(x, y, IPaddrlen) | 
|  |  | 
|  | extern uint8_t IPv4bcast[IPaddrlen]; | 
|  | extern uint8_t IPv4bcastobs[IPaddrlen]; | 
|  | extern uint8_t IPv4allsys[IPaddrlen]; | 
|  | extern uint8_t IPv4allrouter[IPaddrlen]; | 
|  | extern uint8_t IPnoaddr[IPaddrlen]; | 
|  | extern uint8_t v4prefix[IPaddrlen]; | 
|  | extern uint8_t IPallbits[IPaddrlen]; | 
|  |  | 
|  | #define CLASS(p) ((*(uint8_t*)(p))>>6) | 
|  |  | 
|  | int tokenize(char *s, char **args, int maxargs); | 
|  | int getfields(char *str, char **args, int max, int mflag, char *unused_set); | 
|  | char *netmkaddr(char *linear, char *defnet, char *defsrv); | 
|  | int dial(char *dest, char *local, char *dir, int *cfdp); | 
|  | int announce(char *addr, char *dir); | 
|  | int listen(char *dir, char *newdir); | 
|  | int accept(int ctl, char *dir); | 
|  | int reject(int ctl, char *dir, char *cause); | 
|  |  | 
|  |  | 
|  | #endif /* ROS_INC_NIXIP_H */ |