123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469 |
- #include <u.h>
- #include <libc.h>
- #include <ip.h>
- #include "dat.h"
- #include "protos.h"
- enum
- {
- Maxoptlen= 312-4,
- /* dhcp types */
- Discover= 1,
- Offer= 2,
- Request= 3,
- Decline= 4,
- Ack= 5,
- Nak= 6,
- Release= 7,
- Inform= 8,
- /* bootp option types */
- OBend= 255,
- OBpad= 0,
- OBmask= 1,
- OBtimeoff= 2,
- OBrouter= 3,
- OBtimeserver= 4,
- OBnameserver= 5,
- OBdnserver= 6,
- OBlogserver= 7,
- OBcookieserver= 8,
- OBlprserver= 9,
- OBimpressserver= 10,
- OBrlserver= 11,
- OBhostname= 12, /* 0xc0 */
- OBbflen= 13,
- OBdumpfile= 14,
- OBdomainname= 15,
- OBswapserver= 16, /* 0x10 */
- OBrootpath= 17,
- OBextpath= 18,
- OBipforward= 19,
- OBnonlocal= 20,
- OBpolicyfilter= 21,
- OBmaxdatagram= 22,
- OBttl= 23,
- OBpathtimeout= 24,
- OBpathplateau= 25,
- OBmtu= 26,
- OBsubnetslocal= 27,
- OBbaddr= 28,
- OBdiscovermask= 29,
- OBsupplymask= 30,
- OBdiscoverrouter= 31,
- OBrsserver= 32, /* 0x20 */
- OBstaticroutes= 33,
- OBtrailerencap= 34,
- OBarptimeout= 35,
- OBetherencap= 36,
- OBtcpttl= 37,
- OBtcpka= 38,
- OBtcpkag= 39,
- OBnisdomain= 40,
- OBniserver= 41,
- OBntpserver= 42,
- OBvendorinfo= 43, /* 0x2b */
- OBnetbiosns= 44,
- OBnetbiosdds= 45,
- OBnetbiostype= 46,
- OBnetbiosscope= 47,
- OBxfontserver= 48, /* 0x30 */
- OBxdispmanager= 49,
- OBnisplusdomain= 64, /* 0x40 */
- OBnisplusserver= 65,
- OBhomeagent= 68,
- OBsmtpserver= 69,
- OBpop3server= 70,
- OBnntpserver= 71,
- OBwwwserver= 72,
- OBfingerserver= 73,
- OBircserver= 74,
- OBstserver= 75,
- OBstdaserver= 76,
- /* dhcp options */
- ODipaddr= 50, /* 0x32 */
- ODlease= 51,
- ODoverload= 52,
- ODtype= 53, /* 0x35 */
- ODserverid= 54, /* 0x36 */
- ODparams= 55, /* 0x37 */
- ODmessage= 56,
- ODmaxmsg= 57,
- ODrenewaltime= 58,
- ODrebindingtime= 59,
- ODvendorclass= 60,
- ODclientid= 61, /* 0x3d */
- ODtftpserver= 66,
- ODbootfile= 67,
- /* plan9 vendor info options */
- OP9fsv4= 128, /* plan9 file servers */
- OP9authv4= 129, /* plan9 auth servers */
- };
- /*
- * convert a byte array to hex
- */
- static char
- hex(int x)
- {
- if(x < 10)
- return x + '0';
- return x - 10 + 'a';
- }
- static char*
- phex(char *p, char *e, char *tag, uchar *o, int n)
- {
- p = seprint(p, e, "%s=", tag);
- for(; p+2 < e && n > 0; n--){
- *p++ = hex(*o >> 4);
- *p++ = hex(*o & 0xf);
- o++;
- }
- return p;
- }
- static char*
- pstring(char *p, char *e, char *tag, uchar *o, int n)
- {
- char msg[256];
- if(n > sizeof msg - 1)
- n = sizeof msg - 1;
- memmove(msg, o, n);
- msg[n] = 0;
- return seprint(p, e, "%s=%s", tag, msg);
- }
- static char*
- pint(char *p, char *e, char *tag, uchar *o, int n)
- {
- int x;
- x = *(char*)o++;
- for(; n > 1; n--)
- x = x<<8 | *o++;
- return seprint(p, e, "%s=%d", tag, x);
- }
- static char*
- puint(char *p, char *e, char *tag, uchar *o, int n)
- {
- uint x;
- x = *o++;
- for(; n > 1; n--)
- x = x<<8 | *o++;
- return seprint(p, e, "%s=%ud", tag, x);
- }
- static char*
- pserver(char *p, char *e, char *tag, uchar *o, int n)
- {
- p = seprint(p, e, "%s=(", tag);
- while(n >= 4){
- p = seprint(p, e, " %V", o);
- n -= 4;
- o += 4;
- }
- p = seprint(p, e, ")");
- return p;
- }
- static char *dhcptype[256] =
- {
- [Discover] "Discover",
- [Offer] "Offer",
- [Request] "Request",
- [Decline] "Decline",
- [Ack] "Ack",
- [Nak] "Nak",
- [Release] "Release",
- [Inform] "Inform",
- };
- static char*
- ptype(char *p, char *e, uchar val)
- {
- char *x;
- x = dhcptype[val];
- if(x != nil)
- return seprint(p, e, "t=%s", x);
- else
- return seprint(p, e, "t=%d", val);
- }
- static int
- p_seprint(Msg *m)
- {
- int i, n, code;
- uchar *o, *ps;
- char *p, *e;
- char msg[64];
- /* no next proto */
- m->pr = nil;
- p = m->p;
- e = m->e;
- ps = m->ps;
- while(ps < m->pe){
- code = *ps++;
- if(code == 255)
- break;
- if(code == 0)
- continue;
- /* ignore anything that's too long */
- n = *ps++;
- o = ps;
- ps += n;
- if(ps > m->pe)
- break;
- switch(code){
- case ODipaddr: /* requested ip address */
- p = pserver(p, e, "ipaddr", o, n);
- break;
- case ODlease: /* requested lease time */
- p = pint(p, e, "lease", o, n);
- break;
- case ODtype:
- p = ptype(p, e, *o);
- break;
- case ODserverid:
- p = pserver(p, e, "serverid", o, n);
- break;
- case ODmessage:
- p = pstring(p, e, "message", o, n);
- break;
- case ODmaxmsg:
- p = puint(p, e, "maxmsg", o, n);
- break;
- case ODclientid:
- p = phex(p, e, "clientid", o, n);
- break;
- case ODparams:
- p = seprint(p, e, " requested=(");
- for(i = 0; i < n; i++){
- if(i != 0)
- p = seprint(p, e, " ");
- p = seprint(p, e, "%ud", o[i]);
- }
- p = seprint(p, e, ")");
- break;
- case ODvendorclass:
- p = pstring(p, e, "vendorclass", o, n);
- break;
- case OBmask:
- p = pserver(p, e, "mask", o, n);
- break;
- case OBtimeoff:
- p = pint(p, e, "timeoff", o, n);
- break;
- case OBrouter:
- p = pserver(p, e, "router", o, n);
- break;
- case OBtimeserver:
- p = pserver(p, e, "timesrv", o, n);
- break;
- case OBnameserver:
- p = pserver(p, e, "namesrv", o, n);
- break;
- case OBdnserver:
- p = pserver(p, e, "dnssrv", o, n);
- break;
- case OBlogserver:
- p = pserver(p, e, "logsrv", o, n);
- break;
- case OBcookieserver:
- p = pserver(p, e, "cookiesrv", o, n);
- break;
- case OBlprserver:
- p = pserver(p, e, "lprsrv", o, n);
- break;
- case OBimpressserver:
- p = pserver(p, e, "impresssrv", o, n);
- break;
- case OBrlserver:
- p = pserver(p, e, "rlsrv", o, n);
- break;
- case OBhostname:
- p = pstring(p, e, "hostname", o, n);
- break;
- case OBbflen:
- break;
- case OBdumpfile:
- p = pstring(p, e, "dumpfile", o, n);
- break;
- case OBdomainname:
- p = pstring(p, e, "domname", o, n);
- break;
- case OBswapserver:
- p = pserver(p, e, "swapsrv", o, n);
- break;
- case OBrootpath:
- p = pstring(p, e, "rootpath", o, n);
- break;
- case OBextpath:
- p = pstring(p, e, "extpath", o, n);
- break;
- case OBipforward:
- p = phex(p, e, "ipforward", o, n);
- break;
- case OBnonlocal:
- p = phex(p, e, "nonlocal", o, n);
- break;
- case OBpolicyfilter:
- p = phex(p, e, "policyfilter", o, n);
- break;
- case OBmaxdatagram:
- p = phex(p, e, "maxdatagram", o, n);
- break;
- case OBttl:
- p = puint(p, e, "ttl", o, n);
- break;
- case OBpathtimeout:
- p = puint(p, e, "pathtimeout", o, n);
- break;
- case OBpathplateau:
- p = phex(p, e, "pathplateau", o, n);
- break;
- case OBmtu:
- p = puint(p, e, "mtu", o, n);
- break;
- case OBsubnetslocal:
- p = pserver(p, e, "subnet", o, n);
- break;
- case OBbaddr:
- p = pserver(p, e, "baddr", o, n);
- break;
- case OBdiscovermask:
- p = pserver(p, e, "discovermsak", o, n);
- break;
- case OBsupplymask:
- p = pserver(p, e, "rousupplymaskter", o, n);
- break;
- case OBdiscoverrouter:
- p = pserver(p, e, "discoverrouter", o, n);
- break;
- case OBrsserver:
- p = pserver(p, e, "rsrouter", o, n);
- break;
- case OBstaticroutes:
- p = phex(p, e, "staticroutes", o, n);
- break;
- case OBtrailerencap:
- p = phex(p, e, "trailerencap", o, n);
- break;
- case OBarptimeout:
- p = puint(p, e, "arptimeout", o, n);
- break;
- case OBetherencap:
- p = phex(p, e, "etherencap", o, n);
- break;
- case OBtcpttl:
- p = puint(p, e, "tcpttl", o, n);
- break;
- case OBtcpka:
- p = puint(p, e, "tcpka", o, n);
- break;
- case OBtcpkag:
- p = phex(p, e, "tcpkag", o, n);
- break;
- case OBnisdomain:
- p = pstring(p, e, "nisdomain", o, n);
- break;
- case OBniserver:
- p = pserver(p, e, "nisrv", o, n);
- break;
- case OBntpserver:
- p = pserver(p, e, "ntpsrv", o, n);
- break;
- case OBvendorinfo:
- p = phex(p, e, "vendorinfo", o, n);
- break;
- case OBnetbiosns:
- p = pserver(p, e, "biosns", o, n);
- break;
- case OBnetbiosdds:
- p = phex(p, e, "biosdds", o, n);
- break;
- case OBnetbiostype:
- p = phex(p, e, "biostype", o, n);
- break;
- case OBnetbiosscope:
- p = phex(p, e, "biosscope", o, n);
- break;
- case OBxfontserver:
- p = pserver(p, e, "fontsrv", o, n);
- break;
- case OBxdispmanager:
- p = pserver(p, e, "xdispmgr", o, n);
- break;
- case OBnisplusdomain:
- p = pstring(p, e, "nisplusdomain", o, n);
- break;
- case OBnisplusserver:
- p = pserver(p, e, "nisplussrv", o, n);
- break;
- case OBhomeagent:
- p = pserver(p, e, "homeagent", o, n);
- break;
- case OBsmtpserver:
- p = pserver(p, e, "smtpsrv", o, n);
- break;
- case OBpop3server:
- p = pserver(p, e, "pop3srv", o, n);
- break;
- case OBnntpserver:
- p = pserver(p, e, "ntpsrv", o, n);
- break;
- case OBwwwserver:
- p = pserver(p, e, "wwwsrv", o, n);
- break;
- case OBfingerserver:
- p = pserver(p, e, "fingersrv", o, n);
- break;
- case OBircserver:
- p = pserver(p, e, "ircsrv", o, n);
- break;
- case OBstserver:
- p = pserver(p, e, "stsrv", o, n);
- break;
- case OBstdaserver:
- p = pserver(p, e, "stdasrv", o, n);
- break;
- case OBend:
- goto out;
- default:
- snprint(msg, sizeof msg, " T%ud", code);
- p = phex(p, e, msg, o, n);
- break;
- }
- if(*ps != OBend)
- p = seprint(p, e, " ");
- }
- out:
- m->p = p;
- m->ps = ps;
- return 0;
- }
- Proto dhcp =
- {
- "dhcp",
- nil,
- nil,
- p_seprint,
- nil,
- nil,
- nil,
- defaultframer,
- };
|