Blame


1 87a52e04 2005-12-26 devnull #include <u.h>
2 87a52e04 2005-12-26 devnull #include <libc.h>
3 87a52e04 2005-12-26 devnull #include <ip.h>
4 87a52e04 2005-12-26 devnull #include "dat.h"
5 87a52e04 2005-12-26 devnull #include "protos.h"
6 87a52e04 2005-12-26 devnull
7 87a52e04 2005-12-26 devnull typedef struct Hdr Hdr;
8 87a52e04 2005-12-26 devnull struct Hdr
9 87a52e04 2005-12-26 devnull {
10 87a52e04 2005-12-26 devnull uchar hrd[2];
11 87a52e04 2005-12-26 devnull uchar pro[2];
12 87a52e04 2005-12-26 devnull uchar hln;
13 87a52e04 2005-12-26 devnull uchar pln;
14 87a52e04 2005-12-26 devnull uchar op[2];
15 87a52e04 2005-12-26 devnull uchar sha[6];
16 87a52e04 2005-12-26 devnull uchar spa[4];
17 87a52e04 2005-12-26 devnull uchar tha[6];
18 87a52e04 2005-12-26 devnull uchar tpa[4];
19 87a52e04 2005-12-26 devnull };
20 87a52e04 2005-12-26 devnull
21 87a52e04 2005-12-26 devnull enum
22 87a52e04 2005-12-26 devnull {
23 cbeb0b26 2006-04-01 devnull ARPLEN= 28
24 87a52e04 2005-12-26 devnull };
25 87a52e04 2005-12-26 devnull
26 87a52e04 2005-12-26 devnull enum
27 87a52e04 2005-12-26 devnull {
28 87a52e04 2005-12-26 devnull Ospa,
29 87a52e04 2005-12-26 devnull Otpa,
30 87a52e04 2005-12-26 devnull Ostpa,
31 87a52e04 2005-12-26 devnull Osha,
32 87a52e04 2005-12-26 devnull Otha,
33 87a52e04 2005-12-26 devnull Ostha,
34 cbeb0b26 2006-04-01 devnull Opa
35 87a52e04 2005-12-26 devnull };
36 87a52e04 2005-12-26 devnull
37 fa325e9b 2020-01-10 cross static Field p_fields[] =
38 87a52e04 2005-12-26 devnull {
39 87a52e04 2005-12-26 devnull {"spa", Fv4ip, Ospa, "protocol source", } ,
40 87a52e04 2005-12-26 devnull {"tpa", Fv4ip, Otpa, "protocol target", } ,
41 87a52e04 2005-12-26 devnull {"a", Fv4ip, Ostpa, "protocol source/target", } ,
42 87a52e04 2005-12-26 devnull {"sha", Fba, Osha, "hardware source", } ,
43 87a52e04 2005-12-26 devnull {"tha", Fba, Otha, "hardware target", } ,
44 87a52e04 2005-12-26 devnull {"ah", Fba, Ostha, "hardware source/target", } ,
45 87a52e04 2005-12-26 devnull {0}
46 87a52e04 2005-12-26 devnull };
47 87a52e04 2005-12-26 devnull
48 87a52e04 2005-12-26 devnull static void
49 87a52e04 2005-12-26 devnull p_compile(Filter *f)
50 87a52e04 2005-12-26 devnull {
51 87a52e04 2005-12-26 devnull if(f->op == '='){
52 87a52e04 2005-12-26 devnull compile_cmp(arp.name, f, p_fields);
53 87a52e04 2005-12-26 devnull return;
54 87a52e04 2005-12-26 devnull }
55 87a52e04 2005-12-26 devnull sysfatal("unknown arp field: %s", f->s);
56 87a52e04 2005-12-26 devnull }
57 87a52e04 2005-12-26 devnull
58 87a52e04 2005-12-26 devnull static int
59 87a52e04 2005-12-26 devnull p_filter(Filter *f, Msg *m)
60 87a52e04 2005-12-26 devnull {
61 87a52e04 2005-12-26 devnull Hdr *h;
62 87a52e04 2005-12-26 devnull
63 87a52e04 2005-12-26 devnull if(m->pe - m->ps < ARPLEN)
64 87a52e04 2005-12-26 devnull return 0;
65 87a52e04 2005-12-26 devnull
66 87a52e04 2005-12-26 devnull h = (Hdr*)m->ps;
67 87a52e04 2005-12-26 devnull m->ps += ARPLEN;
68 87a52e04 2005-12-26 devnull
69 87a52e04 2005-12-26 devnull switch(f->subop){
70 87a52e04 2005-12-26 devnull case Ospa:
71 87a52e04 2005-12-26 devnull return h->pln == 4 && NetL(h->spa) == f->ulv;
72 87a52e04 2005-12-26 devnull case Otpa:
73 87a52e04 2005-12-26 devnull return h->pln == 4 && NetL(h->tpa) == f->ulv;
74 87a52e04 2005-12-26 devnull case Ostpa:
75 87a52e04 2005-12-26 devnull return h->pln == 4 && (NetL(h->tpa) == f->ulv ||
76 87a52e04 2005-12-26 devnull NetL(h->spa) == f->ulv);
77 87a52e04 2005-12-26 devnull case Osha:
78 87a52e04 2005-12-26 devnull return memcmp(h->sha, f->a, h->hln) == 0;
79 87a52e04 2005-12-26 devnull case Otha:
80 87a52e04 2005-12-26 devnull return memcmp(h->tha, f->a, h->hln) == 0;
81 87a52e04 2005-12-26 devnull case Ostha:
82 87a52e04 2005-12-26 devnull return memcmp(h->sha, f->a, h->hln)==0
83 87a52e04 2005-12-26 devnull ||memcmp(h->tha, f->a, h->hln)==0;
84 87a52e04 2005-12-26 devnull }
85 87a52e04 2005-12-26 devnull return 0;
86 87a52e04 2005-12-26 devnull }
87 87a52e04 2005-12-26 devnull
88 87a52e04 2005-12-26 devnull static int
89 87a52e04 2005-12-26 devnull p_seprint(Msg *m)
90 87a52e04 2005-12-26 devnull {
91 87a52e04 2005-12-26 devnull Hdr *h;
92 87a52e04 2005-12-26 devnull
93 87a52e04 2005-12-26 devnull if(m->pe - m->ps < ARPLEN)
94 87a52e04 2005-12-26 devnull return -1;
95 87a52e04 2005-12-26 devnull
96 87a52e04 2005-12-26 devnull h = (Hdr*)m->ps;
97 87a52e04 2005-12-26 devnull m->ps += ARPLEN;
98 87a52e04 2005-12-26 devnull
99 87a52e04 2005-12-26 devnull /* no next protocol */
100 87a52e04 2005-12-26 devnull m->pr = nil;
101 87a52e04 2005-12-26 devnull
102 87a52e04 2005-12-26 devnull m->p = seprint(m->p, m->e, "op=%1d len=%1d/%1d spa=%V sha=%E tpa=%V tha=%E",
103 87a52e04 2005-12-26 devnull NetS(h->op), h->pln, h->hln,
104 87a52e04 2005-12-26 devnull h->spa, h->sha, h->tpa, h->tha);
105 87a52e04 2005-12-26 devnull return 0;
106 87a52e04 2005-12-26 devnull }
107 87a52e04 2005-12-26 devnull
108 87a52e04 2005-12-26 devnull Proto arp =
109 87a52e04 2005-12-26 devnull {
110 87a52e04 2005-12-26 devnull "arp",
111 87a52e04 2005-12-26 devnull p_compile,
112 87a52e04 2005-12-26 devnull p_filter,
113 87a52e04 2005-12-26 devnull p_seprint,
114 87a52e04 2005-12-26 devnull nil,
115 a38a1836 2006-02-14 devnull nil,
116 87a52e04 2005-12-26 devnull p_fields,
117 cbeb0b26 2006-04-01 devnull defaultframer
118 87a52e04 2005-12-26 devnull };
119 87a52e04 2005-12-26 devnull
120 87a52e04 2005-12-26 devnull Proto rarp =
121 87a52e04 2005-12-26 devnull {
122 87a52e04 2005-12-26 devnull "rarp",
123 87a52e04 2005-12-26 devnull p_compile,
124 87a52e04 2005-12-26 devnull p_filter,
125 87a52e04 2005-12-26 devnull p_seprint,
126 87a52e04 2005-12-26 devnull nil,
127 a38a1836 2006-02-14 devnull nil,
128 87a52e04 2005-12-26 devnull p_fields,
129 cbeb0b26 2006-04-01 devnull defaultframer
130 87a52e04 2005-12-26 devnull };