#include <u.h>
#include <libc.h>
#include <bio.h>
#include <ndb.h>
#include <ip.h>
#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]);
}
}
|