URI:
       tpppoe_disc.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tpppoe_disc.c (2516B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <ip.h>
            4 #include "dat.h"
            5 #include "protos.h"
            6 
            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 enum
           15 {
           16         HDRSIZE = 1+1+2+2
           17 };
           18 
           19 static Mux p_mux[] =
           20 {
           21         {"ppp",                0,        } ,
           22         {0}
           23 };
           24 
           25 enum
           26 {
           27         Overs,
           28         Otype,
           29         Ocode,
           30         Osess
           31 };
           32 
           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 };
           41 
           42 static void
           43 p_compilesess(Filter *f)
           44 {
           45 /*        Mux *m; */
           46 
           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 void
           63 p_compiledisc(Filter *f)
           64 {
           65 /*        Mux *m; */
           66 
           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 }
           82 
           83 static int
           84 p_filter(Filter *f, Msg *m)
           85 {
           86         Hdr *h;
           87 
           88         if(m->pe - m->ps < HDRSIZE)
           89                 return 0;
           90 
           91         h = (Hdr*)m->ps;
           92         m->ps += HDRSIZE;
           93 
           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 }
          106 
          107 /* BUG: print all the discovery types */
          108 static int
          109 p_seprintdisc(Msg *m)
          110 {
          111         Hdr *h;
          112         int len;
          113 
          114         len = m->pe - m->ps;
          115         if(len < HDRSIZE)
          116                 return -1;
          117 
          118         h = (Hdr*)m->ps;
          119         m->ps += HDRSIZE;
          120 
          121         m->pr = nil;
          122 
          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));
          125 
          126         return 0;
          127 }
          128 
          129 static int
          130 p_seprintsess(Msg *m)
          131 {
          132         Hdr *h;
          133         int len;
          134 
          135         len = m->pe - m->ps;
          136         if(len < HDRSIZE)
          137                 return -1;
          138 
          139         h = (Hdr*)m->ps;
          140         m->ps += HDRSIZE;
          141 
          142         /* this will call ppp for me */
          143         demux(p_mux, 0, 0, m, &dump);
          144 
          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));
          147 
          148         return 0;
          149 }
          150 
          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         defaultframer
          161 };
          162 
          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         defaultframer
          173 };