1IP: module 2{ 3 PATH: con "/dis/lib/ip.dis"; 4 5 IPaddrlen: con 16; 6 IPv4addrlen: con 4; 7 IPv4off: con 12; 8 9 IPaddr: adt { 10 a: array of byte; 11 12 newv6: fn(nil: array of byte): IPaddr; 13 newv4: fn(nil: array of byte): IPaddr; 14 copy: fn(nil: self IPaddr): IPaddr; 15 eq: fn(nil: self IPaddr, v: IPaddr): int; 16 mask: fn(nil: self IPaddr, m: IPaddr): IPaddr; 17 maskn: fn(nil: self IPaddr, m: IPaddr): IPaddr; 18 isv4: fn(nil: self IPaddr): int; 19 ismulticast: fn(nil: self IPaddr): int; 20 isvalid: fn(nil: self IPaddr): int; 21 22 v4: fn(nil: self IPaddr): array of byte; 23 v6: fn(nil: self IPaddr): array of byte; 24 class: fn(nil: self IPaddr): int; 25 classmask: fn(nil: self IPaddr): IPaddr; 26 27 parse: fn(s: string): (int, IPaddr); 28 parsemask: fn(s: string): (int, IPaddr); 29 parsecidr: fn(s: string): (int, IPaddr, IPaddr); 30 31 text: fn(nil: self IPaddr): string; 32 masktext: fn(nil: self IPaddr): string; 33 }; 34 35 v4bcast, v4allsys, v4allrouter, v4noaddr, noaddr, allbits, selfv6, selfv4: IPaddr; 36 v4prefix: array of byte; 37 38 Ifcaddr: adt { 39 ip: IPaddr; 40 mask: IPaddr; 41 net: IPaddr; 42 preflt: big; 43 validlt: big; 44 }; 45 46 Ipifc: adt { 47 index: int; # /net/ipifc/N 48 dev: string; # bound device 49 addrs: list of ref Ifcaddr; 50 sendra: int; # !=0, send router adverts 51 recvra: int; # !=0, receive router adverts 52 mtu: int; 53 pktin: big; # packets in 54 pktout: big; # packets out 55 errin: big; # input errors 56 errout: big; # output errors 57 rp: IPv6rp; # IPv6 route advert params 58 }; 59 60 IPv6rp: adt { 61 mflag: int; 62 oflag: int; 63 maxraint: int; # max route advert interval 64 minraint: int; # min route advert interval 65 linkmtu: int; 66 reachtime: int; 67 rxmitra: int; 68 ttl: int; 69 routerlt: int; 70 }; 71 72 Udp4hdrlen: con 2*IPv4addrlen+2*2; 73 OUdphdrlen: con 2*IPaddrlen+2*2; 74 75 Udphdrlen: con 52; 76 Udpraddr: con 0; 77 Udpladdr: con Udpraddr + IPaddrlen; 78 Udpifcaddr: con Udpladdr + IPaddrlen; 79 Udprport: con Udpifcaddr + IPaddrlen; 80 Udplport: con Udprport + 2; 81 82 Udphdr: adt { 83 raddr: IPaddr; 84 laddr: IPaddr; 85 ifcaddr: IPaddr; 86 rport: int; 87 lport: int; 88 89 new: fn(): ref Udphdr; 90 unpack: fn(a: array of byte, n: int): ref Udphdr; 91 pack: fn(h: self ref Udphdr, a: array of byte, n: int); 92 }; 93 94 init: fn(); 95 readipifc: fn(net: string, index: int): (list of ref Ipifc, string); 96 addressesof: fn(l: list of ref Ipifc, all: int): list of IPaddr; 97 interfaceof: fn(l: list of ref Ipifc, ip: IPaddr): (ref Ipifc, ref Ifcaddr); 98 ownerof: fn(l: list of ref Ipifc, ip: IPaddr): (ref Ipifc, ref Ifcaddr); 99 100 get2: fn(a: array of byte, o: int): int; 101 put2: fn(a: array of byte, o: int, v: int): int; 102 get4: fn(a: array of byte, o: int): int; 103 put4: fn(a: array of byte, o: int, v: int): int; 104}; 105