ref: 94443daf8e248e65afc8d3f17f26efea22748b51
dir: /module/ip.m/
IP: module
{
PATH: con "/dis/lib/ip.dis";
IPaddrlen: con 16;
IPv4addrlen: con 4;
IPv4off: con 12;
IPaddr: adt {
a: array of byte;
newv6: fn(nil: array of byte): IPaddr;
newv4: fn(nil: array of byte): IPaddr;
copy: fn(nil: self IPaddr): IPaddr;
eq: fn(nil: self IPaddr, v: IPaddr): int;
mask: fn(nil: self IPaddr, m: IPaddr): IPaddr;
maskn: fn(nil: self IPaddr, m: IPaddr): IPaddr;
isv4: fn(nil: self IPaddr): int;
ismulticast: fn(nil: self IPaddr): int;
isvalid: fn(nil: self IPaddr): int;
v4: fn(nil: self IPaddr): array of byte;
v6: fn(nil: self IPaddr): array of byte;
class: fn(nil: self IPaddr): int;
classmask: fn(nil: self IPaddr): IPaddr;
parse: fn(s: string): (int, IPaddr);
parsemask: fn(s: string): (int, IPaddr);
parsecidr: fn(s: string): (int, IPaddr, IPaddr);
text: fn(nil: self IPaddr): string;
masktext: fn(nil: self IPaddr): string;
};
v4bcast, v4allsys, v4allrouter, v4noaddr, noaddr, allbits, selfv6, selfv4: IPaddr;
v4prefix: array of byte;
Ifcaddr: adt {
ip: IPaddr;
mask: IPaddr;
net: IPaddr;
preflt: big;
validlt: big;
};
Ipifc: adt {
index: int; # /net/ipifc/N
dev: string; # bound device
addrs: list of ref Ifcaddr;
sendra: int; # !=0, send router adverts
recvra: int; # !=0, receive router adverts
mtu: int;
pktin: big; # packets in
pktout: big; # packets out
errin: big; # input errors
errout: big; # output errors
rp: IPv6rp; # IPv6 route advert params
};
IPv6rp: adt {
mflag: int;
oflag: int;
maxraint: int; # max route advert interval
minraint: int; # min route advert interval
linkmtu: int;
reachtime: int;
rxmitra: int;
ttl: int;
routerlt: int;
};
Udp4hdrlen: con 2*IPv4addrlen+2*2;
OUdphdrlen: con 2*IPaddrlen+2*2;
Udphdrlen: con 52;
Udpraddr: con 0;
Udpladdr: con Udpraddr + IPaddrlen;
Udpifcaddr: con Udpladdr + IPaddrlen;
Udprport: con Udpifcaddr + IPaddrlen;
Udplport: con Udprport + 2;
Udphdr: adt {
raddr: IPaddr;
laddr: IPaddr;
ifcaddr: IPaddr;
rport: int;
lport: int;
new: fn(): ref Udphdr;
unpack: fn(a: array of byte, n: int): ref Udphdr;
pack: fn(h: self ref Udphdr, a: array of byte, n: int);
};
init: fn();
readipifc: fn(net: string, index: int): (list of ref Ipifc, string);
addressesof: fn(l: list of ref Ipifc, all: int): list of IPaddr;
interfaceof: fn(l: list of ref Ipifc, ip: IPaddr): (ref Ipifc, ref Ifcaddr);
ownerof: fn(l: list of ref Ipifc, ip: IPaddr): (ref Ipifc, ref Ifcaddr);
get2: fn(a: array of byte, o: int): int;
put2: fn(a: array of byte, o: int, v: int): int;
get4: fn(a: array of byte, o: int): int;
put4: fn(a: array of byte, o: int, v: int): int;
};