blob: d622b0debf4c6a747cf398577041a8ef6ccdc2fa [file] [log] [blame]
# Compiled by Clang
# Check that the ipv4_dst is in 192.168.1.0/24
-- c
#include <stdint.h>
#define NETMASK 0xffffff00
#define SUBNET 0xc0a80100
struct eth_hdr {
uint8_t eth_src[6];
uint8_t eth_dst[6];
uint16_t eth_type;
};
struct vlan_hdr {
uint16_t vlan;
uint16_t eth_type;
};
struct ipv4_hdr {
uint8_t ver_ihl;
uint8_t tos;
uint16_t total_length;
uint16_t id;
uint16_t frag;
uint8_t ttl;
uint8_t proto;
uint16_t csum;
uint32_t src;
uint32_t dst;
};
uint64_t entry(void *mem)
{
struct eth_hdr *eth_hdr = (void *)mem;
uint16_t eth_type;
void *next = eth_hdr;
if (eth_hdr->eth_type == __builtin_bswap16(0x8100)) {
struct vlan_hdr *vlan_hdr = (void *)(eth_hdr + 1);
eth_type = vlan_hdr->eth_type;
next = vlan_hdr + 1;
} else {
eth_type = eth_hdr->eth_type;
next = eth_hdr + 1;
}
if (eth_type == __builtin_bswap16(0x0800)) {
struct ipv4_hdr *ipv4_hdr = next;
if ((ipv4_hdr->dst & __builtin_bswap32(NETMASK)) == __builtin_bswap32(SUBNET)) {
return 1;
}
}
return 0;
}
-- asm
mov %r2, 0xe
ldxh %r3, [%r1+12]
jne %r3, 0x81, +2
mov %r2, 0x12
ldxh %r3, [%r1+16]
and %r3, 0xffff
jne %r3, 0x8, +5
add %r1, %r2
mov %r0, 0x1
ldxw %r1, [%r1+16]
and %r1, 0xffffff
jeq %r1, 0x1a8c0, +1
mov %r0, 0x0
exit
-- mem
00 00 c0 9f a0 97 00 a0
cc 3b bf fa 08 00 45 10
00 3c 46 3c 40 00 40 06
73 1c c0 a8 01 02 c0 a8
01 01 06 0e 00 17 99 c5
a0 ec 00 00 00 00 a0 02
7d 78 e0 a3 00 00 02 04
05 b4 04 02 08 0a 00 9c
27 24 00 00 00 00 01 03
03 00
-- result
0x1