#include #include #include #include #include #include "nbcache.h" enum { Iapttl = 30 }; /* * This packet format is Snell and Wilcox Propritory * and is a simple service advertising protocol */ void iap(Pkt *p) { Node *n; uchar ipaddr[IPv4addrlen]; char *attr[64], *value[64]; int i, num, sys, ip, ver, iap; if((num = tokenize((char *)p->pos, attr, nelem(attr))) < 1) return; ip = -1; iap = -1; sys = -1; ver = -1; for(i = 0; i < num; i++){ if((value[i] = strchr(attr[i], '=')) != nil) *value[i]++ = 0; strlwr(attr[i]); if(strcmp(attr[i], "ipaddr") == 0) ip = i; if(strcmp(attr[i], "iap") == 0) iap = i; if(strcmp(attr[i], "sys") == 0) sys = i; if(strcmp(attr[i], "version") == 0) ver = i; } if(iap == -1) return; if(ver == -1 || strcmp(value[ver], "1.0") != 0){ print("wrong version\n"); return; } if(sys != -1) n = getnode(Thost, Iapttl, "%s", value[sys]); else if(ip != -1) n = getnode(Thost, Iapttl, "iap-%s", value[ip]); else return; setval(n, "ip", value[ip]); v4parseip(ipaddr, value[ip]); if(Debug) setval(n, "src", "iap"); for(i = 1; i < num; i++){ if(i == ver || i == sys || i == ip) continue; setval(n, attr[i], "%s", value[i]); } }