/*
 * ipconfig/netdev.h
 */
#include <sys/utsname.h>
#include <net/if.h>

#define BPLEN		40

struct netdev {
	const char 	*name;			/* Device name		*/
	unsigned int	ifindex;		/* interface index	*/
	unsigned int	hwtype;			/* ARPHRD_xxx		*/
	unsigned int	hwlen;			/* HW address length	*/
	__u8		hwaddr[16];		/* HW address		*/
	__u8		hwbrd[16];		/* Broadcast HW address */
	unsigned int	mtu;			/* Device mtu		*/
	unsigned int	caps;			/* Capabilities		*/
	time_t		open_time;

	struct {				/* BOOTP/DHCP info	*/
		int	fd;
		__u32	xid;
		__u32	gateway;		/* BOOTP/DHCP gateway	*/
	} bootp;

	struct {				/* RARP information	*/
		int	fd;
	} rarp;

	__u32		ip_addr;		/* my address		*/
	__u32		ip_broadcast;		/* broadcast address	*/
	__u32		ip_server;		/* server address	*/
	__u32		ip_netmask;		/* my subnet mask	*/
	__u32		ip_gateway;		/* my gateway		*/
	__u32		ip_nameserver[2];	/* two nameservers	*/
	__u32		serverid;		/* dhcp serverid	*/
	char		hostname[SYS_NMLN];	/* hostname		*/
	char		dnsdomainname[SYS_NMLN];/* dns domain name	*/
	char		nisdomainname[SYS_NMLN];/* nis domain name	*/
	char		bootpath[BPLEN];	/* boot path		*/
	struct netdev	*next;			/* next configured i/f	*/
};

/*
 * Device capabilities
 */
#define CAP_BOOTP	(1<<0)
#define CAP_DHCP	(1<<1)
#define CAP_RARP	(1<<2)

/*
 * Device states
 */
#define DEVST_UP	0
#define DEVST_BOOTP	1
#define DEVST_DHCPDISC	2
#define DEVST_DHCPREQ	3
#define DEVST_COMPLETE	4
#define DEVST_ERROR	5

int netdev_getflags(struct netdev *dev, short *flags);
int netdev_setaddress(struct netdev *dev);
int netdev_setdefaultroute(struct netdev *dev);
int netdev_up(struct netdev *dev);
int netdev_down(struct netdev *dev);
int netdev_init_if(struct netdev *dev);
int netdev_setmtu(struct netdev *dev);

static inline int netdev_running(struct netdev *dev)
{
	short flags;
	int ret = netdev_getflags(dev, &flags);

	return ret ? 0 : !!(flags & IFF_RUNNING);
}
