summaryrefslogtreecommitdiffstats
path: root/usr/kinit/ipconfig/netdev.h
blob: dbc80cd09d116b8bc08200c846f7e522e8c49d5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#ifndef IPCONFIG_NETDEV_H
#define IPCONFIG_NETDEV_H

#include <arpa/inet.h>
#include <sys/utsname.h>
#include <net/if.h>

#define BPLEN		256
#define FNLEN		128			/* from DHCP  RFC 2131 */

struct route {
	uint32_t subnet;			/* subnet            */
	uint32_t netmask_width;	/* subnet mask width */
	uint32_t gateway;		/* gateway           */
	struct route *next;
};

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

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

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

	uint8_t proto;          /* a protocol used (e.g. PROTO_DHCP) */
	uint32_t ip_addr;	/* my address           */
	uint32_t ip_broadcast;	/* broadcast address    */
	uint32_t ip_server;	/* server address       */
	uint32_t ip_netmask;	/* my subnet mask       */
	uint32_t ip_gateway;	/* my gateway           */
	uint32_t ip_nameserver[2];	/* two nameservers      */
	uint32_t serverid;		/* dhcp serverid        */
	uint32_t dhcpleasetime;	/* duration in seconds  */
	char reqhostname[SYS_NMLN];	/* requested hostname   */
	char hostname[SYS_NMLN];	/* hostname             */
	char dnsdomainname[SYS_NMLN];	/* dns domain name      */
	char nisdomainname[SYS_NMLN];	/* nis domain name      */
	char bootpath[BPLEN];	/* boot path            */
	char filename[FNLEN];   /* filename             */
	char *domainsearch;	/* decoded, NULL or malloc-ed  */
	struct route *routes;	/* decoded, NULL or malloc-ed list */
	long uptime;		/* when complete configuration */
	int pkt_fd;		/* packet socket for this interface */
	struct netdev *next;	/* next configured i/f  */
};

extern struct netdev *ifaces;

/*
 * 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_setroutes(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);
}

static inline uint32_t netdev_genmask(uint32_t netmask_width)
{
	/* Map netmask width to network mask in network byte order.
	   Example: 24 -> "255.255.255.0" -> htonl(0xFFFFFF00) */
	if (netmask_width == 0) {
		return 0;
	} else {
		return htonl(~((1u << (32 - netmask_width)) - 1));
	}
}

#endif /* IPCONFIG_NETDEV_H */