Blob
1 #include <u.h>2 #include <libc.h>3 #include <ip.h>4 #include "dat.h"5 #include "protos.h"7 typedef struct Hdr Hdr;8 struct Hdr {9 uchar verstype;10 uchar code;11 uchar sessid[2];12 uchar length[2]; /* of payload */13 };14 enum15 {16 HDRSIZE = 1+1+2+217 };19 static Mux p_mux[] =20 {21 {"ppp", 0, } ,22 {0}23 };25 enum26 {27 Overs,28 Otype,29 Ocode,30 Osess,31 };33 static Field p_fields[] =34 {35 {"v", Fnum, Overs, "version", } ,36 {"t", Fnum, Otype, "type", } ,37 {"c", Fnum, Ocode, "code" } ,38 {"s", Fnum, Osess, "sessid" } ,39 {0}40 };42 static void43 p_compilesess(Filter *f)44 {45 // Mux *m;47 if(f->op == '='){48 compile_cmp(pppoe_sess.name, f, p_fields);49 return;50 }51 /*52 for(m = p_mux; m->name != nil; m++)53 if(strcmp(f->s, m->name) == 0){54 f->pr = m->pr;55 f->ulv = m->val;56 f->subop = Ot;57 return;58 }59 */60 sysfatal("unknown pppoe field or protocol: %s", f->s);61 }62 static void63 p_compiledisc(Filter *f)64 {65 // Mux *m;67 if(f->op == '='){68 compile_cmp(pppoe_disc.name, f, p_fields);69 return;70 }71 /*72 for(m = p_mux; m->name != nil; m++)73 if(strcmp(f->s, m->name) == 0){74 f->pr = m->pr;75 f->ulv = m->val;76 f->subop = Ot;77 return;78 }79 */80 sysfatal("unknown pppoe field or protocol: %s", f->s);81 }83 static int84 p_filter(Filter *f, Msg *m)85 {86 Hdr *h;88 if(m->pe - m->ps < HDRSIZE)89 return 0;91 h = (Hdr*)m->ps;92 m->ps += HDRSIZE;94 switch(f->subop){95 case Overs:96 return (h->verstype>>4) == f->ulv;97 case Otype:98 return (h->verstype&0xF) == f->ulv;99 case Ocode:100 return h->code == f->ulv;101 case Osess:102 return NetS(h->sessid) == f->ulv;103 }104 return 0;105 }107 /* BUG: print all the discovery types */108 static int109 p_seprintdisc(Msg *m)110 {111 Hdr *h;112 int len;114 len = m->pe - m->ps;115 if(len < HDRSIZE)116 return -1;118 h = (Hdr*)m->ps;119 m->ps += HDRSIZE;121 m->pr = nil;123 m->p = seprint(m->p, m->e, "v=%d t=%d c=0x%x s=0x%ux, len=%d",124 h->verstype>>4, h->verstype&0xF, h->code, NetS(h->sessid), NetS(h->length));126 return 0;127 }129 static int130 p_seprintsess(Msg *m)131 {132 Hdr *h;133 int len;135 len = m->pe - m->ps;136 if(len < HDRSIZE)137 return -1;139 h = (Hdr*)m->ps;140 m->ps += HDRSIZE;142 /* this will call ppp for me */143 demux(p_mux, 0, 0, m, &dump);145 m->p = seprint(m->p, m->e, "v=%d t=%d c=0x%x s=0x%ux, len=%d",146 h->verstype>>4, h->verstype&0xF, h->code, NetS(h->sessid), NetS(h->length));148 return 0;149 }151 Proto pppoe_disc =152 {153 "pppoe_disc",154 p_compiledisc,155 p_filter,156 p_seprintdisc,157 p_mux,158 "%lud",159 p_fields,160 defaultframer161 };163 Proto pppoe_sess =164 {165 "pppoe_sess",166 p_compilesess,167 p_filter,168 p_seprintsess,169 p_mux,170 "%lud",171 p_fields,172 defaultframer173 };