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;};
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;
};