/*
 * This file is part of the UCB release of Plan 9. It is subject to the license
 * terms in the LICENSE file found in the top-level directory of this
 * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
 * part of the UCB release of Plan 9, including this file, may be copied,
 * modified, propagated, or distributed except according to the terms contained
 * in the LICENSE file.
 */
#pragma once

#include <parlib/common.h>

__BEGIN_DECLS

enum
{
	ETH_HDR_LEN		= 14,
	ETH_OFF_DST		= 0,
	ETH_OFF_SRC		= 6,
	ETH_OFF_ETYPE		= 12,

	ETH_ADDR_LEN		= 6,
	ETH_TYPE_IPV4		= 0x0800,
	ETH_TYPE_ARP		= 0x0806,
	ETH_TYPE_IPV6		= 0x86dd,
	ETH_HTYPE_ETH		= 1,

	IPV4_HDR_LEN		= 20,
	IPV4_OFF_LEN		= 2,
	IPV4_OFF_ID		= 4,
	IPV4_OFF_TTL		= 8,
	IPV4_OFF_PROTO		= 9,
	IPV4_OFF_XSUM		= 10,
	IPV4_OFF_SRC		= 12,
	IPV4_OFF_DST		= 16,

	IPV4_ADDR_LEN		= 4,
	IP_ICMPPROTO		= 1,
	IP_IGMPPROTO		= 2,
	IP_TCPPROTO		= 6,
	IP_UDPPROTO		= 17,
	IP_ILPROTO		= 40,

	UDP_HDR_LEN		= 8,
	UDP_OFF_SRC_PORT	= 0,
	UDP_OFF_DST_PORT	= 2,
	UDP_OFF_LEN		= 4,
	UDP_OFF_XSUM		= 6,

	TCP_HDR_LEN		= 20,
	TCP_OFF_SRC_PORT	= 0,
	TCP_OFF_DST_PORT	= 2,
	TCP_OFF_SEQ		= 4,
	TCP_OFF_ACK		= 8,
	TCP_OFF_DATA		= 12,
	TCP_OFF_FL		= 12,
	TCP_OFF_WIN		= 14,
	TCP_OFF_XSUM		= 16,

	ARP_PKT_LEN		= 28,
	ARP_OFF_HTYPE		= 0,
	ARP_OFF_PTYPE		= 2,
	ARP_OFF_HLEN		= 4,
	ARP_OFF_PLEN		= 5,
	ARP_OFF_OP		= 6,
	ARP_OFF_SHA		= 8,
	ARP_OFF_SPA		= 14,
	ARP_OFF_THA		= 18,
	ARP_OFF_TPA		= 24,

	ARP_OP_REQ		= 1,
	ARP_OP_RSP		= 2,

	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 my_router_addr(uint8_t *addr, char *net);
int myetheraddr(uint8_t*, char*);
int equivip4(uint8_t*, uint8_t*);
int equivip6(uint8_t*, uint8_t*);

struct ipifc *readipifc(char *net, struct ipifc *to_free, int index);
struct iplifc *get_first_noloop_iplifc(char *net, struct ipifc **ifc);
void free_ipifc(struct ipifc *ifc);

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);
uint16_t ip_calc_xsum(uint8_t *addr, size_t len);

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, char *buf,
                size_t buf_sz);
int dial9(char *dest, char *local, char *dir, int *cfdp, int flags);
int clone9(char *addr, char *dir, int flags);
int announce9(char *addr, char *dir, int flags);
int bypass9(char *addr, char *conv_dir, int flags);
int listen9(char *dir, char *newdir, int flags);
int accept9(int ctl, char *dir);
int reject9(int ctl, char *dir, char *cause);
int open_data_fd9(char *conv_dir, int flags);
bool get_port9(char *conv_dir, char *which, uint16_t *port);
int gettokens(char *s, char **args, int maxargs, char *sep);

__END_DECLS
