jehanne/sys/src/cmd/ip/ipconfig/ipconfig.h

275 lines
6.1 KiB
C

/*
* 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.
*/
/* Portions of this file are Copyright (C) 2015-2018 Giacomo Tesio <giacomo@tesio.it>
* See /doc/license/gpl-2.0.txt for details about the licensing.
*/
/* Portions of this file are Copyright (C) 9front's team.
* See /doc/license/9front-mit for details about the licensing.
* See http://git.9front.org/plan9front/plan9front/HEAD/info.html for a list of authors.
*/
typedef struct Conf Conf;
typedef struct Ctl Ctl;
struct Conf
{
/* locally generated */
char *type;
char *dev;
char mpoint[32];
int cfd; /* ifc control channel */
int dfd; /* ifc data channel (for ppp) */
char *cputype;
uint8_t hwa[32]; /* hardware address */
int hwatype;
int hwalen;
uint8_t cid[32];
int cidlen;
char *baud;
/* learned info */
uint8_t gaddr[IPaddrlen];
uint8_t laddr[IPaddrlen];
uint8_t mask[IPaddrlen];
uint8_t raddr[IPaddrlen];
uint8_t dns[2*IPaddrlen];
uint8_t fs[2*IPaddrlen];
uint8_t auth[2*IPaddrlen];
uint8_t ntp[IPaddrlen];
int mtu;
/* dhcp specific */
int state;
int fd;
uint32_t xid;
uint32_t starttime;
char sname[64];
char hostname[32];
char domainname[64];
uint8_t server[IPaddrlen]; /* server IP address */
uint32_t offered; /* offered lease time */
uint32_t lease; /* lease time */
uint32_t resend; /* # of resends for current state */
uint32_t timeout; /* time to timeout - seconds */
/*
* IPv6
*/
/* solicitation specific - XXX add support for IPv6 leases */
// uint32_t solicit_retries;
/* router-advertisement related */
uint8_t sendra;
uint8_t recvra;
uint8_t mflag;
uint8_t oflag;
int maxraint; /* rfc2461, p.39: 4sec ≤ maxraint ≤ 1800sec, def 600 */
int minraint; /* 3sec ≤ minraint ≤ 0.75*maxraint */
int linkmtu;
int reachtime; /* 3,600,000 msec, default 0 */
int rxmitra; /* default 0 */
int ttl; /* default 0 (unspecified) */
/* default gateway params */
uint8_t v6gaddr[IPaddrlen];
int routerlt; /* router life time */
/* prefix related */
uint8_t v6pref[IPaddrlen];
int prefixlen;
uint8_t onlink; /* flag: address is `on-link' */
uint8_t autoflag; /* flag: autonomous */
uint32_t validlt; /* valid lifetime (seconds) */
uint32_t preflt; /* preferred lifetime (seconds) */
};
struct Ctl
{
Ctl *next;
char *ctl;
};
extern Ctl *firstctl, **ctll;
extern Conf conf;
extern int noconfig;
extern int ipv6auto;
extern int debug;
extern int dodhcp;
extern int dolog;
extern int nip;
extern int plan9;
extern int dupl_disc;
extern Conf conf;
extern int myifc;
extern char *vs;
void adddefroute(char*, uint8_t*);
void binddevice(void);
void bootprequest(void);
void controldevice(void);
void dhcpquery(int, int);
void dhcprecv(void);
void dhcpsend(int);
void dhcptimer(void);
void dhcpwatch(int);
void doadd(int);
void doremove(void);
void dounbind(void);
int ipconfig4(void);
int ipconfig6(int);
int32_t jitter(void);
void lookforip(char*);
void mkclientid(void);
int nipifcs(char*);
int openlisten(void);
uint8_t *optaddaddr(uint8_t*, int, uint8_t*);
uint8_t *optaddbyte(uint8_t*, int, int);
uint8_t *optaddstr(uint8_t*, int, char*);
uint8_t *optadd(uint8_t*, int, void*, int);
uint8_t *optadduint32_t(uint8_t*, int, uint32_t);
uint8_t *optaddvec(uint8_t*, int, uint8_t*, int);
int optgetaddrs(uint8_t*, int, uint8_t*, int);
int optgetaddr(uint8_t*, int, uint8_t*);
int optgetbyte(uint8_t*, int);
int optgetstr(uint8_t*, int, char*, int);
uint8_t *optget(uint8_t*, int, int*);
uint32_t optgetuint32_t(uint8_t*, int);
int optgetvec(uint8_t*, int, uint8_t*, int);
int parseoptions(uint8_t *p, int n);
int parseverb(char*);
void procsetname(char *fmt, ...);
void putndb(void);
uint32_t randint(uint32_t low, uint32_t hi);
void usage(void);
int validip(uint8_t*);
void warning(char *fmt, ...);
/*
* IPv6
*/
void doipv6(int);
int ipconfig6(int);
void recvra6(void);
void sendra6(void);
void v6paraminit(Conf *);
typedef struct Headers Headers;
typedef struct Ip4hdr Ip4hdr;
typedef struct Lladdropt Lladdropt;
typedef struct Mtuopt Mtuopt;
typedef struct Prefixopt Prefixopt;
typedef struct Routeradv Routeradv;
typedef struct Routersol Routersol;
enum {
IsRouter = 1,
IsHostRecv = 2,
IsHostNoRecv = 3,
MAClen = 6,
IPv4 = 4,
IPv6 = 6,
Defmtu = 1400,
IP_HOPBYHOP = 0,
ICMPv4 = 1,
IP_IGMPPROTO = 2,
IP_TCPPROTO = 6,
IP_UDPPROTO = 17,
IP_ILPROTO = 40,
IP_v6ROUTE = 43,
IP_v6FRAG = 44,
IP_IPsecESP = 50,
IP_IPsecAH = 51,
IP_v6NOMORE = 59,
ICMP6_RS = 133,
ICMP6_RA = 134,
IP_IN_IP = 41,
};
enum {
MFMASK = 1 << 7,
OCMASK = 1 << 6,
OLMASK = 1 << 7,
AFMASK = 1 << 6,
};
enum {
MAXTTL = 255,
D64HLEN = IPV6HDR_LEN - IPV4HDR_LEN,
IP_MAX = 32*1024,
};
struct Headers {
uint8_t dst[IPaddrlen];
uint8_t src[IPaddrlen];
};
struct Routersol {
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];
uint8_t dst[IPaddrlen];
uint8_t type;
uint8_t code;
uint8_t cksum[2];
uint8_t res[4];
};
struct Routeradv {
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];
uint8_t dst[IPaddrlen];
uint8_t type;
uint8_t code;
uint8_t cksum[2];
uint8_t cttl;
uint8_t mor;
uint8_t routerlt[2];
uint8_t rchbltime[4];
uint8_t rxmtimer[4];
};
struct Lladdropt {
uint8_t type;
uint8_t len;
uint8_t lladdr[MAClen];
};
struct Prefixopt {
uint8_t type;
uint8_t len;
uint8_t plen;
uint8_t lar;
uint8_t validlt[4];
uint8_t preflt[4];
uint8_t reserv[4];
uint8_t pref[IPaddrlen];
};
struct Mtuopt {
uint8_t type;
uint8_t len;
uint8_t reserv[2];
uint8_t mtu[4];
};
void ea2lla(uint8_t *lla, uint8_t *ea);
void ipv62smcast(uint8_t *smcast, uint8_t *a);