2 * Copyright (c) 2001 - 2003
3 * NetGroup, Politecnico di Torino (Italy)
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the Politecnico di Torino nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 #pragma warning(disable : 4131) //old style function declaration
37 #pragma warning(disable : 4127) // conditional expr is constant (used for while(1) loops)
38 #pragma warning(disable : 4213) //cast on l-value
41 * Initialize the filter machine
43 uint32
bpf_filter_init(register struct bpf_insn
*pc
, MEM_TYPE
*mem_ex
, TME_CORE
*tme
, struct time_conv
*time_ref
)
46 int32 mem
[BPF_MEMWORDS
];
53 * No filter means accept all.
57 RtlZeroMemory(mem
, sizeof(mem
));
69 /* RET INSTRUCTIONS */
75 /* END RET INSTRUCTIONS */
77 /* LD NO PACKET INSTRUCTIONS */
94 case BPF_LD
|BPF_MEM_EX_IMM
|BPF_B
:
95 A
= mem_ex
->buffer
[pc
->k
];
98 case BPF_LDX
|BPF_MEM_EX_IMM
|BPF_B
:
99 X
= mem_ex
->buffer
[pc
->k
];
102 case BPF_LD
|BPF_MEM_EX_IMM
|BPF_H
:
103 tmp2
=(uint16
*)&mem_ex
->buffer
[pc
->k
];
118 case BPF_LDX
|BPF_MEM_EX_IMM
|BPF_H
:
119 tmp2
=(uint16
*)&mem_ex
->buffer
[pc
->k
];
134 case BPF_LD
|BPF_MEM_EX_IMM
|BPF_W
:
135 tmp
=(uint32
*)&mem_ex
->buffer
[pc
->k
];
149 case BPF_LDX
|BPF_MEM_EX_IMM
|BPF_W
:
150 tmp
=(uint32
*)&mem_ex
->buffer
[pc
->k
];
164 case BPF_LD
|BPF_MEM_EX_IND
|BPF_B
:
166 if ((int32
)k
>= (int32
)mem_ex
->size
) {
169 A
= mem_ex
->buffer
[k
];
172 case BPF_LD
|BPF_MEM_EX_IND
|BPF_H
:
174 if ((int32
)(k
+1)>= (int32
)mem_ex
->size
) {
177 tmp2
=(uint16
*)&mem_ex
->buffer
[k
];
192 case BPF_LD
|BPF_MEM_EX_IND
|BPF_W
:
194 if ((int32
)(k
+3)>= (int32
)mem_ex
->size
) {
197 tmp
=(uint32
*)&mem_ex
->buffer
[k
];
210 /* END LD NO PACKET INSTRUCTIONS */
212 /* STORE INSTRUCTIONS */
221 case BPF_ST
|BPF_MEM_EX_IMM
|BPF_B
:
222 mem_ex
->buffer
[pc
->k
]=(uint8
)A
;
225 case BPF_STX
|BPF_MEM_EX_IMM
|BPF_B
:
226 mem_ex
->buffer
[pc
->k
]=(uint8
)X
;
229 case BPF_ST
|BPF_MEM_EX_IMM
|BPF_W
:
230 tmp
=(uint32
*)&mem_ex
->buffer
[pc
->k
];
244 case BPF_STX
|BPF_MEM_EX_IMM
|BPF_W
:
245 tmp
=(uint32
*)&mem_ex
->buffer
[pc
->k
];
259 case BPF_ST
|BPF_MEM_EX_IMM
|BPF_H
:
260 tmp2
=(uint16
*)&mem_ex
->buffer
[pc
->k
];
274 case BPF_STX
|BPF_MEM_EX_IMM
|BPF_H
:
275 tmp2
=(uint16
*)&mem_ex
->buffer
[pc
->k
];
289 case BPF_ST
|BPF_MEM_EX_IND
|BPF_B
:
290 mem_ex
->buffer
[pc
->k
+X
]=(uint8
)A
;
292 case BPF_ST
|BPF_MEM_EX_IND
|BPF_W
:
293 tmp
=(uint32
*)&mem_ex
->buffer
[pc
->k
+X
];
308 case BPF_ST
|BPF_MEM_EX_IND
|BPF_H
:
309 tmp2
=(uint16
*)&mem_ex
->buffer
[pc
->k
+X
];
322 /* END STORE INSTRUCTIONS */
324 /* JUMP INSTRUCTIONS */
329 case BPF_JMP
|BPF_JGT
|BPF_K
:
330 pc
+= ((int32
)A
> (int32
)pc
->k
) ? pc
->jt
: pc
->jf
;
333 case BPF_JMP
|BPF_JGE
|BPF_K
:
334 pc
+= ((int32
)A
>= (int32
)pc
->k
) ? pc
->jt
: pc
->jf
;
337 case BPF_JMP
|BPF_JEQ
|BPF_K
:
338 pc
+= ((int32
)A
== (int32
)pc
->k
) ? pc
->jt
: pc
->jf
;
341 case BPF_JMP
|BPF_JSET
|BPF_K
:
342 pc
+= (A
& pc
->k
) ? pc
->jt
: pc
->jf
;
345 case BPF_JMP
|BPF_JGT
|BPF_X
:
346 pc
+= (A
> X
) ? pc
->jt
: pc
->jf
;
349 case BPF_JMP
|BPF_JGE
|BPF_X
:
350 pc
+= (A
>= X
) ? pc
->jt
: pc
->jf
;
353 case BPF_JMP
|BPF_JEQ
|BPF_X
:
354 pc
+= (A
== X
) ? pc
->jt
: pc
->jf
;
357 case BPF_JMP
|BPF_JSET
|BPF_X
:
358 pc
+= (A
& X
) ? pc
->jt
: pc
->jf
;
360 /* END JUMP INSTRUCTIONS */
362 /* ARITHMETIC INSTRUCTIONS */
363 case BPF_ALU
|BPF_ADD
|BPF_X
:
367 case BPF_ALU
|BPF_SUB
|BPF_X
:
371 case BPF_ALU
|BPF_MUL
|BPF_X
:
375 case BPF_ALU
|BPF_DIV
|BPF_X
:
381 case BPF_ALU
|BPF_AND
|BPF_X
:
385 case BPF_ALU
|BPF_OR
|BPF_X
:
389 case BPF_ALU
|BPF_LSH
|BPF_X
:
393 case BPF_ALU
|BPF_RSH
|BPF_X
:
397 case BPF_ALU
|BPF_ADD
|BPF_K
:
401 case BPF_ALU
|BPF_SUB
|BPF_K
:
405 case BPF_ALU
|BPF_MUL
|BPF_K
:
409 case BPF_ALU
|BPF_DIV
|BPF_K
:
413 case BPF_ALU
|BPF_AND
|BPF_K
:
417 case BPF_ALU
|BPF_OR
|BPF_K
:
421 case BPF_ALU
|BPF_LSH
|BPF_K
:
425 case BPF_ALU
|BPF_RSH
|BPF_K
:
429 case BPF_ALU
|BPF_NEG
:
430 (int32
)A
= -((int32
)A
);
432 /* ARITHMETIC INSTRUCTIONS */
434 /* MISC INSTRUCTIONS */
435 case BPF_MISC
|BPF_TAX
:
439 case BPF_MISC
|BPF_TXA
:
442 /* END MISC INSTRUCTIONS */
444 /* TME INSTRUCTIONS */
445 case BPF_MISC
|BPF_TME
|BPF_LOOKUP
:
446 j
=lookup_frontend(mem_ex
,tme
,pc
->k
,time_ref
);
449 pc
+= (j
== TME_TRUE
) ? pc
->jt
: pc
->jf
;
452 case BPF_MISC
|BPF_TME
|BPF_EXECUTE
:
453 if (execute_frontend(mem_ex
,tme
,0,pc
->k
)==TME_ERROR
)
457 case BPF_MISC
|BPF_TME
|BPF_INIT
:
458 if (init_tme_block(tme
,pc
->k
)==TME_ERROR
)
462 case BPF_MISC
|BPF_TME
|BPF_VALIDATE
:
463 if (validate_tme_block(mem_ex
,tme
,A
,pc
->k
)==TME_ERROR
)
467 case BPF_MISC
|BPF_TME
|BPF_SET_MEMORY
:
468 if (init_extended_memory(pc
->k
,mem_ex
)==TME_ERROR
)
472 case BPF_MISC
|BPF_TME
|BPF_SET_ACTIVE
:
473 if (set_active_tme_block(tme
,pc
->k
)==TME_ERROR
)
477 case BPF_MISC
|BPF_TME
|BPF_SET_ACTIVE_READ
:
478 if (set_active_tme_block(tme
,pc
->k
)==TME_ERROR
)
481 case BPF_MISC
|BPF_TME
|BPF_SET_WORKING
:
482 if (pc
->k
>=MAX_TME_DATA_BLOCKS
)
489 case BPF_MISC
|BPF_TME
|BPF_RESET
:
490 if (reset_tme(tme
)==TME_ERROR
)
494 case BPF_MISC
|BPF_TME
|BPF_GET_REGISTER_VALUE
:
495 if (get_tme_block_register(&tme
->block_data
[tme
->working
],mem_ex
,pc
->k
,&j
)==TME_ERROR
)
500 case BPF_MISC
|BPF_TME
|BPF_SET_REGISTER_VALUE
:
501 if (set_tme_block_register(&tme
->block_data
[tme
->working
],mem_ex
,pc
->k
,A
,TRUE
)==TME_ERROR
)
505 case BPF_MISC
|BPF_TME
|BPF_SET_AUTODELETION
:
506 set_autodeletion(&tme
->block_data
[tme
->working
],pc
->k
);
509 /* END TME INSTRUCTIONS */