Last active
April 14, 2017 18:41
-
-
Save williamtu/759eedbefa335c7dbc5700acc0c43ee9 to your computer and use it in GitHub Desktop.
xdp9.c (max BPF stack > 512), see 595: r5 = *(u64 *)(r10 - 600)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| diff --git a/tmp/xdp9.c b/tests/xdp9.c | |
| index 0845fd5..9964d15 100644 | |
| --- a/tmp/xdp9.c | |
| +++ b/tests/xdp9.c | |
| @@ -1,4 +1,4 @@ | |
| -/* Automatically generated by p4c-xdp from xdp9.p4 on Fri Apr 14 10:34:12 2017 | |
| +/* Automatically generated by p4c-xdp from xdp9.p4 on Fri Apr 14 11:14:09 2017 | |
| */ | |
| #include "xdp9.h" | |
| #define KBUILD_MODNAME "xdptest" | |
| @@ -116,7 +116,7 @@ struct bpf_map_def SEC("maps") ebpf_outTable = { | |
| SEC("prog") | |
| int ebpf_filter(struct xdp_md* skb){ | |
| - struct Headers hd = { | |
| + volatile struct Headers hd = { | |
| .ethernet = { | |
| .ebpf_valid = 0 | |
| }, |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| //666: (07) r5 += 104 | |
| BPF program is too large. Processed 65537 insn | |
| Error fetching program/map! | |
| /// | |
| xdp9.o: file format ELF64-BPF | |
| Disassembly of section prog: | |
| ebpf_filter: | |
| ; int ebpf_filter(struct xdp_md* skb){ | |
| 0: r6 = r1 | |
| 1: r7 = 0 | |
| ; volatile struct Headers hd = { | |
| 2: *(u8 *)(r10 - 4) = r7 | |
| 3: *(u8 *)(r10 - 5) = r7 | |
| 4: *(u8 *)(r10 - 6) = r7 | |
| 5: *(u8 *)(r10 - 7) = r7 | |
| 6: *(u8 *)(r10 - 8) = r7 | |
| 7: *(u8 *)(r10 - 9) = r7 | |
| 8: *(u8 *)(r10 - 10) = r7 | |
| 9: *(u8 *)(r10 - 11) = r7 | |
| 10: *(u8 *)(r10 - 12) = r7 | |
| 11: *(u8 *)(r10 - 13) = r7 | |
| 12: *(u8 *)(r10 - 14) = r7 | |
| 13: *(u8 *)(r10 - 15) = r7 | |
| 14: *(u16 *)(r10 - 20) = r7 | |
| 15: *(u8 *)(r10 - 22) = r7 | |
| 16: *(u8 *)(r10 - 23) = r7 | |
| 17: *(u8 *)(r10 - 24) = r7 | |
| 18: *(u8 *)(r10 - 25) = r7 | |
| 19: *(u8 *)(r10 - 26) = r7 | |
| 20: *(u8 *)(r10 - 27) = r7 | |
| 21: *(u16 *)(r10 - 32) = r7 | |
| 22: *(u16 *)(r10 - 34) = r7 | |
| 23: *(u8 *)(r10 - 36) = r7 | |
| 24: *(u8 *)(r10 - 37) = r7 | |
| 25: *(u16 *)(r10 - 40) = r7 | |
| 26: *(u8 *)(r10 - 44) = r7 | |
| 27: *(u8 *)(r10 - 45) = r7 | |
| 28: *(u16 *)(r10 - 48) = r7 | |
| 29: *(u32 *)(r10 - 52) = r7 | |
| 30: *(u32 *)(r10 - 56) = r7 | |
| 31: *(u8 *)(r10 - 60) = r7 | |
| 32: *(u8 *)(r10 - 62) = r7 | |
| 33: *(u16 *)(r10 - 64) = r7 | |
| 34: *(u16 *)(r10 - 68) = r7 | |
| 35: *(u16 *)(r10 - 70) = r7 | |
| 36: *(u32 *)(r10 - 76) = r7 | |
| 37: *(u32 *)(r10 - 80) = r7 | |
| 38: *(u8 *)(r10 - 84) = r7 | |
| 39: *(u8 *)(r10 - 85) = r7 | |
| 40: *(u8 *)(r10 - 86) = r7 | |
| 41: *(u8 *)(r10 - 87) = r7 | |
| 42: *(u16 *)(r10 - 92) = r7 | |
| 43: *(u16 *)(r10 - 94) = r7 | |
| 44: *(u16 *)(r10 - 96) = r7 | |
| 45: *(u8 *)(r10 - 98) = r7 | |
| 46: *(u8 *)(r10 - 99) = r7 | |
| 47: *(u16 *)(r10 - 104) = r7 | |
| 48: *(u16 *)(r10 - 106) = r7 | |
| 49: *(u16 *)(r10 - 108) = r7 | |
| 50: *(u16 *)(r10 - 110) = r7 | |
| 51: *(u8 *)(r10 - 112) = r7 | |
| 52: *(u8 *)(r10 - 113) = r7 | |
| 53: *(u16 *)(r10 - 116) = r7 | |
| 54: *(u16 *)(r10 - 120) = r7 | |
| 55: *(u8 *)(r10 - 122) = r7 | |
| 56: *(u8 *)(r10 - 123) = r7 | |
| ; void* ebpf_packetEnd = ((void*)(long)skb->data_end); | |
| 57: r2 = *(u32 *)(r6 + 4) | |
| ; void* ebpf_packetStart = ((void*)(long)skb->data); | |
| 58: r1 = *(u32 *)(r6 + 0) | |
| ; u32 ebpf_zero = 0; | |
| 59: *(u32 *)(r10 - 128) = r7 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) { | |
| 60: r3 = r1 | |
| 61: r3 += 14 | |
| 62: if r3 > r2 goto 784 | |
| ; hd.ethernet.destination[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0)); | |
| 63: r3 = *(u8 *)(r1 + 0) | |
| 64: *(u8 *)(r10 - 4) = r3 | |
| ; hd.ethernet.destination[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0)); | |
| 65: r3 = *(u8 *)(r1 + 1) | |
| 66: *(u8 *)(r10 - 5) = r3 | |
| ; hd.ethernet.destination[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0)); | |
| 67: r3 = *(u8 *)(r1 + 2) | |
| 68: *(u8 *)(r10 - 6) = r3 | |
| ; hd.ethernet.destination[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0)); | |
| 69: r3 = *(u8 *)(r1 + 3) | |
| 70: *(u8 *)(r10 - 7) = r3 | |
| ; hd.ethernet.destination[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0)); | |
| 71: r3 = *(u8 *)(r1 + 4) | |
| 72: *(u8 *)(r10 - 8) = r3 | |
| ; hd.ethernet.destination[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0)); | |
| 73: r3 = *(u8 *)(r1 + 5) | |
| 74: *(u8 *)(r10 - 9) = r3 | |
| ; hd.ethernet.source[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0)); | |
| 75: r3 = *(u8 *)(r1 + 6) | |
| 76: *(u8 *)(r10 - 10) = r3 | |
| ; hd.ethernet.source[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0)); | |
| 77: r3 = *(u8 *)(r1 + 7) | |
| 78: *(u8 *)(r10 - 11) = r3 | |
| ; hd.ethernet.source[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0)); | |
| 79: r3 = *(u8 *)(r1 + 8) | |
| 80: *(u8 *)(r10 - 12) = r3 | |
| ; hd.ethernet.source[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0)); | |
| 81: r3 = *(u8 *)(r1 + 9) | |
| 82: *(u8 *)(r10 - 13) = r3 | |
| ; hd.ethernet.source[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0)); | |
| 83: r3 = *(u8 *)(r1 + 10) | |
| 84: *(u8 *)(r10 - 14) = r3 | |
| ; hd.ethernet.source[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0)); | |
| 85: r3 = *(u8 *)(r1 + 11) | |
| 86: *(u8 *)(r10 - 15) = r3 | |
| ; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 87: r3 = *(u16 *)(r1 + 12) | |
| 88: bswap16 r3 | |
| 89: *(u16 *)(r10 - 20) = r3 | |
| 90: r3 = 1 | |
| ; hd.ethernet.ebpf_valid = 1; | |
| 91: *(u8 *)(r10 - 22) = r3 | |
| 92: r8 = 14 | |
| ; switch (hd.ethernet.protocol) { | |
| 93: r3 = *(u16 *)(r10 - 20) | |
| 94: if r3 != 2048 goto 114 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| 95: r3 = r1 | |
| 96: r3 += 34 | |
| 97: if r3 > r2 goto 749 | |
| ; hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
| 98: r3 = *(u8 *)(r1 + 14) | |
| 99: r3 >>= 4 | |
| 100: *(u8 *)(r10 - 24) = r3 | |
| ; hd.ipv4.ihl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4)); | |
| 101: r3 = *(u8 *)(r1 + 14) | |
| 102: r3 &= 15 | |
| 103: *(u8 *)(r10 - 25) = r3 | |
| ; hd.ipv4.diffserv = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 104: r3 = *(u8 *)(r1 + 15) | |
| 105: *(u8 *)(r10 - 26) = r3 | |
| ; hd.ipv4.totalLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 106: r3 = *(u16 *)(r1 + 16) | |
| 107: bswap16 r3 | |
| 108: *(u16 *)(r10 - 32) = r3 | |
| ; hd.ipv4.identification = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 109: r3 = *(u16 *)(r1 + 18) | |
| 110: bswap16 r3 | |
| 111: *(u16 *)(r10 - 34) = r3 | |
| ; hd.ipv4.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 5) & EBPF_MASK(u8, 3)); | |
| 112: r3 = *(u8 *)(r1 + 20) | |
| 113: r3 >>= 5 | |
| 114: *(u8 *)(r10 - 36) = r3 | |
| ; hd.ipv4.fragOffset = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u16, 13)); | |
| 115: r3 = *(u16 *)(r1 + 20) | |
| 116: r4 = r3 | |
| 117: r4 >>= 8 | |
| 118: r3 <<= 8 | |
| 119: r3 &= 7936 | |
| 120: r3 |= r4 | |
| 121: *(u16 *)(r10 - 40) = r3 | |
| ; hd.ipv4.ttl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 122: r3 = *(u8 *)(r1 + 22) | |
| 123: *(u8 *)(r10 - 44) = r3 | |
| ; hd.ipv4.protocol = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 124: r3 = *(u8 *)(r1 + 23) | |
| 125: *(u8 *)(r10 - 45) = r3 | |
| ; hd.ipv4.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 126: r3 = *(u16 *)(r1 + 24) | |
| 127: bswap16 r3 | |
| 128: *(u16 *)(r10 - 48) = r3 | |
| ; hd.ipv4.srcAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 129: r3 = *(u32 *)(r1 + 26) | |
| 130: bswap32 r3 | |
| 131: *(u32 *)(r10 - 52) = r3 | |
| ; hd.ipv4.dstAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 132: r3 = *(u32 *)(r1 + 30) | |
| 133: bswap32 r3 | |
| 134: *(u32 *)(r10 - 56) = r3 | |
| ; hd.ipv4.ebpf_valid = 1; | |
| 135: r3 = 1 | |
| 136: *(u8 *)(r10 - 60) = r3 | |
| ; switch (hd.ipv4.protocol) { | |
| 137: r3 = *(u8 *)(r10 - 45) | |
| 138: if r3 == 17 goto 16 | |
| 139: if r3 == 6 goto 34 | |
| 140: r8 = 34 | |
| 141: if r3 != 1 goto 67 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) { | |
| 142: r3 = r1 | |
| 143: r3 += 38 | |
| 144: if r3 > r2 goto 702 | |
| ; hd.icmp.typeCode = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 145: r2 = *(u16 *)(r1 + 34) | |
| 146: bswap16 r2 | |
| 147: *(u16 *)(r10 - 116) = r2 | |
| ; hd.icmp.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 148: r1 = *(u16 *)(r1 + 36) | |
| 149: bswap16 r1 | |
| 150: *(u16 *)(r10 - 120) = r1 | |
| ; hd.icmp.ebpf_valid = 1; | |
| 151: r1 = 1 | |
| 152: *(u8 *)(r10 - 122) = r1 | |
| 153: r8 = 38 | |
| 154: goto 54 | |
| LBB0_10: | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) { | |
| 155: r3 = r1 | |
| 156: r3 += 42 | |
| 157: if r3 > r2 goto 689 | |
| ; hd.udp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 158: r2 = *(u16 *)(r1 + 34) | |
| 159: bswap16 r2 | |
| 160: *(u16 *)(r10 - 104) = r2 | |
| ; hd.udp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 161: r2 = *(u16 *)(r1 + 36) | |
| 162: bswap16 r2 | |
| 163: *(u16 *)(r10 - 106) = r2 | |
| ; hd.udp.length_ = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 164: r2 = *(u16 *)(r1 + 38) | |
| 165: bswap16 r2 | |
| 166: *(u16 *)(r10 - 108) = r2 | |
| ; hd.udp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 167: r1 = *(u16 *)(r1 + 40) | |
| 168: bswap16 r1 | |
| 169: *(u16 *)(r10 - 110) = r1 | |
| ; hd.udp.ebpf_valid = 1; | |
| 170: r1 = 1 | |
| 171: *(u8 *)(r10 - 112) = r1 | |
| 172: r8 = 42 | |
| 173: goto 35 | |
| LBB0_8: | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| 174: r3 = r1 | |
| 175: r3 += 54 | |
| 176: if r3 > r2 goto 670 | |
| ; hd.tcp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 177: r2 = *(u16 *)(r1 + 34) | |
| 178: bswap16 r2 | |
| 179: *(u16 *)(r10 - 68) = r2 | |
| ; hd.tcp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 180: r2 = *(u16 *)(r1 + 36) | |
| 181: bswap16 r2 | |
| 182: *(u16 *)(r10 - 70) = r2 | |
| ; hd.tcp.seqNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 183: r2 = *(u32 *)(r1 + 38) | |
| 184: bswap32 r2 | |
| 185: *(u32 *)(r10 - 76) = r2 | |
| ; hd.tcp.ackNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 186: r2 = *(u32 *)(r1 + 42) | |
| 187: bswap32 r2 | |
| 188: *(u32 *)(r10 - 80) = r2 | |
| ; hd.tcp.dataOffset = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
| 189: r2 = *(u8 *)(r1 + 46) | |
| 190: r3 = r2 | |
| 191: r3 >>= 4 | |
| 192: *(u8 *)(r10 - 84) = r3 | |
| ; hd.tcp.res = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4)); | |
| 193: r2 &= 15 | |
| 194: *(u8 *)(r10 - 85) = r2 | |
| ; hd.tcp.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 195: r2 = *(u8 *)(r1 + 47) | |
| 196: *(u8 *)(r10 - 86) = r2 | |
| ; hd.tcp.window = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 197: r2 = *(u16 *)(r1 + 48) | |
| 198: bswap16 r2 | |
| 199: *(u16 *)(r10 - 92) = r2 | |
| ; hd.tcp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 200: r2 = *(u16 *)(r1 + 50) | |
| 201: bswap16 r2 | |
| 202: *(u16 *)(r10 - 94) = r2 | |
| ; hd.tcp.urgentPtr = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 203: r1 = *(u16 *)(r1 + 52) | |
| 204: bswap16 r1 | |
| 205: *(u16 *)(r10 - 96) = r1 | |
| ; hd.tcp.ebpf_valid = 1; | |
| 206: r1 = 1 | |
| 207: *(u8 *)(r10 - 98) = r1 | |
| 208: r8 = 54 | |
| LBB0_12: | |
| ; key.field0 = hd.ethernet.protocol; | |
| 209: r1 = *(u16 *)(r10 - 20) | |
| 210: *(u16 *)(r10 - 136) = r1 | |
| 211: r2 = r10 | |
| 212: r2 += -136 | |
| ; value = bpf_map_lookup_elem(&dstmactable, &key); | |
| 213: r1 = 0ll | |
| 215: call 1 | |
| ; if (value == NULL) { | |
| 216: if r0 != 0 goto 6 | |
| 217: r2 = r10 | |
| ; u8 hit; | |
| 218: r2 += -128 | |
| ; value = bpf_map_lookup_elem(&dstmactable_defaultAction, &ebpf_zero); | |
| 219: r1 = 0ll | |
| 221: call 1 | |
| ; if (value != NULL) { | |
| 222: if r0 == 0 goto 624 | |
| LBB0_14: | |
| 223: r1 = 1 | |
| ; switch (value->action) { | |
| 224: r2 = *(u32 *)(r0 + 0) | |
| 225: if r2 == 1 goto 56 | |
| 226: if r2 != 0 goto 620 | |
| 227: r1 = 4 | |
| ; hd.ipv4.ttl = 4; | |
| 228: *(u8 *)(r10 - 44) = r1 | |
| ; u32 checksum = htons(((u16)version << 12) | ((u16)ihl << 8) | (u16)diffserv); | |
| 229: r2 = *(u8 *)(r10 - 24) | |
| 230: r2 <<= 4 | |
| 231: r2 &= 240 | |
| 232: r1 = *(u8 *)(r10 - 25) | |
| 233: r2 |= r1 | |
| 234: r1 = *(u8 *)(r10 - 26) | |
| 235: r1 <<= 8 | |
| 236: r2 |= r1 | |
| ; checksum += htons(totalLen); | |
| 237: r1 = *(u16 *)(r10 - 32) | |
| 238: bswap16 r1 | |
| 239: r1 += r2 | |
| ; checksum += htons(identification); | |
| 240: r5 = *(u16 *)(r10 - 34) | |
| ; checksum += htons(((u16)flags << 13) | fragOffset); | |
| 241: r2 = *(u8 *)(r10 - 36) | |
| ; tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr); | |
| 242: r3 = *(u16 *)(r10 - 40) | |
| ; checksum += htons(((u16)ttl << 8) | (u16)protocol); | |
| 243: r0 = *(u8 *)(r10 - 44) | |
| 244: r4 = *(u8 *)(r10 - 45) | |
| 245: r4 <<= 8 | |
| 246: r4 |= r0 | |
| ; checksum += htons(identification); | |
| 247: bswap16 r5 | |
| 248: r1 += r5 | |
| ; tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr); | |
| 249: r5 = *(u32 *)(r10 - 52) | |
| ; checksum += (srcAddr >> 16) + (u16)srcAddr; | |
| 250: r0 = r5 | |
| 251: r0 &= -65536 | |
| 252: bswap32 r0 | |
| ; checksum += htons(((u16)flags << 13) | fragOffset); | |
| 253: r1 += r0 | |
| ; checksum += (srcAddr >> 16) + (u16)srcAddr; | |
| 254: bswap16 r5 | |
| ; checksum += htons(((u16)ttl << 8) | (u16)protocol); | |
| 255: r1 += r5 | |
| ; checksum += htons(((u16)flags << 13) | fragOffset); | |
| 256: r2 <<= 13 | |
| 257: r2 |= r3 | |
| ; checksum += (srcAddr >> 16) + (u16)srcAddr; | |
| 258: r1 += r4 | |
| ; tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr); | |
| 259: r3 = *(u32 *)(r10 - 56) | |
| ; checksum += (dstAddr >> 16) + (u16)dstAddr; | |
| 260: r4 = r3 | |
| 261: r4 &= -65536 | |
| 262: bswap32 r4 | |
| ; checksum += (srcAddr >> 16) + (u16)srcAddr; | |
| 263: r1 += r4 | |
| ; checksum += (dstAddr >> 16) + (u16)dstAddr; | |
| 264: bswap16 r3 | |
| 265: r1 += r3 | |
| ; checksum += htons(((u16)flags << 13) | fragOffset); | |
| 266: bswap16 r2 | |
| ; checksum += (dstAddr >> 16) + (u16)dstAddr; | |
| 267: r1 += r2 | |
| 268: r2 = 4294901760ll | |
| 270: r3 = r1 | |
| 271: r3 &= r2 | |
| ; return __constant_ntohs(~((checksum & 0xFFFF) + (checksum >> 16))); | |
| 272: r3 >>= 16 | |
| 273: r3 += r1 | |
| 274: r3 ^= -1 | |
| 275: r1 = r3 | |
| 276: r1 <<= 8 | |
| 277: r3 &= 65280 | |
| 278: r3 >>= 8 | |
| 279: r1 |= r3 | |
| ; hd.ipv4.hdrChecksum = tmp_1; | |
| 280: *(u16 *)(r10 - 48) = r1 | |
| 281: r1 = 2 | |
| LBB0_17: | |
| 282: r9 = 0 | |
| ; xout.output_port = 0; | |
| 283: *(u32 *)(r10 - 132) = r9 | |
| ; xout.output_action = tmp_2; | |
| 284: *(u32 *)(r10 - 136) = r1 | |
| ; if (hd.ethernet.ebpf_valid) ebpf_outHeaderLength += 112; | |
| 285: r2 = *(u8 *)(r10 - 22) | |
| 286: r1 = 0 | |
| 287: if r2 == r9 goto 1 | |
| 288: r1 = 112 | |
| LBB0_19: | |
| ; if (hd.ipv4.ebpf_valid) ebpf_outHeaderLength += 160; | |
| 289: r2 = *(u8 *)(r10 - 60) | |
| 290: if r2 == r9 goto 1 | |
| 291: r1 += 160 | |
| LBB0_21: | |
| ; if (hd.tcp.ebpf_valid) ebpf_outHeaderLength += 160; | |
| 292: r2 = *(u8 *)(r10 - 98) | |
| 293: if r2 == r9 goto 1 | |
| 294: r1 += 160 | |
| LBB0_23: | |
| ; if (hd.udp.ebpf_valid) ebpf_outHeaderLength += 64; | |
| 295: r2 = *(u8 *)(r10 - 112) | |
| 296: if r2 == r9 goto 1 | |
| 297: r1 += 64 | |
| LBB0_25: | |
| ; if (hd.icmp.ebpf_valid) ebpf_outHeaderLength += 32; | |
| 298: r2 = *(u8 *)(r10 - 122) | |
| 299: if r2 == r9 goto 1 | |
| 300: r1 += 32 | |
| LBB0_27: | |
| 301: r2 = 4294967288ll | |
| 303: r1 &= r2 | |
| ; bpf_xdp_adjust_head(skb, BYTES(ebpf_packetOffsetInBits) - BYTES(ebpf_outHeaderLength)); | |
| 304: r1 >>= 3 | |
| 305: r8 -= r1 | |
| 306: r1 = r6 | |
| 307: r2 = r8 | |
| 308: call 44 | |
| ; ebpf_packetEnd = ((void*)(long)skb->data_end); | |
| 309: r2 = *(u32 *)(r6 + 4) | |
| ; ebpf_packetStart = ((void*)(long)skb->data); | |
| 310: r1 = *(u32 *)(r6 + 0) | |
| ; if (hd.ethernet.ebpf_valid) { | |
| 311: r3 = *(u8 *)(r10 - 22) | |
| 312: if r3 == 0 goto 39 | |
| 313: r7 = 0 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) { | |
| 314: r3 = r1 | |
| 315: r3 += 14 | |
| 316: if r3 > r2 goto 530 | |
| ; ebpf_byte = ((char*)(&hd.ethernet.destination))[0]; | |
| 317: r3 = *(u8 *)(r10 - 4) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 318: *(u8 *)(r1 + 0) = r3 | |
| ; ebpf_byte = ((char*)(&hd.ethernet.destination))[1]; | |
| 319: r3 = *(u8 *)(r10 - 5) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 320: *(u8 *)(r1 + 1) = r3 | |
| ; ebpf_byte = ((char*)(&hd.ethernet.destination))[2]; | |
| 321: r3 = *(u8 *)(r10 - 6) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 322: *(u8 *)(r1 + 2) = r3 | |
| ; ebpf_byte = ((char*)(&hd.ethernet.destination))[3]; | |
| 323: r3 = *(u8 *)(r10 - 7) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 324: *(u8 *)(r1 + 3) = r3 | |
| ; ebpf_byte = ((char*)(&hd.ethernet.destination))[4]; | |
| 325: r3 = *(u8 *)(r10 - 8) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0); | |
| 326: *(u8 *)(r1 + 4) = r3 | |
| ; ebpf_byte = ((char*)(&hd.ethernet.destination))[5]; | |
| 327: r3 = *(u8 *)(r10 - 9) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0); | |
| 328: *(u8 *)(r1 + 5) = r3 | |
| ; ebpf_byte = ((char*)(&hd.ethernet.source))[0]; | |
| 329: r3 = *(u8 *)(r10 - 10) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 330: *(u8 *)(r1 + 6) = r3 | |
| ; ebpf_byte = ((char*)(&hd.ethernet.source))[1]; | |
| 331: r3 = *(u8 *)(r10 - 11) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 332: *(u8 *)(r1 + 7) = r3 | |
| ; ebpf_byte = ((char*)(&hd.ethernet.source))[2]; | |
| 333: r3 = *(u8 *)(r10 - 12) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 334: *(u8 *)(r1 + 8) = r3 | |
| ; ebpf_byte = ((char*)(&hd.ethernet.source))[3]; | |
| 335: r3 = *(u8 *)(r10 - 13) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 336: *(u8 *)(r1 + 9) = r3 | |
| ; ebpf_byte = ((char*)(&hd.ethernet.source))[4]; | |
| 337: r3 = *(u8 *)(r10 - 14) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0); | |
| 338: *(u8 *)(r1 + 10) = r3 | |
| ; ebpf_byte = ((char*)(&hd.ethernet.source))[5]; | |
| 339: r3 = *(u8 *)(r10 - 15) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0); | |
| 340: *(u8 *)(r1 + 11) = r3 | |
| ; hd.ethernet.protocol = htons(hd.ethernet.protocol); | |
| 341: r3 = *(u16 *)(r10 - 20) | |
| 342: r3 <<= 8 | |
| 343: r4 = *(u16 *)(r10 - 20) | |
| 344: r4 >>= 8 | |
| 345: r5 = r4 | |
| 346: r5 |= r3 | |
| 347: *(u16 *)(r10 - 20) = r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 348: *(u8 *)(r1 + 12) = r4 | |
| ; ebpf_byte = ((char*)(&hd.ethernet.protocol))[1]; | |
| 349: r3 = *(u8 *)(r10 - 19) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 350: *(u8 *)(r1 + 13) = r3 | |
| 351: r9 = 112 | |
| LBB0_30: | |
| ; if (hd.ipv4.ebpf_valid) { | |
| 352: r3 = *(u8 *)(r10 - 60) | |
| 353: if r3 == 0 goto 192 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| 354: r4 = r9 | |
| 355: r4 += 160 | |
| 356: r3 = 4294967288ll | |
| 358: r4 &= r3 | |
| 359: r4 >>= 3 | |
| 360: r5 = r1 | |
| 361: r5 += r4 | |
| 362: r7 = 0 | |
| 363: if r5 > r2 goto 483 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4); | |
| 364: r4 = r9 | |
| 365: r4 &= r3 | |
| 366: r4 >>= 3 | |
| 367: r5 = r1 | |
| 368: r5 += r4 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.version))[0]; | |
| 369: r4 = *(u8 *)(r10 - 24) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4); | |
| 370: r4 <<= 4 | |
| 371: *(u8 *)(r5 + 0) = r4 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.ihl))[0]; | |
| 372: r0 = *(u8 *)(r10 - 25) | |
| ; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4); | |
| 373: r0 &= 15 | |
| 374: r0 |= r4 | |
| 375: *(u8 *)(r5 + 0) = r0 | |
| ; ebpf_packetOffsetInBits += 4; | |
| 376: r9 |= 4 | |
| ; ebpf_packetOffsetInBits += 4; | |
| 377: r4 = r9 | |
| 378: r4 += 4 | |
| 379: r4 &= r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 380: r4 >>= 3 | |
| 381: r5 = r1 | |
| 382: r5 += r4 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.diffserv))[0]; | |
| 383: r4 = *(u8 *)(r10 - 26) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 384: *(u8 *)(r5 + 0) = r4 | |
| ; hd.ipv4.totalLen = htons(hd.ipv4.totalLen); | |
| 385: r4 = *(u16 *)(r10 - 32) | |
| 386: r4 <<= 8 | |
| 387: r5 = *(u16 *)(r10 - 32) | |
| 388: r5 >>= 8 | |
| 389: r0 = r5 | |
| 390: r0 |= r4 | |
| 391: *(u16 *)(r10 - 32) = r0 | |
| ; ebpf_packetOffsetInBits += 8; | |
| 392: r4 = r9 | |
| 393: r4 += 12 | |
| 394: r4 &= r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 395: r4 >>= 3 | |
| 396: r0 = r1 | |
| 397: r0 += r4 | |
| 398: *(u8 *)(r0 + 0) = r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 399: r4 |= 1 | |
| 400: r5 = r1 | |
| 401: r5 += r4 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.totalLen))[1]; | |
| 402: r4 = *(u8 *)(r10 - 31) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 403: *(u8 *)(r5 + 0) = r4 | |
| ; hd.ipv4.identification = htons(hd.ipv4.identification); | |
| 404: r4 = *(u16 *)(r10 - 34) | |
| 405: r4 <<= 8 | |
| 406: r5 = *(u16 *)(r10 - 34) | |
| 407: r5 >>= 8 | |
| 408: r0 = r5 | |
| 409: r0 |= r4 | |
| 410: *(u16 *)(r10 - 34) = r0 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 411: r4 = r9 | |
| 412: r4 += 28 | |
| 413: r4 &= r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 414: r4 >>= 3 | |
| 415: r0 = r1 | |
| 416: r0 += r4 | |
| 417: *(u8 *)(r0 + 0) = r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 418: r4 |= 1 | |
| 419: r5 = r1 | |
| 420: r5 += r4 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.identification))[1]; | |
| 421: r4 = *(u8 *)(r10 - 33) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 422: *(u8 *)(r5 + 0) = r4 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 423: r4 = r9 | |
| 424: r4 += 44 | |
| 425: r4 &= r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 5); | |
| 426: r4 >>= 3 | |
| 427: r5 = r1 | |
| 428: r5 += r4 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.flags))[0]; | |
| 429: r4 = *(u8 *)(r10 - 36) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 5); | |
| 430: r4 <<= 5 | |
| 431: *(u8 *)(r5 + 0) = r4 | |
| ; ebpf_packetOffsetInBits += 3; | |
| 432: r4 = r9 | |
| 433: r4 += 47 | |
| 434: r4 &= r3 | |
| ; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 3, (ebpf_byte) << 3); | |
| 435: r4 >>= 3 | |
| 436: r5 = r1 | |
| 437: r5 += r4 | |
| 438: r0 = *(u8 *)(r5 + 0) | |
| 439: r0 &= 248 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.fragOffset))[0]; | |
| 440: r6 = *(u8 *)(r10 - 40) | |
| ; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 3, (ebpf_byte) << 3); | |
| 441: r6 >>= 2 | |
| 442: r6 &= 7 | |
| 443: r6 |= r0 | |
| 444: *(u8 *)(r5 + 0) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 445: r4 |= 1 | |
| 446: r5 = r1 | |
| 447: r5 += r4 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.fragOffset))[1]; | |
| 448: r4 = *(u8 *)(r10 - 39) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 449: *(u8 *)(r5 + 0) = r4 | |
| ; ebpf_packetOffsetInBits += 13; | |
| 450: r4 = r9 | |
| 451: r4 += 60 | |
| 452: r4 &= r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 453: r4 >>= 3 | |
| 454: r5 = r1 | |
| 455: r5 += r4 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.ttl))[0]; | |
| 456: r4 = *(u8 *)(r10 - 44) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 457: *(u8 *)(r5 + 0) = r4 | |
| ; ebpf_packetOffsetInBits += 8; | |
| 458: r4 = r9 | |
| 459: r4 += 68 | |
| 460: r4 &= r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 461: r4 >>= 3 | |
| 462: r5 = r1 | |
| 463: r5 += r4 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.protocol))[0]; | |
| 464: r4 = *(u8 *)(r10 - 45) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 465: *(u8 *)(r5 + 0) = r4 | |
| ; hd.ipv4.hdrChecksum = htons(hd.ipv4.hdrChecksum); | |
| 466: r4 = *(u16 *)(r10 - 48) | |
| 467: r4 <<= 8 | |
| 468: r5 = *(u16 *)(r10 - 48) | |
| 469: r5 >>= 8 | |
| 470: r0 = r5 | |
| 471: r0 |= r4 | |
| 472: *(u16 *)(r10 - 48) = r0 | |
| ; ebpf_packetOffsetInBits += 8; | |
| 473: r4 = r9 | |
| 474: r4 += 76 | |
| 475: r4 &= r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 476: r4 >>= 3 | |
| 477: r0 = r1 | |
| 478: r0 += r4 | |
| 479: *(u8 *)(r0 + 0) = r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 480: r4 |= 1 | |
| 481: r5 = r1 | |
| 482: r5 += r4 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.hdrChecksum))[1]; | |
| 483: r4 = *(u8 *)(r10 - 47) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 484: *(u8 *)(r5 + 0) = r4 | |
| ; hd.ipv4.srcAddr = htonl(hd.ipv4.srcAddr); | |
| 485: r4 = *(u32 *)(r10 - 52) | |
| 486: r4 <<= 24 | |
| 487: r5 = *(u32 *)(r10 - 52) | |
| 488: r5 <<= 8 | |
| 489: r5 &= 16711680 | |
| 490: r5 |= r4 | |
| 491: r4 = *(u32 *)(r10 - 52) | |
| 492: r4 >>= 8 | |
| 493: r4 &= 65280 | |
| 494: r5 |= r4 | |
| 495: r4 = *(u32 *)(r10 - 52) | |
| 496: r4 >>= 24 | |
| 497: r5 |= r4 | |
| 498: *(u32 *)(r10 - 52) = r5 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 499: r5 = r9 | |
| 500: r5 += 92 | |
| 501: r5 &= r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 502: r5 >>= 3 | |
| 503: r0 = r1 | |
| 504: r0 += r5 | |
| 505: *(u8 *)(r0 + 0) = r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 506: r5 |= 1 | |
| 507: r4 = r1 | |
| 508: r4 += r5 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.srcAddr))[1]; | |
| 509: r5 = *(u8 *)(r10 - 51) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 510: *(u8 *)(r4 + 0) = r5 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.srcAddr))[2]; | |
| 511: r4 = *(u8 *)(r10 - 50) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 512: *(u8 *)(r0 + 2) = r4 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.srcAddr))[3]; | |
| 513: r4 = *(u8 *)(r10 - 49) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 514: *(u8 *)(r0 + 3) = r4 | |
| ; ebpf_packetOffsetInBits += 32; | |
| 515: r5 = r9 | |
| 516: r5 += 124 | |
| 517: r5 &= r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 518: r5 >>= 3 | |
| 519: r3 = r1 | |
| 520: r3 += r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 521: r5 |= 1 | |
| 522: r4 = r1 | |
| 523: r4 += r5 | |
| ; hd.ipv4.dstAddr = htonl(hd.ipv4.dstAddr); | |
| 524: r5 = *(u32 *)(r10 - 56) | |
| 525: r5 <<= 24 | |
| 526: r0 = *(u32 *)(r10 - 56) | |
| 527: r0 <<= 8 | |
| 528: r0 &= 16711680 | |
| 529: r0 |= r5 | |
| 530: r5 = *(u32 *)(r10 - 56) | |
| 531: r5 >>= 8 | |
| 532: r5 &= 65280 | |
| 533: r0 |= r5 | |
| 534: r5 = *(u32 *)(r10 - 56) | |
| 535: r5 >>= 24 | |
| 536: r0 |= r5 | |
| 537: *(u32 *)(r10 - 56) = r0 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 538: *(u8 *)(r3 + 0) = r5 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.dstAddr))[1]; | |
| 539: r5 = *(u8 *)(r10 - 55) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 540: *(u8 *)(r4 + 0) = r5 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.dstAddr))[2]; | |
| 541: r4 = *(u8 *)(r10 - 54) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 542: *(u8 *)(r3 + 2) = r4 | |
| ; ebpf_byte = ((char*)(&hd.ipv4.dstAddr))[3]; | |
| 543: r4 = *(u8 *)(r10 - 53) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 544: *(u8 *)(r3 + 3) = r4 | |
| ; ebpf_packetOffsetInBits += 32; | |
| 545: r9 += 156 | |
| LBB0_33: | |
| ; if (hd.tcp.ebpf_valid) { | |
| 546: r3 = *(u8 *)(r10 - 98) | |
| 547: if r3 == 0 goto 173 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| 548: r3 = r9 | |
| 549: r3 += 160 | |
| 550: r4 = 4294967288ll | |
| 552: r5 = r3 | |
| 553: r5 &= r4 | |
| 554: r5 >>= 3 | |
| 555: r0 = r1 | |
| 556: r0 += r5 | |
| 557: r7 = 0 | |
| 558: if r0 > r2 goto 288 | |
| ; hd.tcp.srcPort = htons(hd.tcp.srcPort); | |
| 559: r5 = *(u16 *)(r10 - 68) | |
| 560: r5 <<= 8 | |
| 561: r0 = *(u16 *)(r10 - 68) | |
| 562: r0 >>= 8 | |
| 563: r6 = r0 | |
| 564: r6 |= r5 | |
| 565: *(u16 *)(r10 - 68) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 566: r5 = r9 | |
| 567: r5 &= r4 | |
| 568: r5 >>= 3 | |
| 569: r6 = r1 | |
| 570: r6 += r5 | |
| 571: *(u8 *)(r6 + 0) = r0 | |
| ; ebpf_byte = ((char*)(&hd.tcp.srcPort))[1]; | |
| 572: r5 = *(u8 *)(r10 - 67) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 573: *(u8 *)(r6 + 1) = r5 | |
| ; hd.tcp.dstPort = htons(hd.tcp.dstPort); | |
| 574: r5 = *(u16 *)(r10 - 70) | |
| 575: r5 <<= 8 | |
| 576: r0 = *(u16 *)(r10 - 70) | |
| 577: r0 >>= 8 | |
| 578: r6 = r0 | |
| 579: r6 |= r5 | |
| 580: *(u16 *)(r10 - 70) = r6 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 581: r5 = r9 | |
| 582: r5 += 16 | |
| 583: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 584: r5 >>= 3 | |
| 585: r6 = r1 | |
| 586: r6 += r5 | |
| 587: *(u8 *)(r6 + 0) = r0 | |
| ; ebpf_byte = ((char*)(&hd.tcp.dstPort))[1]; | |
| 588: r5 = *(u8 *)(r10 - 69) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 589: *(u8 *)(r6 + 1) = r5 | |
| ; hd.tcp.seqNo = htonl(hd.tcp.seqNo); | |
| 590: r5 = *(u32 *)(r10 - 76) | |
| 591: r5 <<= 24 | |
| 592: r0 = *(u32 *)(r10 - 76) | |
| 593: r0 <<= 8 | |
| 594: r0 &= 16711680 | |
| 595: r0 |= r5 | |
| 596: r5 = *(u32 *)(r10 - 76) | |
| 597: r5 >>= 8 | |
| 598: r5 &= 65280 | |
| 599: r0 |= r5 | |
| 600: r5 = *(u32 *)(r10 - 76) | |
| 601: r5 >>= 24 | |
| 602: r0 |= r5 | |
| 603: *(u32 *)(r10 - 76) = r0 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 604: r0 = r9 | |
| 605: r0 += 32 | |
| 606: r0 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 607: r0 >>= 3 | |
| 608: r6 = r1 | |
| 609: r6 += r0 | |
| 610: *(u8 *)(r6 + 0) = r5 | |
| ; ebpf_byte = ((char*)(&hd.tcp.seqNo))[1]; | |
| 611: r5 = *(u8 *)(r10 - 75) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 612: *(u8 *)(r6 + 1) = r5 | |
| ; ebpf_byte = ((char*)(&hd.tcp.seqNo))[2]; | |
| 613: r5 = *(u8 *)(r10 - 74) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 614: *(u8 *)(r6 + 2) = r5 | |
| ; ebpf_byte = ((char*)(&hd.tcp.seqNo))[3]; | |
| 615: r5 = *(u8 *)(r10 - 73) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 616: *(u8 *)(r6 + 3) = r5 | |
| ; hd.tcp.ackNo = htonl(hd.tcp.ackNo); | |
| 617: r5 = *(u32 *)(r10 - 80) | |
| 618: r5 <<= 24 | |
| 619: r0 = *(u32 *)(r10 - 80) | |
| 620: r0 <<= 8 | |
| 621: r0 &= 16711680 | |
| 622: r0 |= r5 | |
| 623: r5 = *(u32 *)(r10 - 80) | |
| 624: r5 >>= 8 | |
| 625: r5 &= 65280 | |
| 626: r0 |= r5 | |
| 627: r5 = *(u32 *)(r10 - 80) | |
| 628: r5 >>= 24 | |
| 629: r0 |= r5 | |
| 630: *(u32 *)(r10 - 80) = r0 | |
| ; ebpf_packetOffsetInBits += 32; | |
| 631: r0 = r9 | |
| 632: r0 += 64 | |
| 633: r0 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 634: r0 >>= 3 | |
| 635: r6 = r1 | |
| 636: r6 += r0 | |
| 637: *(u8 *)(r6 + 0) = r5 | |
| ; ebpf_byte = ((char*)(&hd.tcp.ackNo))[1]; | |
| 638: r5 = *(u8 *)(r10 - 79) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 639: *(u8 *)(r6 + 1) = r5 | |
| ; ebpf_byte = ((char*)(&hd.tcp.ackNo))[2]; | |
| 640: r5 = *(u8 *)(r10 - 78) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 641: *(u8 *)(r6 + 2) = r5 | |
| ; ebpf_byte = ((char*)(&hd.tcp.ackNo))[3]; | |
| 642: r5 = *(u8 *)(r10 - 77) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 643: *(u8 *)(r6 + 3) = r5 | |
| ; ebpf_packetOffsetInBits += 32; | |
| 644: r5 = r9 | |
| 645: r5 += 96 | |
| 646: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4); | |
| 647: r5 >>= 3 | |
| 648: r0 = r1 | |
| 649: r0 += r5 | |
| ; ebpf_byte = ((char*)(&hd.tcp.dataOffset))[0]; | |
| 650: r5 = *(u8 *)(r10 - 84) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4); | |
| 651: r5 <<= 4 | |
| 652: *(u8 *)(r0 + 0) = r5 | |
| ; ebpf_packetOffsetInBits += 4; | |
| 653: r5 = r9 | |
| 654: r5 += 100 | |
| 655: r5 &= r4 | |
| ; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4); | |
| 656: r5 >>= 3 | |
| 657: r0 = r1 | |
| 658: r0 += r5 | |
| 659: r5 = *(u8 *)(r0 + 0) | |
| 660: r5 &= 240 | |
| ; ebpf_byte = ((char*)(&hd.tcp.res))[0]; | |
| 661: r6 = *(u8 *)(r10 - 85) | |
| ; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4); | |
| 662: r6 &= 15 | |
| 663: r5 |= r6 | |
| 664: *(u8 *)(r0 + 0) = r5 | |
| ; ebpf_packetOffsetInBits += 4; | |
| 665: r5 = r9 | |
| 666: r5 += 104 | |
| 667: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 668: r5 >>= 3 | |
| 669: r0 = r1 | |
| 670: r0 += r5 | |
| ; ebpf_byte = ((char*)(&hd.tcp.flags))[0]; | |
| 671: r5 = *(u8 *)(r10 - 86) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 672: *(u8 *)(r0 + 0) = r5 | |
| ; hd.tcp.window = htons(hd.tcp.window); | |
| 673: r5 = *(u16 *)(r10 - 92) | |
| 674: r5 <<= 8 | |
| 675: r0 = *(u16 *)(r10 - 92) | |
| 676: r0 >>= 8 | |
| 677: r6 = r0 | |
| 678: r6 |= r5 | |
| 679: *(u16 *)(r10 - 92) = r6 | |
| ; ebpf_packetOffsetInBits += 8; | |
| 680: r5 = r9 | |
| 681: r5 += 112 | |
| 682: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 683: r5 >>= 3 | |
| 684: r6 = r1 | |
| 685: r6 += r5 | |
| 686: *(u8 *)(r6 + 0) = r0 | |
| ; ebpf_byte = ((char*)(&hd.tcp.window))[1]; | |
| 687: r5 = *(u8 *)(r10 - 91) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 688: *(u8 *)(r6 + 1) = r5 | |
| ; hd.tcp.checksum = htons(hd.tcp.checksum); | |
| 689: r5 = *(u16 *)(r10 - 94) | |
| 690: r5 <<= 8 | |
| 691: r0 = *(u16 *)(r10 - 94) | |
| 692: r0 >>= 8 | |
| 693: r6 = r0 | |
| 694: r6 |= r5 | |
| 695: *(u16 *)(r10 - 94) = r6 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 696: r5 = r9 | |
| 697: r5 += 128 | |
| 698: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 699: r5 >>= 3 | |
| 700: r6 = r1 | |
| 701: r6 += r5 | |
| 702: *(u8 *)(r6 + 0) = r0 | |
| ; ebpf_byte = ((char*)(&hd.tcp.checksum))[1]; | |
| 703: r5 = *(u8 *)(r10 - 93) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 704: *(u8 *)(r6 + 1) = r5 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 705: r9 += 144 | |
| 706: r9 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 707: r9 >>= 3 | |
| 708: r4 = r1 | |
| 709: r4 += r9 | |
| ; hd.tcp.urgentPtr = htons(hd.tcp.urgentPtr); | |
| 710: r5 = *(u16 *)(r10 - 96) | |
| 711: r5 <<= 8 | |
| 712: r0 = *(u16 *)(r10 - 96) | |
| 713: r0 >>= 8 | |
| 714: r6 = r0 | |
| 715: r6 |= r5 | |
| 716: *(u16 *)(r10 - 96) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 717: *(u8 *)(r4 + 0) = r0 | |
| ; ebpf_byte = ((char*)(&hd.tcp.urgentPtr))[1]; | |
| 718: r5 = *(u8 *)(r10 - 95) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 719: *(u8 *)(r4 + 1) = r5 | |
| 720: r9 = r3 | |
| LBB0_36: | |
| ; if (hd.udp.ebpf_valid) { | |
| 721: r3 = *(u8 *)(r10 - 112) | |
| 722: if r3 == 0 goto 74 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) { | |
| 723: r3 = r9 | |
| 724: r3 += 64 | |
| 725: r4 = 4294967288ll | |
| 727: r5 = r3 | |
| 728: r5 &= r4 | |
| 729: r5 >>= 3 | |
| 730: r0 = r1 | |
| 731: r0 += r5 | |
| 732: r7 = 0 | |
| 733: if r0 > r2 goto 113 | |
| ; hd.udp.srcPort = htons(hd.udp.srcPort); | |
| 734: r5 = *(u16 *)(r10 - 104) | |
| 735: r5 <<= 8 | |
| 736: r0 = *(u16 *)(r10 - 104) | |
| 737: r0 >>= 8 | |
| 738: r6 = r0 | |
| 739: r6 |= r5 | |
| 740: *(u16 *)(r10 - 104) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 741: r5 = r9 | |
| 742: r5 &= r4 | |
| 743: r5 >>= 3 | |
| 744: r6 = r1 | |
| 745: r6 += r5 | |
| 746: *(u8 *)(r6 + 0) = r0 | |
| ; ebpf_byte = ((char*)(&hd.udp.srcPort))[1]; | |
| 747: r5 = *(u8 *)(r10 - 103) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 748: *(u8 *)(r6 + 1) = r5 | |
| ; hd.udp.dstPort = htons(hd.udp.dstPort); | |
| 749: r5 = *(u16 *)(r10 - 106) | |
| 750: r5 <<= 8 | |
| 751: r0 = *(u16 *)(r10 - 106) | |
| 752: r0 >>= 8 | |
| 753: r6 = r0 | |
| 754: r6 |= r5 | |
| 755: *(u16 *)(r10 - 106) = r6 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 756: r5 = r9 | |
| 757: r5 += 16 | |
| 758: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 759: r5 >>= 3 | |
| 760: r6 = r1 | |
| 761: r6 += r5 | |
| 762: *(u8 *)(r6 + 0) = r0 | |
| ; ebpf_byte = ((char*)(&hd.udp.dstPort))[1]; | |
| 763: r5 = *(u8 *)(r10 - 105) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 764: *(u8 *)(r6 + 1) = r5 | |
| ; hd.udp.length_ = htons(hd.udp.length_); | |
| 765: r5 = *(u16 *)(r10 - 108) | |
| 766: r5 <<= 8 | |
| 767: r0 = *(u16 *)(r10 - 108) | |
| 768: r0 >>= 8 | |
| 769: r6 = r0 | |
| 770: r6 |= r5 | |
| 771: *(u16 *)(r10 - 108) = r6 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 772: r5 = r9 | |
| 773: r5 += 32 | |
| 774: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 775: r5 >>= 3 | |
| 776: r6 = r1 | |
| 777: r6 += r5 | |
| 778: *(u8 *)(r6 + 0) = r0 | |
| ; ebpf_byte = ((char*)(&hd.udp.length_))[1]; | |
| 779: r5 = *(u8 *)(r10 - 107) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 780: *(u8 *)(r6 + 1) = r5 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 781: r9 += 48 | |
| 782: r9 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 783: r9 >>= 3 | |
| 784: r4 = r1 | |
| 785: r4 += r9 | |
| ; hd.udp.checksum = htons(hd.udp.checksum); | |
| 786: r5 = *(u16 *)(r10 - 110) | |
| 787: r5 <<= 8 | |
| 788: r0 = *(u16 *)(r10 - 110) | |
| 789: r0 >>= 8 | |
| 790: r6 = r0 | |
| 791: r6 |= r5 | |
| 792: *(u16 *)(r10 - 110) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 793: *(u8 *)(r4 + 0) = r0 | |
| ; ebpf_byte = ((char*)(&hd.udp.checksum))[1]; | |
| 794: r5 = *(u8 *)(r10 - 109) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 795: *(u8 *)(r4 + 1) = r5 | |
| 796: r9 = r3 | |
| LBB0_39: | |
| ; if (hd.icmp.ebpf_valid) { | |
| 797: r3 = *(u8 *)(r10 - 122) | |
| 798: if r3 == 0 goto 39 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) { | |
| 799: r4 = r9 | |
| 800: r4 += 32 | |
| 801: r3 = 4294967288ll | |
| 803: r4 &= r3 | |
| 804: r4 >>= 3 | |
| 805: r5 = r1 | |
| 806: r5 += r4 | |
| 807: r7 = 0 | |
| 808: if r5 > r2 goto 38 | |
| ; hd.icmp.typeCode = htons(hd.icmp.typeCode); | |
| 809: r2 = *(u16 *)(r10 - 116) | |
| 810: r2 <<= 8 | |
| 811: r4 = *(u16 *)(r10 - 116) | |
| 812: r4 >>= 8 | |
| 813: r5 = r4 | |
| 814: r5 |= r2 | |
| 815: *(u16 *)(r10 - 116) = r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 816: r2 = r9 | |
| 817: r2 &= r3 | |
| 818: r2 >>= 3 | |
| 819: r5 = r1 | |
| 820: r5 += r2 | |
| 821: *(u8 *)(r5 + 0) = r4 | |
| ; ebpf_byte = ((char*)(&hd.icmp.typeCode))[1]; | |
| 822: r2 = *(u8 *)(r10 - 115) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 823: *(u8 *)(r5 + 1) = r2 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 824: r9 += 16 | |
| 825: r9 &= r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 826: r9 >>= 3 | |
| 827: r1 += r9 | |
| ; hd.icmp.hdrChecksum = htons(hd.icmp.hdrChecksum); | |
| 828: r2 = *(u16 *)(r10 - 120) | |
| 829: r2 <<= 8 | |
| 830: r3 = *(u16 *)(r10 - 120) | |
| 831: r3 >>= 8 | |
| 832: r4 = r3 | |
| 833: r4 |= r2 | |
| 834: *(u16 *)(r10 - 120) = r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 835: *(u8 *)(r1 + 0) = r3 | |
| ; ebpf_byte = ((char*)(&hd.icmp.hdrChecksum))[1]; | |
| 836: r2 = *(u8 *)(r10 - 119) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 837: *(u8 *)(r1 + 1) = r2 | |
| LBB0_42: | |
| ; xout.output_port = 0; | |
| 838: r3 = r10 | |
| 839: r3 += -132 | |
| 840: r2 = r10 | |
| 841: r2 += -128 | |
| ; bpf_map_update_elem(&ebpf_outTable, &ebpf_zero, &xout.output_port, BPF_ANY); | |
| 842: r1 = 0ll | |
| 844: r4 = 0 | |
| 845: call 2 | |
| ; return xout.output_action; | |
| 846: r7 = *(u32 *)(r10 - 136) | |
| LBB0_43: | |
| ; } | |
| 847: r0 = r7 | |
| 848: exit |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // MAX stack 384 | |
| // 782: r3 = *(u64 *)(r10 - 384) | |
| diff --git a/tmp/xdp9.c b/tests/xdp9.c | |
| index 0845fd5..9343145 100644 | |
| --- a/tmp/xdp9.c | |
| +++ b/tests/xdp9.c | |
| @@ -133,6 +133,7 @@ int ebpf_filter(struct xdp_md* skb){ | |
| .ebpf_valid = 0 | |
| }, | |
| }; | |
| + struct Headers hd__; | |
| unsigned ebpf_packetOffsetInBits = 0; | |
| enum ebpf_errorCodes ebpf_errorCode = NoError; | |
| void* ebpf_packetStart = ((void*)(long)skb->data); | |
| @@ -362,14 +363,15 @@ int ebpf_filter(struct xdp_md* skb){ | |
| xout.output_action = tmp_2; | |
| } | |
| } | |
| + hd__ = hd; | |
| /* deparser */ | |
| { | |
| { | |
| - if (hd.ethernet.ebpf_valid) ebpf_outHeaderLength += 112; | |
| - if (hd.ipv4.ebpf_valid) ebpf_outHeaderLength += 160; | |
| - if (hd.tcp.ebpf_valid) ebpf_outHeaderLength += 160; | |
| - if (hd.udp.ebpf_valid) ebpf_outHeaderLength += 64; | |
| - if (hd.icmp.ebpf_valid) ebpf_outHeaderLength += 32; | |
| + if (hd__.ethernet.ebpf_valid) ebpf_outHeaderLength += 112; | |
| + if (hd__.ipv4.ebpf_valid) ebpf_outHeaderLength += 160; | |
| + if (hd__.tcp.ebpf_valid) ebpf_outHeaderLength += 160; | |
| + if (hd__.udp.ebpf_valid) ebpf_outHeaderLength += 64; | |
| + if (hd__.icmp.ebpf_valid) ebpf_outHeaderLength += 32; | |
| } | |
| bpf_xdp_adjust_head(skb, BYTES(ebpf_packetOffsetInBits) - BYTES(ebpf_outHeaderLength)); | |
| ebpf_packetStart = ((void*)(long)skb->data); | |
| @@ -377,236 +379,237 @@ int ebpf_filter(struct xdp_md* skb){ | |
| ebpf_packetOffsetInBits = 0; | |
| u8 hit_0; | |
| { | |
| - /* packet.emit(hd.ethernet)*/ | |
| - if (hd.ethernet.ebpf_valid) { | |
| + /* packet.emit(hd__.ethernet)*/ | |
| + if (hd__.ethernet.ebpf_valid) { | |
| if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) { | |
| ebpf_errorCode = PacketTooShort; | |
| return XDP_ABORTED; | |
| } | |
| - ebpf_byte = ((char*)(&hd.ethernet.destination))[0]; | |
| + ebpf_byte = ((char*)(&hd__.ethernet.destination))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| - ebpf_byte = ((char*)(&hd.ethernet.destination))[1]; | |
| + ebpf_byte = ((char*)(&hd__.ethernet.destination))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| - ebpf_byte = ((char*)(&hd.ethernet.destination))[2]; | |
| + ebpf_byte = ((char*)(&hd__.ethernet.destination))[2]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| - ebpf_byte = ((char*)(&hd.ethernet.destination))[3]; | |
| + ebpf_byte = ((char*)(&hd__.ethernet.destination))[3]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| - ebpf_byte = ((char*)(&hd.ethernet.destination))[4]; | |
| + ebpf_byte = ((char*)(&hd__.ethernet.destination))[4]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0); | |
| - ebpf_byte = ((char*)(&hd.ethernet.destination))[5]; | |
| + ebpf_byte = ((char*)(&hd__.ethernet.destination))[5]; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| xdp9.o: file format ELF64-BPF | |
| Disassembly of section prog: | |
| ebpf_filter: | |
| ; int ebpf_filter(struct xdp_md* skb){ | |
| 0: r6 = r1 | |
| ; void* ebpf_packetEnd = ((void*)(long)skb->data_end); | |
| 1: r2 = *(u32 *)(r6 + 4) | |
| ; void* ebpf_packetStart = ((void*)(long)skb->data); | |
| 2: r1 = *(u32 *)(r6 + 0) | |
| 3: r8 = 0 | |
| ; u32 ebpf_zero = 0; | |
| 4: *(u32 *)(r10 - 4) = r8 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) { | |
| 5: r3 = r1 | |
| 6: r3 += 14 | |
| 7: if r3 > r2 goto 790 | |
| ; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 8: r7 = *(u16 *)(r1 + 12) | |
| 9: r3 = 14 | |
| 10: *(u64 *)(r10 - 80) = r3 | |
| 11: r3 = 0 | |
| ; hd.ethernet.source[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0)); | |
| 12: *(u64 *)(r10 - 120) = r3 | |
| 13: r3 = *(u8 *)(r1 + 11) | |
| ; hd.ethernet.source[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0)); | |
| 14: *(u64 *)(r10 - 272) = r3 | |
| 15: r3 = *(u8 *)(r1 + 10) | |
| ; hd.ethernet.source[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0)); | |
| 16: *(u64 *)(r10 - 280) = r3 | |
| 17: r3 = *(u8 *)(r1 + 9) | |
| ; hd.ethernet.source[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0)); | |
| 18: *(u64 *)(r10 - 288) = r3 | |
| 19: r3 = *(u8 *)(r1 + 8) | |
| ; hd.ethernet.source[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0)); | |
| 20: *(u64 *)(r10 - 296) = r3 | |
| 21: r3 = *(u8 *)(r1 + 7) | |
| ; hd.ethernet.source[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0)); | |
| 22: *(u64 *)(r10 - 304) = r3 | |
| 23: r3 = *(u8 *)(r1 + 6) | |
| ; hd.ethernet.destination[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0)); | |
| 24: *(u64 *)(r10 - 312) = r3 | |
| 25: r3 = *(u8 *)(r1 + 5) | |
| ; hd.ethernet.destination[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0)); | |
| 26: *(u64 *)(r10 - 320) = r3 | |
| 27: r3 = *(u8 *)(r1 + 4) | |
| ; hd.ethernet.destination[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0)); | |
| 28: *(u64 *)(r10 - 328) = r3 | |
| 29: r3 = *(u8 *)(r1 + 3) | |
| ; hd.ethernet.destination[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0)); | |
| 30: *(u64 *)(r10 - 336) = r3 | |
| 31: r3 = *(u8 *)(r1 + 2) | |
| ; hd.ethernet.destination[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0)); | |
| 32: *(u64 *)(r10 - 344) = r3 | |
| 33: r3 = *(u8 *)(r1 + 1) | |
| ; hd.ethernet.destination[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0)); | |
| 34: *(u64 *)(r10 - 352) = r3 | |
| 35: r3 = *(u8 *)(r1 + 0) | |
| ; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 36: *(u64 *)(r10 - 360) = r3 | |
| 37: r3 = r7 | |
| 38: bswap16 r3 | |
| 39: r4 = 0 | |
| 40: *(u64 *)(r10 - 152) = r4 | |
| 41: r4 = 0 | |
| 42: *(u64 *)(r10 - 104) = r4 | |
| 43: r4 = 0 | |
| 44: *(u64 *)(r10 - 136) = r4 | |
| 45: r4 = 0 | |
| 46: *(u64 *)(r10 - 128) = r4 | |
| 47: r4 = 0 | |
| 48: *(u64 *)(r10 - 112) = r4 | |
| 49: r4 = 0 | |
| 50: *(u64 *)(r10 - 168) = r4 | |
| 51: r4 = 0 | |
| 52: *(u64 *)(r10 - 40) = r4 | |
| 53: r4 = 0 | |
| 54: *(u64 *)(r10 - 160) = r4 | |
| 55: r4 = 0 | |
| 56: *(u64 *)(r10 - 96) = r4 | |
| 57: r4 = 0 | |
| 58: *(u64 *)(r10 - 88) = r4 | |
| 59: r4 = 0 | |
| 60: *(u64 *)(r10 - 48) = r4 | |
| 61: r4 = 0 | |
| 62: *(u64 *)(r10 - 224) = r4 | |
| 63: r4 = 0 | |
| 64: *(u64 *)(r10 - 248) = r4 | |
| 65: r4 = 0 | |
| 66: *(u64 *)(r10 - 240) = r4 | |
| 67: r4 = 0 | |
| 68: *(u64 *)(r10 - 232) = r4 | |
| 69: r4 = 0 | |
| 70: *(u64 *)(r10 - 216) = r4 | |
| 71: r4 = 0 | |
| 72: *(u64 *)(r10 - 208) = r4 | |
| 73: r4 = 0 | |
| 74: *(u64 *)(r10 - 200) = r4 | |
| 75: r4 = 0 | |
| 76: *(u64 *)(r10 - 192) = r4 | |
| 77: r4 = 0 | |
| 78: *(u64 *)(r10 - 184) = r4 | |
| 79: r4 = 0 | |
| 80: *(u64 *)(r10 - 176) = r4 | |
| 81: r4 = 0 | |
| 82: *(u64 *)(r10 - 56) = r4 | |
| 83: r4 = 0 | |
| 84: *(u64 *)(r10 - 32) = r4 | |
| 85: r4 = 0 | |
| 86: *(u64 *)(r10 - 264) = r4 | |
| 87: r4 = 0 | |
| 88: *(u64 *)(r10 - 256) = r4 | |
| 89: r0 = 0 | |
| 90: r4 = 0 | |
| 91: *(u64 *)(r10 - 64) = r4 | |
| 92: r5 = 0 | |
| 93: r4 = 0 | |
| 94: r8 = 0 | |
| 95: *(u64 *)(r10 - 72) = r8 | |
| 96: r8 = 0 | |
| 97: r9 = 0 | |
| ; switch (hd.ethernet.protocol) { | |
| 98: *(u64 *)(r10 - 144) = r9 | |
| 99: if r3 != 2048 goto 231 | |
| 100: r8 = 0 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| 101: r3 = r1 | |
| 102: r3 += 34 | |
| 103: if r3 > r2 goto 694 | |
| ; hd.ipv4.ttl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 104: r3 = *(u8 *)(r1 + 22) | |
| ; hd.ipv4.diffserv = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 105: *(u64 *)(r10 - 168) = r3 | |
| 106: r3 = *(u8 *)(r1 + 15) | |
| ; hd.ipv4.dstAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 107: *(u64 *)(r10 - 104) = r3 | |
| 108: r3 = *(u32 *)(r1 + 30) | |
| 109: bswap32 r3 | |
| 110: *(u64 *)(r10 - 88) = r3 | |
| ; hd.ipv4.srcAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 111: r3 = *(u32 *)(r1 + 26) | |
| 112: bswap32 r3 | |
| 113: *(u64 *)(r10 - 96) = r3 | |
| ; hd.ipv4.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 114: r3 = *(u16 *)(r1 + 24) | |
| 115: bswap16 r3 | |
| 116: *(u64 *)(r10 - 160) = r3 | |
| ; hd.ipv4.fragOffset = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u16, 13)); | |
| 117: r8 = *(u16 *)(r1 + 20) | |
| 118: r3 = r8 | |
| 119: r3 &= 31 | |
| 120: *(u64 *)(r10 - 144) = r3 | |
| 121: r8 >>= 8 | |
| ; hd.ipv4.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 5) & EBPF_MASK(u8, 3)); | |
| 122: r3 = *(u8 *)(r1 + 20) | |
| 123: r3 >>= 5 | |
| 124: *(u64 *)(r10 - 112) = r3 | |
| ; hd.ipv4.identification = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 125: r3 = *(u16 *)(r1 + 18) | |
| 126: bswap16 r3 | |
| 127: *(u64 *)(r10 - 128) = r3 | |
| ; hd.ipv4.totalLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 128: r3 = *(u16 *)(r1 + 16) | |
| 129: bswap16 r3 | |
| 130: *(u64 *)(r10 - 136) = r3 | |
| ; hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
| 131: r3 = *(u8 *)(r1 + 14) | |
| ; hd.ipv4.ihl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4)); | |
| 132: r4 = r3 | |
| 133: r4 &= 15 | |
| 134: *(u64 *)(r10 - 152) = r4 | |
| ; hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
| 135: r3 >>= 4 | |
| 136: *(u64 *)(r10 - 120) = r3 | |
| ; hd.ipv4.protocol = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 137: r9 = *(u8 *)(r1 + 23) | |
| ; switch (hd.ipv4.protocol) { | |
| 138: if r9 == 17 goto 90 | |
| 139: if r9 == 6 goto 135 | |
| 140: r3 = 34 | |
| 141: *(u64 *)(r10 - 80) = r3 | |
| 142: r3 = 0 | |
| 143: *(u64 *)(r10 - 224) = r3 | |
| 144: r3 = 1 | |
| 145: *(u64 *)(r10 - 48) = r3 | |
| 146: r3 = 0 | |
| 147: *(u64 *)(r10 - 248) = r3 | |
| 148: r3 = 0 | |
| 149: *(u64 *)(r10 - 240) = r3 | |
| 150: r3 = 0 | |
| 151: *(u64 *)(r10 - 232) = r3 | |
| 152: r3 = 0 | |
| 153: *(u64 *)(r10 - 216) = r3 | |
| 154: r3 = 0 | |
| 155: *(u64 *)(r10 - 208) = r3 | |
| 156: r3 = 0 | |
| 157: *(u64 *)(r10 - 200) = r3 | |
| 158: r3 = 0 | |
| 159: *(u64 *)(r10 - 192) = r3 | |
| 160: r3 = 0 | |
| 161: *(u64 *)(r10 - 184) = r3 | |
| 162: r3 = 0 | |
| 163: *(u64 *)(r10 - 176) = r3 | |
| 164: r3 = 0 | |
| 165: *(u64 *)(r10 - 56) = r3 | |
| 166: r3 = 0 | |
| 167: *(u64 *)(r10 - 32) = r3 | |
| 168: r3 = 0 | |
| 169: *(u64 *)(r10 - 264) = r3 | |
| 170: r3 = 0 | |
| 171: *(u64 *)(r10 - 256) = r3 | |
| 172: r0 = 0 | |
| 173: r3 = 0 | |
| 174: *(u64 *)(r10 - 64) = r3 | |
| 175: r5 = 0 | |
| 176: r4 = 0 | |
| 177: r3 = 0 | |
| 178: *(u64 *)(r10 - 72) = r3 | |
| 179: *(u64 *)(r10 - 40) = r9 | |
| 180: if r9 != 1 goto 150 | |
| 181: *(u64 *)(r10 - 368) = r8 | |
| 182: r8 = 0 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) { | |
| 183: r3 = r1 | |
| 184: r3 += 38 | |
| 185: if r3 > r2 goto 612 | |
| 186: r2 = 38 | |
| 187: *(u64 *)(r10 - 80) = r2 | |
| 188: r2 = 0 | |
| 189: *(u64 *)(r10 - 224) = r2 | |
| 190: r2 = 1 | |
| ; hd.icmp.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 191: *(u64 *)(r10 - 40) = r2 | |
| 192: r4 = *(u16 *)(r1 + 36) | |
| 193: bswap16 r4 | |
| ; hd.icmp.typeCode = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 194: r5 = *(u16 *)(r1 + 34) | |
| 195: bswap16 r5 | |
| 196: r1 = 1 | |
| 197: *(u64 *)(r10 - 48) = r1 | |
| 198: r1 = 0 | |
| 199: *(u64 *)(r10 - 248) = r1 | |
| 200: r1 = 0 | |
| 201: *(u64 *)(r10 - 240) = r1 | |
| 202: r1 = 0 | |
| 203: *(u64 *)(r10 - 232) = r1 | |
| 204: r1 = 0 | |
| 205: *(u64 *)(r10 - 216) = r1 | |
| 206: r1 = 0 | |
| 207: *(u64 *)(r10 - 208) = r1 | |
| 208: r1 = 0 | |
| 209: *(u64 *)(r10 - 200) = r1 | |
| 210: r1 = 0 | |
| 211: *(u64 *)(r10 - 192) = r1 | |
| 212: r1 = 0 | |
| 213: *(u64 *)(r10 - 184) = r1 | |
| 214: r1 = 0 | |
| 215: *(u64 *)(r10 - 176) = r1 | |
| 216: r1 = 0 | |
| 217: *(u64 *)(r10 - 56) = r1 | |
| 218: r1 = 0 | |
| 219: *(u64 *)(r10 - 32) = r1 | |
| 220: r1 = 0 | |
| 221: *(u64 *)(r10 - 264) = r1 | |
| 222: r1 = 0 | |
| 223: *(u64 *)(r10 - 256) = r1 | |
| 224: r0 = 0 | |
| 225: r1 = 0 | |
| 226: *(u64 *)(r10 - 64) = r1 | |
| 227: r1 = 1 | |
| 228: goto 100 | |
| LBB0_10: | |
| 229: *(u64 *)(r10 - 368) = r8 | |
| 230: r8 = 0 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) { | |
| 231: r3 = r1 | |
| 232: r3 += 42 | |
| 233: if r3 > r2 goto 564 | |
| 234: r2 = 42 | |
| 235: *(u64 *)(r10 - 80) = r2 | |
| 236: r2 = 0 | |
| 237: *(u64 *)(r10 - 224) = r2 | |
| 238: r2 = 1 | |
| 239: *(u64 *)(r10 - 48) = r2 | |
| 240: r2 = 17 | |
| ; hd.udp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 241: *(u64 *)(r10 - 40) = r2 | |
| 242: r0 = *(u16 *)(r1 + 40) | |
| 243: bswap16 r0 | |
| ; hd.udp.length_ = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 244: r2 = *(u16 *)(r1 + 38) | |
| 245: bswap16 r2 | |
| 246: *(u64 *)(r10 - 256) = r2 | |
| ; hd.udp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 247: r2 = *(u16 *)(r1 + 36) | |
| 248: bswap16 r2 | |
| 249: *(u64 *)(r10 - 264) = r2 | |
| ; hd.udp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 250: r1 = *(u16 *)(r1 + 34) | |
| 251: bswap16 r1 | |
| 252: *(u64 *)(r10 - 32) = r1 | |
| 253: r1 = 0 | |
| 254: *(u64 *)(r10 - 248) = r1 | |
| 255: r1 = 0 | |
| 256: *(u64 *)(r10 - 240) = r1 | |
| 257: r1 = 0 | |
| 258: *(u64 *)(r10 - 232) = r1 | |
| 259: r1 = 0 | |
| 260: *(u64 *)(r10 - 216) = r1 | |
| 261: r1 = 0 | |
| 262: *(u64 *)(r10 - 208) = r1 | |
| 263: r1 = 0 | |
| 264: *(u64 *)(r10 - 200) = r1 | |
| 265: r1 = 0 | |
| 266: *(u64 *)(r10 - 192) = r1 | |
| 267: r1 = 0 | |
| 268: *(u64 *)(r10 - 184) = r1 | |
| 269: r1 = 0 | |
| 270: *(u64 *)(r10 - 176) = r1 | |
| 271: r1 = 0 | |
| 272: *(u64 *)(r10 - 56) = r1 | |
| 273: r1 = 1 | |
| 274: goto 50 | |
| LBB0_8: | |
| 275: *(u64 *)(r10 - 368) = r8 | |
| 276: r8 = 0 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| 277: r3 = r1 | |
| 278: r3 += 54 | |
| 279: if r3 > r2 goto 518 | |
| 280: r2 = 54 | |
| 281: *(u64 *)(r10 - 80) = r2 | |
| 282: r2 = 0 | |
| 283: *(u64 *)(r10 - 32) = r2 | |
| 284: r2 = 1 | |
| 285: *(u64 *)(r10 - 48) = r2 | |
| 286: r2 = 6 | |
| ; hd.tcp.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 287: *(u64 *)(r10 - 40) = r2 | |
| 288: r2 = *(u8 *)(r1 + 47) | |
| ; hd.tcp.dataOffset = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
| 289: *(u64 *)(r10 - 200) = r2 | |
| 290: r3 = *(u8 *)(r1 + 46) | |
| ; goto accept; | |
| 291: r2 = r3 | |
| 292: r2 &= 240 | |
| 293: *(u64 *)(r10 - 216) = r2 | |
| ; hd.tcp.urgentPtr = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 294: r2 = *(u16 *)(r1 + 52) | |
| 295: bswap16 r2 | |
| 296: *(u64 *)(r10 - 176) = r2 | |
| ; hd.tcp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 297: r2 = *(u16 *)(r1 + 50) | |
| 298: bswap16 r2 | |
| 299: *(u64 *)(r10 - 184) = r2 | |
| ; hd.tcp.window = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 300: r2 = *(u16 *)(r1 + 48) | |
| 301: bswap16 r2 | |
| 302: *(u64 *)(r10 - 192) = r2 | |
| ; hd.tcp.res = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4)); | |
| 303: r3 &= 15 | |
| 304: *(u64 *)(r10 - 208) = r3 | |
| ; hd.tcp.ackNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 305: r2 = *(u32 *)(r1 + 42) | |
| 306: bswap32 r2 | |
| 307: *(u64 *)(r10 - 232) = r2 | |
| ; hd.tcp.seqNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 308: r2 = *(u32 *)(r1 + 38) | |
| 309: bswap32 r2 | |
| 310: *(u64 *)(r10 - 240) = r2 | |
| ; hd.tcp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 311: r2 = *(u16 *)(r1 + 36) | |
| 312: bswap16 r2 | |
| 313: *(u64 *)(r10 - 248) = r2 | |
| ; hd.tcp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 314: r1 = *(u16 *)(r1 + 34) | |
| 315: bswap16 r1 | |
| 316: *(u64 *)(r10 - 224) = r1 | |
| 317: r1 = 1 | |
| 318: *(u64 *)(r10 - 56) = r1 | |
| 319: r1 = 0 | |
| 320: *(u64 *)(r10 - 264) = r1 | |
| 321: r1 = 0 | |
| 322: *(u64 *)(r10 - 256) = r1 | |
| 323: r0 = 0 | |
| 324: r1 = 0 | |
| LBB0_12: | |
| 325: *(u64 *)(r10 - 64) = r1 | |
| 326: r5 = 0 | |
| 327: r4 = 0 | |
| 328: r1 = 0 | |
| LBB0_13: | |
| 329: *(u64 *)(r10 - 72) = r1 | |
| 330: r8 = *(u64 *)(r10 - 368) | |
| LBB0_14: | |
| 331: *(u64 *)(r10 - 376) = r0 | |
| 332: *(u64 *)(r10 - 392) = r5 | |
| 333: *(u64 *)(r10 - 384) = r4 | |
| ; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 334: r1 = r7 | |
| 335: r1 >>= 8 | |
| 336: r2 = r7 | |
| 337: r2 <<= 8 | |
| 338: r2 |= r1 | |
| ; key.field0 = hd.ethernet.protocol; | |
| 339: *(u16 *)(r10 - 24) = r2 | |
| 340: r2 = r10 | |
| ; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 341: r2 += -24 | |
| ; value = bpf_map_lookup_elem(&dstmactable, &key); | |
| 342: r1 = 0ll | |
| 344: call 1 | |
| 345: r9 = *(u64 *)(r10 - 40) | |
| ; if (value == NULL) { | |
| 346: if r0 != 0 goto 6 | |
| 347: r2 = r10 | |
| ; u8 hit; | |
| 348: r2 += -4 | |
| ; value = bpf_map_lookup_elem(&dstmactable_defaultAction, &ebpf_zero); | |
| 349: r1 = 0ll | |
| 351: call 1 | |
| ; if (value != NULL) { | |
| 352: if r0 == 0 goto 444 | |
| LBB0_16: | |
| 353: r1 = 1 | |
| ; switch (value->action) { | |
| 354: r2 = *(u32 *)(r0 + 0) | |
| 355: if r2 == 1 goto 62 | |
| 356: if r2 != 0 goto 440 | |
| ; u32 checksum = htons(((u16)version << 12) | ((u16)ihl << 8) | (u16)diffserv); | |
| 357: r1 = *(u64 *)(r10 - 120) | |
| 358: r1 <<= 4 | |
| 359: r2 = *(u64 *)(r10 - 152) | |
| 360: r1 |= r2 | |
| 361: r1 &= 255 | |
| 362: r2 = *(u64 *)(r10 - 104) | |
| 363: r2 &= 255 | |
| 364: r2 <<= 8 | |
| 365: r2 |= r1 | |
| ; checksum += htons(totalLen); | |
| 366: r1 = *(u64 *)(r10 - 136) | |
| 367: bswap16 r1 | |
| 368: r1 += r2 | |
| ; checksum += htons(identification); | |
| 369: r2 = *(u64 *)(r10 - 128) | |
| 370: bswap16 r2 | |
| 371: r1 += r2 | |
| ; checksum += htons(((u16)ttl << 8) | (u16)protocol); | |
| 372: r2 = r9 | |
| 373: r2 <<= 8 | |
| 374: r2 |= 4 | |
| ; checksum += htons(((u16)flags << 13) | fragOffset); | |
| 375: r1 += r2 | |
| 376: r2 = 4294901760ll | |
| 378: r5 = *(u64 *)(r10 - 96) | |
| ; checksum += (srcAddr >> 16) + (u16)srcAddr; | |
| 379: r3 = r5 | |
| 380: r3 &= r2 | |
| 381: bswap32 r3 | |
| ; checksum += htons(((u16)ttl << 8) | (u16)protocol); | |
| 382: r1 += r3 | |
| ; checksum += htons(((u16)flags << 13) | fragOffset); | |
| 383: r3 = *(u64 *)(r10 - 112) | |
| 384: r3 <<= 5 | |
| 385: r4 = *(u64 *)(r10 - 144) | |
| 386: r4 |= r3 | |
| ; checksum += (srcAddr >> 16) + (u16)srcAddr; | |
| 387: r3 = r5 | |
| 388: bswap16 r3 | |
| 389: r1 += r3 | |
| 390: r5 = *(u64 *)(r10 - 88) | |
| ; checksum += (dstAddr >> 16) + (u16)dstAddr; | |
| 391: r3 = r5 | |
| 392: r3 &= r2 | |
| 393: bswap32 r3 | |
| ; checksum += (srcAddr >> 16) + (u16)srcAddr; | |
| 394: r1 += r3 | |
| ; checksum += htons(((u16)flags << 13) | fragOffset); | |
| 395: r4 &= 255 | |
| 396: r3 = r8 | |
| 397: r3 <<= 8 | |
| 398: r3 |= r4 | |
| ; checksum += (dstAddr >> 16) + (u16)dstAddr; | |
| 399: r4 = r5 | |
| 400: bswap16 r4 | |
| 401: r1 += r4 | |
| 402: r1 += r3 | |
| 403: r3 = r1 | |
| 404: r3 &= r2 | |
| ; return __constant_ntohs(~((checksum & 0xFFFF) + (checksum >> 16))); | |
| 405: r3 >>= 16 | |
| 406: r3 += r1 | |
| 407: r3 ^= -1 | |
| 408: r1 = r3 | |
| 409: r1 &= 65280 | |
| 410: r1 >>= 8 | |
| 411: r3 &= 65535 | |
| 412: r3 <<= 8 | |
| 413: r3 |= r1 | |
| 414: *(u64 *)(r10 - 160) = r3 | |
| 415: r1 = 2 | |
| 416: r2 = 4 | |
| ; break; | |
| 417: *(u64 *)(r10 - 168) = r2 | |
| LBB0_19: | |
| 418: *(u64 *)(r10 - 368) = r8 | |
| 419: r2 = *(u64 *)(r10 - 32) | |
| 420: *(u64 *)(r10 - 32) = r2 | |
| ; if (hd__.ipv4.ebpf_valid) ebpf_outHeaderLength += 160; | |
| 421: r2 = 272 | |
| 422: r8 = 0 | |
| 423: r3 = *(u64 *)(r10 - 48) | |
| 424: if r3 != r8 goto 1 | |
| 425: r2 = 112 | |
| LBB0_21: | |
| ; if (hd__.tcp.ebpf_valid) ebpf_outHeaderLength += 160; | |
| 426: r3 = r2 | |
| 427: r3 += 160 | |
| 428: r4 = *(u64 *)(r10 - 56) | |
| 429: if r4 != r8 goto 1 | |
| 430: r3 = r2 | |
| LBB0_23: | |
| ; if (hd__.udp.ebpf_valid) ebpf_outHeaderLength += 64; | |
| 431: r4 = r3 | |
| 432: r4 += 64 | |
| 433: r2 = *(u64 *)(r10 - 64) | |
| 434: if r2 != r8 goto 1 | |
| 435: r4 = r3 | |
| LBB0_25: | |
| ; if (hd__.icmp.ebpf_valid) ebpf_outHeaderLength += 32; | |
| 436: r5 = r4 | |
| 437: r5 += 32 | |
| 438: r3 = *(u64 *)(r10 - 72) | |
| 439: if r3 != r8 goto 1 | |
| 440: r5 = r4 | |
| LBB0_27: | |
| ; xout.output_port = 0; | |
| 441: *(u32 *)(r10 - 12) = r8 | |
| ; xout.output_action = tmp_2; | |
| 442: *(u32 *)(r10 - 16) = r1 | |
| ; if (hd__.icmp.ebpf_valid) ebpf_outHeaderLength += 32; | |
| 443: r1 = 4294967288ll | |
| 445: r5 &= r1 | |
| ; bpf_xdp_adjust_head(skb, BYTES(ebpf_packetOffsetInBits) - BYTES(ebpf_outHeaderLength)); | |
| 446: r5 >>= 3 | |
| 447: r2 = *(u64 *)(r10 - 80) | |
| 448: r2 -= r5 | |
| 449: r1 = r6 | |
| 450: call 44 | |
| ; ebpf_packetEnd = ((void*)(long)skb->data_end); | |
| 451: r2 = *(u32 *)(r6 + 4) | |
| ; ebpf_packetStart = ((void*)(long)skb->data); | |
| 452: r1 = *(u32 *)(r6 + 0) | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) { | |
| 453: r3 = r1 | |
| 454: r3 += 14 | |
| 455: if r3 > r2 goto 342 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 456: r3 = *(u64 *)(r10 - 360) | |
| 457: *(u8 *)(r1 + 0) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 458: r3 = *(u64 *)(r10 - 352) | |
| 459: *(u8 *)(r1 + 1) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 460: r3 = *(u64 *)(r10 - 344) | |
| 461: *(u8 *)(r1 + 2) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 462: r3 = *(u64 *)(r10 - 336) | |
| 463: *(u8 *)(r1 + 3) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0); | |
| 464: r3 = *(u64 *)(r10 - 328) | |
| 465: *(u8 *)(r1 + 4) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0); | |
| 466: r3 = *(u64 *)(r10 - 320) | |
| 467: *(u8 *)(r1 + 5) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 468: r3 = *(u64 *)(r10 - 312) | |
| 469: *(u8 *)(r1 + 6) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 470: r3 = *(u64 *)(r10 - 304) | |
| 471: *(u8 *)(r1 + 7) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 472: r3 = *(u64 *)(r10 - 296) | |
| 473: *(u8 *)(r1 + 8) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 474: r3 = *(u64 *)(r10 - 288) | |
| 475: *(u8 *)(r1 + 9) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0); | |
| 476: r3 = *(u64 *)(r10 - 280) | |
| 477: *(u8 *)(r1 + 10) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0); | |
| 478: r3 = *(u64 *)(r10 - 272) | |
| 479: *(u8 *)(r1 + 11) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 480: *(u8 *)(r1 + 12) = r7 | |
| ; hd__.ethernet.protocol = htons(hd__.ethernet.protocol); | |
| 481: r7 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 482: *(u8 *)(r1 + 13) = r7 | |
| 483: r3 = 112 | |
| ; if (hd__.ipv4.ebpf_valid) { | |
| 484: r4 = *(u64 *)(r10 - 48) | |
| 485: if r4 == 0 goto 64 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| 486: r3 = r1 | |
| 487: r3 += 34 | |
| 488: if r3 > r2 goto 309 | |
| 489: r3 = *(u64 *)(r10 - 120) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4); | |
| 490: r3 <<= 4 | |
| ; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4); | |
| 491: r4 = *(u64 *)(r10 - 152) | |
| 492: r3 |= r4 | |
| 493: *(u8 *)(r1 + 14) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 494: r3 = *(u64 *)(r10 - 104) | |
| 495: *(u8 *)(r1 + 15) = r3 | |
| 496: r4 = *(u64 *)(r10 - 136) | |
| ; hd__.ipv4.totalLen = htons(hd__.ipv4.totalLen); | |
| 497: r3 = r4 | |
| 498: r3 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 499: *(u8 *)(r1 + 16) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 500: *(u8 *)(r1 + 17) = r4 | |
| 501: r4 = *(u64 *)(r10 - 128) | |
| ; hd__.ipv4.identification = htons(hd__.ipv4.identification); | |
| 502: r3 = r4 | |
| 503: r3 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 504: *(u8 *)(r1 + 18) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 505: *(u8 *)(r1 + 19) = r4 | |
| 506: r3 = *(u64 *)(r10 - 112) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 5); | |
| 507: r3 <<= 5 | |
| 508: r4 = *(u64 *)(r10 - 368) | |
| ; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 3, (ebpf_byte) << 3); | |
| 509: r4 >>= 2 | |
| 510: r4 &= 7 | |
| 511: r4 |= r3 | |
| 512: *(u8 *)(r1 + 20) = r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 513: r3 = *(u64 *)(r10 - 144) | |
| 514: *(u8 *)(r1 + 21) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 515: r3 = *(u64 *)(r10 - 168) | |
| 516: *(u8 *)(r1 + 22) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 517: *(u8 *)(r1 + 23) = r9 | |
| 518: r4 = *(u64 *)(r10 - 160) | |
| ; hd__.ipv4.hdrChecksum = htons(hd__.ipv4.hdrChecksum); | |
| 519: r3 = r4 | |
| 520: r3 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 521: *(u8 *)(r1 + 24) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 522: *(u8 *)(r1 + 25) = r4 | |
| 523: r5 = *(u64 *)(r10 - 96) | |
| ; hd__.ipv4.srcAddr = htonl(hd__.ipv4.srcAddr); | |
| 524: r3 = r5 | |
| 525: bswap32 r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 526: *(u8 *)(r1 + 26) = r3 | |
| ; hd__.ipv4.srcAddr = htonl(hd__.ipv4.srcAddr); | |
| 527: r3 = r5 | |
| 528: bswap64 r3 | |
| 529: r4 = r3 | |
| 530: r4 >>= 40 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 531: *(u8 *)(r1 + 27) = r4 | |
| ; hd__.ipv4.srcAddr = htonl(hd__.ipv4.srcAddr); | |
| 532: bswap16 r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 533: *(u8 *)(r1 + 28) = r5 | |
| ; hd__.ipv4.srcAddr = htonl(hd__.ipv4.srcAddr); | |
| 534: r3 >>= 56 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 535: *(u8 *)(r1 + 29) = r3 | |
| 536: r5 = *(u64 *)(r10 - 88) | |
| ; hd__.ipv4.dstAddr = htonl(hd__.ipv4.dstAddr); | |
| 537: r3 = r5 | |
| 538: bswap32 r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 539: *(u8 *)(r1 + 30) = r3 | |
| ; hd__.ipv4.dstAddr = htonl(hd__.ipv4.dstAddr); | |
| 540: r3 = r5 | |
| 541: bswap64 r3 | |
| 542: r4 = r3 | |
| 543: r4 >>= 40 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 544: *(u8 *)(r1 + 31) = r4 | |
| ; hd__.ipv4.dstAddr = htonl(hd__.ipv4.dstAddr); | |
| 545: bswap16 r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 546: *(u8 *)(r1 + 32) = r5 | |
| ; hd__.ipv4.dstAddr = htonl(hd__.ipv4.dstAddr); | |
| 547: r3 >>= 56 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 548: *(u8 *)(r1 + 33) = r3 | |
| 549: r3 = 272 | |
| LBB0_31: | |
| ; if (hd__.tcp.ebpf_valid) { | |
| 550: r4 = *(u64 *)(r10 - 56) | |
| 551: if r4 == 0 goto 150 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| 552: r5 = r3 | |
| 553: r5 += 160 | |
| 554: r4 = 4294967288ll | |
| 556: r5 &= r4 | |
| 557: r5 >>= 3 | |
| 558: r0 = r1 | |
| 559: r0 += r5 | |
| 560: if r0 > r2 goto 237 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 561: r5 = r3 | |
| 562: r5 &= r4 | |
| 563: r5 >>= 3 | |
| 564: r0 = r1 | |
| 565: r0 += r5 | |
| 566: r7 = *(u64 *)(r10 - 224) | |
| ; hd__.tcp.srcPort = htons(hd__.tcp.srcPort); | |
| 567: r6 = r7 | |
| 568: r6 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 569: *(u8 *)(r0 + 0) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 570: r5 |= 1 | |
| 571: r0 = r1 | |
| 572: r0 += r5 | |
| 573: *(u8 *)(r0 + 0) = r7 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 574: r5 = r3 | |
| 575: r5 += 16 | |
| 576: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 577: r5 >>= 3 | |
| 578: r0 = r1 | |
| 579: r0 += r5 | |
| 580: r7 = *(u64 *)(r10 - 248) | |
| ; hd__.tcp.dstPort = htons(hd__.tcp.dstPort); | |
| 581: r6 = r7 | |
| 582: r6 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 583: *(u8 *)(r0 + 0) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 584: r5 |= 1 | |
| 585: r0 = r1 | |
| 586: r0 += r5 | |
| 587: *(u8 *)(r0 + 0) = r7 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 588: r5 = r3 | |
| 589: r5 += 32 | |
| 590: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 591: r5 >>= 3 | |
| 592: r0 = r1 | |
| 593: r0 += r5 | |
| 594: r9 = *(u64 *)(r10 - 240) | |
| ; hd__.tcp.seqNo = htonl(hd__.tcp.seqNo); | |
| 595: r6 = r9 | |
| 596: bswap32 r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 597: *(u8 *)(r0 + 0) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 598: r5 |= 1 | |
| 599: r6 = r1 | |
| 600: r6 += r5 | |
| ; hd__.tcp.seqNo = htonl(hd__.tcp.seqNo); | |
| 601: r5 = r9 | |
| 602: bswap64 r5 | |
| 603: r7 = r5 | |
| 604: r7 >>= 40 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 605: *(u8 *)(r6 + 0) = r7 | |
| ; hd__.tcp.seqNo = htonl(hd__.tcp.seqNo); | |
| 606: bswap16 r9 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 607: *(u8 *)(r0 + 2) = r9 | |
| ; hd__.tcp.seqNo = htonl(hd__.tcp.seqNo); | |
| 608: r5 >>= 56 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 609: *(u8 *)(r0 + 3) = r5 | |
| ; ebpf_packetOffsetInBits += 32; | |
| 610: r5 = r3 | |
| 611: r5 += 64 | |
| 612: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 613: r5 >>= 3 | |
| 614: r0 = r1 | |
| 615: r0 += r5 | |
| 616: r9 = *(u64 *)(r10 - 232) | |
| ; hd__.tcp.ackNo = htonl(hd__.tcp.ackNo); | |
| 617: r6 = r9 | |
| 618: bswap32 r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 619: *(u8 *)(r0 + 0) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 620: r5 |= 1 | |
| 621: r6 = r1 | |
| 622: r6 += r5 | |
| ; hd__.tcp.ackNo = htonl(hd__.tcp.ackNo); | |
| 623: r5 = r9 | |
| 624: bswap64 r5 | |
| 625: r7 = r5 | |
| 626: r7 >>= 40 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 627: *(u8 *)(r6 + 0) = r7 | |
| ; hd__.tcp.ackNo = htonl(hd__.tcp.ackNo); | |
| 628: bswap16 r9 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 629: *(u8 *)(r0 + 2) = r9 | |
| ; hd__.tcp.ackNo = htonl(hd__.tcp.ackNo); | |
| 630: r5 >>= 56 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 631: *(u8 *)(r0 + 3) = r5 | |
| ; ebpf_packetOffsetInBits += 32; | |
| 632: r5 = r3 | |
| 633: r5 += 96 | |
| 634: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4); | |
| 635: r5 >>= 3 | |
| 636: r0 = r1 | |
| 637: r0 += r5 | |
| 638: r5 = *(u64 *)(r10 - 216) | |
| 639: *(u8 *)(r0 + 0) = r5 | |
| ; ebpf_packetOffsetInBits += 4; | |
| 640: r5 = r3 | |
| 641: r5 += 100 | |
| 642: r5 &= r4 | |
| ; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4); | |
| 643: r5 >>= 3 | |
| 644: r0 = r1 | |
| 645: r0 += r5 | |
| 646: r5 = *(u8 *)(r0 + 0) | |
| 647: r5 &= 240 | |
| 648: r6 = *(u64 *)(r10 - 208) | |
| 649: r5 |= r6 | |
| 650: *(u8 *)(r0 + 0) = r5 | |
| ; ebpf_packetOffsetInBits += 4; | |
| 651: r5 = r3 | |
| 652: r5 += 104 | |
| 653: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 654: r5 >>= 3 | |
| 655: r0 = r1 | |
| 656: r0 += r5 | |
| 657: r5 = *(u64 *)(r10 - 200) | |
| 658: *(u8 *)(r0 + 0) = r5 | |
| ; ebpf_packetOffsetInBits += 8; | |
| 659: r5 = r3 | |
| 660: r5 += 112 | |
| 661: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 662: r5 >>= 3 | |
| 663: r0 = r1 | |
| 664: r0 += r5 | |
| 665: r7 = *(u64 *)(r10 - 192) | |
| ; hd__.tcp.window = htons(hd__.tcp.window); | |
| 666: r6 = r7 | |
| 667: r6 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 668: *(u8 *)(r0 + 0) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 669: r5 |= 1 | |
| 670: r0 = r1 | |
| 671: r0 += r5 | |
| 672: *(u8 *)(r0 + 0) = r7 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 673: r3 |= 128 | |
| 674: r5 = r3 | |
| 675: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 676: r5 >>= 3 | |
| 677: r0 = r1 | |
| 678: r0 += r5 | |
| 679: r7 = *(u64 *)(r10 - 184) | |
| ; hd__.tcp.checksum = htons(hd__.tcp.checksum); | |
| 680: r6 = r7 | |
| 681: r6 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 682: *(u8 *)(r0 + 0) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 683: r5 |= 1 | |
| 684: r0 = r1 | |
| 685: r0 += r5 | |
| 686: *(u8 *)(r0 + 0) = r7 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 687: r5 = r3 | |
| 688: r5 += 16 | |
| 689: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 690: r5 >>= 3 | |
| 691: r4 = r1 | |
| 692: r4 += r5 | |
| 693: r6 = *(u64 *)(r10 - 176) | |
| ; hd__.tcp.urgentPtr = htons(hd__.tcp.urgentPtr); | |
| 694: r0 = r6 | |
| 695: r0 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 696: *(u8 *)(r4 + 0) = r0 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 697: r5 |= 1 | |
| 698: r4 = r1 | |
| 699: r4 += r5 | |
| 700: *(u8 *)(r4 + 0) = r6 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 701: r3 += 32 | |
| LBB0_34: | |
| ; if (hd__.udp.ebpf_valid) { | |
| 702: r4 = *(u64 *)(r10 - 64) | |
| 703: if r4 == 0 goto 53 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) { | |
| 704: r4 = r3 | |
| 705: r4 += 64 | |
| 706: r5 = 4294967288ll | |
| 708: r0 = r4 | |
| 709: r0 &= r5 | |
| 710: r0 >>= 3 | |
| 711: r6 = r1 | |
| 712: r6 += r0 | |
| 713: if r6 > r2 goto 84 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 714: r0 = r3 | |
| 715: r0 &= r5 | |
| 716: r0 >>= 3 | |
| 717: r6 = r1 | |
| 718: r6 += r0 | |
| 719: r7 = *(u64 *)(r10 - 32) | |
| ; hd__.udp.srcPort = htons(hd__.udp.srcPort); | |
| 720: r0 = r7 | |
| 721: r0 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 722: *(u8 *)(r6 + 0) = r0 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 723: *(u8 *)(r6 + 1) = r7 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 724: r0 = r3 | |
| 725: r0 += 16 | |
| 726: r0 &= r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 727: r0 >>= 3 | |
| 728: r6 = r1 | |
| 729: r6 += r0 | |
| 730: r7 = *(u64 *)(r10 - 264) | |
| ; hd__.udp.dstPort = htons(hd__.udp.dstPort); | |
| 731: r0 = r7 | |
| 732: r0 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 733: *(u8 *)(r6 + 0) = r0 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 734: *(u8 *)(r6 + 1) = r7 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 735: r0 = r3 | |
| 736: r0 += 32 | |
| 737: r0 &= r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 738: r0 >>= 3 | |
| 739: r6 = r1 | |
| 740: r6 += r0 | |
| 741: r7 = *(u64 *)(r10 - 256) | |
| ; hd__.udp.length_ = htons(hd__.udp.length_); | |
| 742: r0 = r7 | |
| 743: r0 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 744: *(u8 *)(r6 + 0) = r0 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 745: *(u8 *)(r6 + 1) = r7 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 746: r3 += 48 | |
| 747: r3 &= r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 748: r3 >>= 3 | |
| 749: r5 = r1 | |
| 750: r5 += r3 | |
| 751: r0 = *(u64 *)(r10 - 376) | |
| ; hd__.udp.checksum = htons(hd__.udp.checksum); | |
| 752: r3 = r0 | |
| 753: r3 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 754: *(u8 *)(r5 + 0) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 755: *(u8 *)(r5 + 1) = r0 | |
| 756: r3 = r4 | |
| LBB0_37: | |
| ; if (hd__.icmp.ebpf_valid) { | |
| 757: r4 = *(u64 *)(r10 - 72) | |
| 758: if r4 == 0 goto 28 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) { | |
| 759: r5 = r3 | |
| 760: r5 += 32 | |
| 761: r4 = 4294967288ll | |
| 763: r5 &= r4 | |
| 764: r5 >>= 3 | |
| 765: r0 = r1 | |
| 766: r0 += r5 | |
| 767: if r0 > r2 goto 30 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 768: r2 = r3 | |
| 769: r2 &= r4 | |
| 770: r2 >>= 3 | |
| 771: r5 = r1 | |
| 772: r5 += r2 | |
| 773: r0 = *(u64 *)(r10 - 392) | |
| ; hd__.icmp.typeCode = htons(hd__.icmp.typeCode); | |
| 774: r2 = r0 | |
| 775: r2 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 776: *(u8 *)(r5 + 0) = r2 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 777: *(u8 *)(r5 + 1) = r0 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 778: r3 += 16 | |
| 779: r3 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 780: r3 >>= 3 | |
| 781: r1 += r3 | |
| 782: r3 = *(u64 *)(r10 - 384) | |
| ; hd__.icmp.hdrChecksum = htons(hd__.icmp.hdrChecksum); | |
| 783: r2 = r3 | |
| 784: r2 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 785: *(u8 *)(r1 + 0) = r2 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 786: *(u8 *)(r1 + 1) = r3 | |
| LBB0_40: | |
| ; xout.output_port = 0; | |
| 787: r3 = r10 | |
| 788: r3 += -12 | |
| 789: r2 = r10 | |
| 790: r2 += -4 | |
| ; bpf_map_update_elem(&ebpf_outTable, &ebpf_zero, &xout.output_port, BPF_ANY); | |
| 791: r1 = 0ll | |
| 793: r4 = 0 | |
| 794: call 2 | |
| ; return xout.output_action; | |
| 795: r8 = *(u32 *)(r10 - 16) | |
| 796: goto 1 | |
| LBB0_42: | |
| 797: r8 = 0 | |
| LBB0_41: | |
| ; } | |
| 798: r0 = r8 | |
| 799: exit |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // use map instead of local variable. | |
| @@ -114,25 +114,18 @@ struct bpf_map_def SEC("maps") ebpf_outTable = { | |
| .max_entries = 1 /* No multicast support */ | |
| }; | |
| + | |
| +struct bpf_map_def SEC("maps") Headers = { | |
| + .type = BPF_MAP_TYPE_PERCPU_ARRAY, | |
| + .key_size = sizeof(u32), | |
| + .value_size = sizeof(struct Headers), | |
| + .pinning = 2, /* PIN_GLOBAL_NS */ | |
| + .max_entries = 1 /* No multicast support */ | |
| +}; | |
| + | |
| SEC("prog") | |
| int ebpf_filter(struct xdp_md* skb){ | |
| - struct Headers hd = { | |
| - .ethernet = { | |
| - .ebpf_valid = 0 | |
| - }, | |
| - .ipv4 = { | |
| - .ebpf_valid = 0 | |
| - }, | |
| - .tcp = { | |
| - .ebpf_valid = 0 | |
| - }, | |
| - .udp = { | |
| - .ebpf_valid = 0 | |
| - }, | |
| - .icmp = { | |
| - .ebpf_valid = 0 | |
| - }, | |
| - }; | |
| + struct Headers hd_zero, *hd; | |
| unsigned ebpf_packetOffsetInBits = 0; | |
| enum ebpf_errorCodes ebpf_errorCode = NoError; | |
| void* ebpf_packetStart = ((void*)(long)skb->data); | |
| @@ -144,84 +137,90 @@ int ebpf_filter(struct xdp_md* skb){ | |
| /* TODO: this should be initialized by the environment. HOW? */ | |
| struct xdp_input xin; | |
| + __builtin_memset(&hd_zero, 0, sizeof(hd_zero)); | |
| + bpf_map_update_elem(&Headers, &ebpf_zero, &hd_zero, BPF_ANY); | |
| + hd = bpf_map_lookup_elem(&Headers, &ebpf_zero); | |
| + if (!hd) | |
| + return XDP_ABORTED; | |
| + | |
| goto start; | |
| start: { | |
| - /* extract(hd.ethernet)*/ | |
| + /* extract(hd->ethernet)*/ | |
| if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) { | |
| ebpf_errorCode = PacketTooShort; | |
| goto reject; | |
| } | |
| - hd.ethernet.destination[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0)); | |
| - hd.ethernet.destination[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0)); | |
| - hd.ethernet.destination[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0)); | |
| - hd.ethernet.destination[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0)); | |
| - hd.ethernet.destination[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0)); | |
| - hd.ethernet.destination[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0)); | |
| + hd->ethernet.destination[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0): |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* Automatically generated by p4c-xdp from xdp9.p4 on Fri Apr 14 10:34:12 2017 | |
| */ | |
| #include "xdp9.h" | |
| #define KBUILD_MODNAME "xdptest" | |
| #include <linux/bpf.h> | |
| #include "bpf_helpers.h" | |
| #define load_byte(data, b) (*(((u8*)(data)) + (b))) | |
| #define load_half(data, b) __constant_ntohs(*(u16 *)((u8*)(data) + (b))) | |
| #define load_word(data, b) __constant_ntohl(*(u32 *)((u8*)(data) + (b))) | |
| #define htonl(d) __constant_htonl(d) | |
| #define htons(d) __constant_htons(d) | |
| enum ebpf_errorCodes { | |
| NoError, | |
| PacketTooShort, | |
| NoMatch, | |
| StackOutOfBounds, | |
| OverwritingHeader, | |
| HeaderTooShort, | |
| ParserTimeout, | |
| }; | |
| #define EBPF_MASK(t, w) ((((t)(1)) << (w)) - (t)1) | |
| #define BYTES(w) ((w) / 8) | |
| #define write_partial(a, s, v) do { u8 mask = EBPF_MASK(u8, s); *((u8*)a) = ((*((u8*)a)) & ~mask) | (((v) >> (8 - (s))) & mask); } while (0) | |
| #define write_byte(base, offset, v) do { *(u8*)((base) + (offset)) = (v); } while (0) | |
| void* memcpy(void* dest, const void* src, size_t num); | |
| struct bpf_map_def SEC("maps") dstmactable = { | |
| .type = BPF_MAP_TYPE_HASH, | |
| .key_size = sizeof(struct dstmactable_key), | |
| .value_size = sizeof(struct dstmactable_value), | |
| .pinning = 2, /* PIN_GLOBAL_NS */ | |
| .max_entries = 64, | |
| }; | |
| struct bpf_map_def SEC("maps") dstmactable_defaultAction = { | |
| .type = BPF_MAP_TYPE_ARRAY, | |
| .key_size = sizeof(u32), | |
| .value_size = sizeof(struct dstmactable_value), | |
| .pinning = 2, /* PIN_GLOBAL_NS */ | |
| .max_entries = 1, | |
| }; | |
| inline u16 ebpf_ipv4_checksum(u8 version, u8 ihl, u8 diffserv, | |
| u16 totalLen, u16 identification, u8 flags, | |
| u16 fragOffset, u8 ttl, u8 protocol, | |
| u32 srcAddr, u32 dstAddr) { | |
| u32 checksum = htons(((u16)version << 12) | ((u16)ihl << 8) | (u16)diffserv); | |
| checksum += htons(totalLen); | |
| checksum += htons(identification); | |
| checksum += htons(((u16)flags << 13) | fragOffset); | |
| checksum += htons(((u16)ttl << 8) | (u16)protocol); | |
| srcAddr = htonl(srcAddr); | |
| dstAddr = htonl(dstAddr); | |
| checksum += (srcAddr >> 16) + (u16)srcAddr; | |
| checksum += (dstAddr >> 16) + (u16)dstAddr; | |
| // Fields in 'struct Headers' are host byte order. Deparser converts to network byte-order | |
| return __constant_ntohs(~((checksum & 0xFFFF) + (checksum >> 16))); | |
| } | |
| inline u16 csum16_add(u16 csum, u16 addend) { | |
| u16 res = csum; | |
| res += addend; | |
| return (res + (res < addend)); | |
| } | |
| inline u16 csum16_sub(u16 csum, u16 addend) { | |
| return csum16_add(csum, ~addend); | |
| } | |
| inline u16 csum_replace2(u16 csum, u16 old, u16 new) { | |
| return (~csum16_add(csum16_sub(~csum, old), new)); | |
| } | |
| inline u16 csum_fold(u32 csum) { | |
| u32 r = csum << 16 | csum >> 16; | |
| csum = ~csum; | |
| csum -= r; | |
| return (u16)(csum >> 16); | |
| } | |
| inline u32 csum_unfold(u16 csum) { | |
| return (u32)csum; | |
| } | |
| inline u32 csum32_add(u32 csum, u32 addend) { | |
| u32 res = csum; | |
| res += addend; | |
| return (res + (res < addend)); | |
| } | |
| inline u32 csum32_sub(u32 csum, u32 addend) { | |
| return csum32_add(csum, ~addend); | |
| } | |
| inline u16 csum_replace4(u16 csum, u32 from, u32 to) { | |
| u32 tmp = csum32_sub(~csum_unfold(csum), from); | |
| return csum_fold(csum32_add(tmp, to)); | |
| } | |
| struct bpf_map_def SEC("maps") perf_event = { | |
| .type = BPF_MAP_TYPE_PERF_EVENT_ARRAY, | |
| .key_size = sizeof(u32), | |
| .value_size = sizeof(u32), | |
| .pinning = 2, | |
| .max_entries = 2, | |
| }; | |
| #define BPF_PERF_EVENT_OUTPUT() do {\ | |
| int pktsize = (int)(skb->data_end - skb->data);\ | |
| bpf_perf_event_output(skb, &perf_event, ((u64)pktsize << 32), &pktsize, 4);\ | |
| } while(0); | |
| #define BPF_KTIME_GET_NS() ({\ | |
| u32 ___ts = (u32)bpf_ktime_get_ns(); ___ts; })\ | |
| struct bpf_map_def SEC("maps") ebpf_outTable = { | |
| .type = BPF_MAP_TYPE_PERCPU_ARRAY, | |
| .key_size = sizeof(u32), | |
| .value_size = sizeof(u32), | |
| .pinning = 2, /* PIN_GLOBAL_NS */ | |
| .max_entries = 1 /* No multicast support */ | |
| }; | |
| SEC("prog") | |
| int ebpf_filter(struct xdp_md* skb){ | |
| struct Headers hd = { | |
| .ethernet = { | |
| .ebpf_valid = 0 | |
| }, | |
| .ipv4 = { | |
| .ebpf_valid = 0 | |
| }, | |
| .tcp = { | |
| .ebpf_valid = 0 | |
| }, | |
| .udp = { | |
| .ebpf_valid = 0 | |
| }, | |
| .icmp = { | |
| .ebpf_valid = 0 | |
| }, | |
| }; | |
| unsigned ebpf_packetOffsetInBits = 0; | |
| enum ebpf_errorCodes ebpf_errorCode = NoError; | |
| void* ebpf_packetStart = ((void*)(long)skb->data); | |
| void* ebpf_packetEnd = ((void*)(long)skb->data_end); | |
| u32 ebpf_zero = 0; | |
| u8 ebpf_byte = 0; | |
| u32 ebpf_outHeaderLength = 0; | |
| struct xdp_output xout; | |
| /* TODO: this should be initialized by the environment. HOW? */ | |
| struct xdp_input xin; | |
| goto start; | |
| start: { | |
| /* extract(hd.ethernet)*/ | |
| if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) { | |
| ebpf_errorCode = PacketTooShort; | |
| goto reject; | |
| } | |
| hd.ethernet.destination[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0)); | |
| hd.ethernet.destination[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0)); | |
| hd.ethernet.destination[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0)); | |
| hd.ethernet.destination[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0)); | |
| hd.ethernet.destination[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0)); | |
| hd.ethernet.destination[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0)); | |
| ebpf_packetOffsetInBits += 48; | |
| hd.ethernet.source[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0)); | |
| hd.ethernet.source[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0)); | |
| hd.ethernet.source[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0)); | |
| hd.ethernet.source[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0)); | |
| hd.ethernet.source[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0)); | |
| hd.ethernet.source[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0)); | |
| ebpf_packetOffsetInBits += 48; | |
| hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.ethernet.ebpf_valid = 1; | |
| switch (hd.ethernet.protocol) { | |
| case 2048: goto parse_ipv4; | |
| default: goto accept; | |
| } | |
| } | |
| parse_ipv4: { | |
| /* extract(hd.ipv4)*/ | |
| if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| ebpf_errorCode = PacketTooShort; | |
| goto reject; | |
| } | |
| hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
| ebpf_packetOffsetInBits += 4; | |
| hd.ipv4.ihl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4)); | |
| ebpf_packetOffsetInBits += 4; | |
| hd.ipv4.diffserv = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 8; | |
| hd.ipv4.totalLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.ipv4.identification = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.ipv4.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 5) & EBPF_MASK(u8, 3)); | |
| ebpf_packetOffsetInBits += 3; | |
| hd.ipv4.fragOffset = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u16, 13)); | |
| ebpf_packetOffsetInBits += 13; | |
| hd.ipv4.ttl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 8; | |
| hd.ipv4.protocol = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 8; | |
| hd.ipv4.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.ipv4.srcAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 32; | |
| hd.ipv4.dstAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 32; | |
| hd.ipv4.ebpf_valid = 1; | |
| switch (hd.ipv4.protocol) { | |
| case 6: goto parse_tcp; | |
| case 17: goto parse_udp; | |
| case 1: goto parse_icmp; | |
| default: goto accept; | |
| } | |
| } | |
| parse_icmp: { | |
| /* extract(hd.icmp)*/ | |
| if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) { | |
| ebpf_errorCode = PacketTooShort; | |
| goto reject; | |
| } | |
| hd.icmp.typeCode = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.icmp.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.icmp.ebpf_valid = 1; | |
| goto accept; | |
| } | |
| parse_tcp: { | |
| /* extract(hd.tcp)*/ | |
| if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| ebpf_errorCode = PacketTooShort; | |
| goto reject; | |
| } | |
| hd.tcp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.tcp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.tcp.seqNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 32; | |
| hd.tcp.ackNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 32; | |
| hd.tcp.dataOffset = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
| ebpf_packetOffsetInBits += 4; | |
| hd.tcp.res = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4)); | |
| ebpf_packetOffsetInBits += 4; | |
| hd.tcp.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 8; | |
| hd.tcp.window = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.tcp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.tcp.urgentPtr = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.tcp.ebpf_valid = 1; | |
| goto accept; | |
| } | |
| parse_udp: { | |
| /* extract(hd.udp)*/ | |
| if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) { | |
| ebpf_errorCode = PacketTooShort; | |
| goto reject; | |
| } | |
| hd.udp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.udp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.udp.length_ = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.udp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.udp.ebpf_valid = 1; | |
| goto accept; | |
| } | |
| reject: { return XDP_ABORTED; } | |
| accept: | |
| { | |
| u8 hit; | |
| u8 xoutdrop; | |
| u16 tmp_1; | |
| enum xdp_action tmp_2; | |
| { | |
| /* dstmactable.apply()*/ | |
| { | |
| /* construct key */ | |
| struct dstmactable_key key = {}; | |
| key.field0 = hd.ethernet.protocol; | |
| /* value */ | |
| struct dstmactable_value *value; | |
| /* perform lookup */ | |
| value = bpf_map_lookup_elem(&dstmactable, &key); | |
| if (value == NULL) { | |
| /* miss; find default action */ | |
| hit = 0; | |
| value = bpf_map_lookup_elem(&dstmactable_defaultAction, &ebpf_zero); | |
| } else { | |
| hit = 1; | |
| } | |
| if (value != NULL) { | |
| /* run action */ | |
| switch (value->action) { | |
| case Fallback_action: | |
| { | |
| hd.ipv4.ttl = 4; | |
| tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr); | |
| hd.ipv4.hdrChecksum = tmp_1; | |
| xoutdrop = false; | |
| } | |
| break; | |
| case Drop_action: | |
| { | |
| xoutdrop = true; | |
| } | |
| break; | |
| default: return XDP_ABORTED; | |
| } | |
| } | |
| else return XDP_ABORTED; | |
| } | |
| ; | |
| xout.output_port = 0; | |
| if (xoutdrop) | |
| tmp_2 = XDP_DROP; | |
| else | |
| tmp_2 = XDP_PASS; | |
| xout.output_action = tmp_2; | |
| } | |
| } | |
| /* deparser */ | |
| { | |
| { | |
| if (hd.ethernet.ebpf_valid) ebpf_outHeaderLength += 112; | |
| if (hd.ipv4.ebpf_valid) ebpf_outHeaderLength += 160; | |
| if (hd.tcp.ebpf_valid) ebpf_outHeaderLength += 160; | |
| if (hd.udp.ebpf_valid) ebpf_outHeaderLength += 64; | |
| if (hd.icmp.ebpf_valid) ebpf_outHeaderLength += 32; | |
| } | |
| bpf_xdp_adjust_head(skb, BYTES(ebpf_packetOffsetInBits) - BYTES(ebpf_outHeaderLength)); | |
| ebpf_packetStart = ((void*)(long)skb->data); | |
| ebpf_packetEnd = ((void*)(long)skb->data_end); | |
| ebpf_packetOffsetInBits = 0; | |
| u8 hit_0; | |
| { | |
| /* packet.emit(hd.ethernet)*/ | |
| if (hd.ethernet.ebpf_valid) { | |
| if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) { | |
| ebpf_errorCode = PacketTooShort; | |
| return XDP_ABORTED; | |
| } | |
| ebpf_byte = ((char*)(&hd.ethernet.destination))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ethernet.destination))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ethernet.destination))[2]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ethernet.destination))[3]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ethernet.destination))[4]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ethernet.destination))[5]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 48; | |
| ebpf_byte = ((char*)(&hd.ethernet.source))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ethernet.source))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ethernet.source))[2]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ethernet.source))[3]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ethernet.source))[4]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ethernet.source))[5]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 48; | |
| hd.ethernet.protocol = htons(hd.ethernet.protocol); | |
| ebpf_byte = ((char*)(&hd.ethernet.protocol))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ethernet.protocol))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 16; | |
| } | |
| ; | |
| /* packet.emit(hd.ipv4)*/ | |
| if (hd.ipv4.ebpf_valid) { | |
| if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| ebpf_errorCode = PacketTooShort; | |
| return XDP_ABORTED; | |
| } | |
| ebpf_byte = ((char*)(&hd.ipv4.version))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4); | |
| ebpf_packetOffsetInBits += 4; | |
| ebpf_byte = ((char*)(&hd.ipv4.ihl))[0]; | |
| write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4); | |
| ebpf_packetOffsetInBits += 4; | |
| ebpf_byte = ((char*)(&hd.ipv4.diffserv))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 8; | |
| hd.ipv4.totalLen = htons(hd.ipv4.totalLen); | |
| ebpf_byte = ((char*)(&hd.ipv4.totalLen))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ipv4.totalLen))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.ipv4.identification = htons(hd.ipv4.identification); | |
| ebpf_byte = ((char*)(&hd.ipv4.identification))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ipv4.identification))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 16; | |
| ebpf_byte = ((char*)(&hd.ipv4.flags))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 5); | |
| ebpf_packetOffsetInBits += 3; | |
| ebpf_byte = ((char*)(&hd.ipv4.fragOffset))[0]; | |
| write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 3, (ebpf_byte) << 3); | |
| ebpf_byte = ((char*)(&hd.ipv4.fragOffset))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 13; | |
| ebpf_byte = ((char*)(&hd.ipv4.ttl))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 8; | |
| ebpf_byte = ((char*)(&hd.ipv4.protocol))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 8; | |
| hd.ipv4.hdrChecksum = htons(hd.ipv4.hdrChecksum); | |
| ebpf_byte = ((char*)(&hd.ipv4.hdrChecksum))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ipv4.hdrChecksum))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.ipv4.srcAddr = htonl(hd.ipv4.srcAddr); | |
| ebpf_byte = ((char*)(&hd.ipv4.srcAddr))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ipv4.srcAddr))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ipv4.srcAddr))[2]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ipv4.srcAddr))[3]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 32; | |
| hd.ipv4.dstAddr = htonl(hd.ipv4.dstAddr); | |
| ebpf_byte = ((char*)(&hd.ipv4.dstAddr))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ipv4.dstAddr))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ipv4.dstAddr))[2]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.ipv4.dstAddr))[3]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 32; | |
| } | |
| ; | |
| /* packet.emit(hd.tcp)*/ | |
| if (hd.tcp.ebpf_valid) { | |
| if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| ebpf_errorCode = PacketTooShort; | |
| return XDP_ABORTED; | |
| } | |
| hd.tcp.srcPort = htons(hd.tcp.srcPort); | |
| ebpf_byte = ((char*)(&hd.tcp.srcPort))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.tcp.srcPort))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.tcp.dstPort = htons(hd.tcp.dstPort); | |
| ebpf_byte = ((char*)(&hd.tcp.dstPort))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.tcp.dstPort))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.tcp.seqNo = htonl(hd.tcp.seqNo); | |
| ebpf_byte = ((char*)(&hd.tcp.seqNo))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.tcp.seqNo))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.tcp.seqNo))[2]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.tcp.seqNo))[3]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 32; | |
| hd.tcp.ackNo = htonl(hd.tcp.ackNo); | |
| ebpf_byte = ((char*)(&hd.tcp.ackNo))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.tcp.ackNo))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.tcp.ackNo))[2]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.tcp.ackNo))[3]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 32; | |
| ebpf_byte = ((char*)(&hd.tcp.dataOffset))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4); | |
| ebpf_packetOffsetInBits += 4; | |
| ebpf_byte = ((char*)(&hd.tcp.res))[0]; | |
| write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4); | |
| ebpf_packetOffsetInBits += 4; | |
| ebpf_byte = ((char*)(&hd.tcp.flags))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 8; | |
| hd.tcp.window = htons(hd.tcp.window); | |
| ebpf_byte = ((char*)(&hd.tcp.window))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.tcp.window))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.tcp.checksum = htons(hd.tcp.checksum); | |
| ebpf_byte = ((char*)(&hd.tcp.checksum))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.tcp.checksum))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.tcp.urgentPtr = htons(hd.tcp.urgentPtr); | |
| ebpf_byte = ((char*)(&hd.tcp.urgentPtr))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.tcp.urgentPtr))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 16; | |
| } | |
| ; | |
| /* packet.emit(hd.udp)*/ | |
| if (hd.udp.ebpf_valid) { | |
| if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) { | |
| ebpf_errorCode = PacketTooShort; | |
| return XDP_ABORTED; | |
| } | |
| hd.udp.srcPort = htons(hd.udp.srcPort); | |
| ebpf_byte = ((char*)(&hd.udp.srcPort))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.udp.srcPort))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.udp.dstPort = htons(hd.udp.dstPort); | |
| ebpf_byte = ((char*)(&hd.udp.dstPort))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.udp.dstPort))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.udp.length_ = htons(hd.udp.length_); | |
| ebpf_byte = ((char*)(&hd.udp.length_))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.udp.length_))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.udp.checksum = htons(hd.udp.checksum); | |
| ebpf_byte = ((char*)(&hd.udp.checksum))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.udp.checksum))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 16; | |
| } | |
| ; | |
| /* packet.emit(hd.icmp)*/ | |
| if (hd.icmp.ebpf_valid) { | |
| if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) { | |
| ebpf_errorCode = PacketTooShort; | |
| return XDP_ABORTED; | |
| } | |
| hd.icmp.typeCode = htons(hd.icmp.typeCode); | |
| ebpf_byte = ((char*)(&hd.icmp.typeCode))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.icmp.typeCode))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 16; | |
| hd.icmp.hdrChecksum = htons(hd.icmp.hdrChecksum); | |
| ebpf_byte = ((char*)(&hd.icmp.hdrChecksum))[0]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| ebpf_byte = ((char*)(&hd.icmp.hdrChecksum))[1]; | |
| write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| ebpf_packetOffsetInBits += 16; | |
| } | |
| ; | |
| } | |
| } | |
| ebpf_end: | |
| bpf_map_update_elem(&ebpf_outTable, &ebpf_zero, &xout.output_port, BPF_ANY); | |
| return xout.output_action; | |
| } | |
| char _license[] SEC("license") = "GPL"; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* Automatically generated by p4c-xdp from xdp9.p4 on Fri Apr 14 11:14:09 2017 | |
| */ | |
| #ifndef _P4_GEN_HEADER_ | |
| #define _P4_GEN_HEADER_ | |
| #define KBUILD_MODNAME "xdptest" | |
| #include <linux/bpf.h> | |
| #include "bpf_helpers.h" | |
| #define load_byte(data, b) (*(((u8*)(data)) + (b))) | |
| #define load_half(data, b) __constant_ntohs(*(u16 *)((u8*)(data) + (b))) | |
| #define load_word(data, b) __constant_ntohl(*(u32 *)((u8*)(data) + (b))) | |
| #define htonl(d) __constant_htonl(d) | |
| #define htons(d) __constant_htons(d) | |
| #define MAP_PATH "/sys/fs/bpf/xdp/globals" | |
| struct xdp_input { | |
| u32 input_port; /* bit<32> */ | |
| }; | |
| struct xdp_output { | |
| enum xdp_action output_action; /* xdp_action */ | |
| u32 output_port; /* bit<32> */ | |
| }; | |
| struct Ethernet { | |
| u8 destination[6]; /* bit<48> */ | |
| u8 source[6]; /* bit<48> */ | |
| u16 protocol; /* bit<16> */ | |
| u8 ebpf_valid; | |
| }; | |
| struct IPv4 { | |
| u8 version; /* bit<4> */ | |
| u8 ihl; /* bit<4> */ | |
| u8 diffserv; /* bit<8> */ | |
| u16 totalLen; /* bit<16> */ | |
| u16 identification; /* bit<16> */ | |
| u8 flags; /* bit<3> */ | |
| u16 fragOffset; /* bit<13> */ | |
| u8 ttl; /* bit<8> */ | |
| u8 protocol; /* bit<8> */ | |
| u16 hdrChecksum; /* bit<16> */ | |
| u32 srcAddr; /* bit<32> */ | |
| u32 dstAddr; /* bit<32> */ | |
| u8 ebpf_valid; | |
| }; | |
| struct icmp_t { | |
| u16 typeCode; /* bit<16> */ | |
| u16 hdrChecksum; /* bit<16> */ | |
| u8 ebpf_valid; | |
| }; | |
| struct tcp_t { | |
| u16 srcPort; /* bit<16> */ | |
| u16 dstPort; /* bit<16> */ | |
| u32 seqNo; /* bit<32> */ | |
| u32 ackNo; /* bit<32> */ | |
| u8 dataOffset; /* bit<4> */ | |
| u8 res; /* bit<4> */ | |
| u8 flags; /* bit<8> */ | |
| u16 window; /* bit<16> */ | |
| u16 checksum; /* bit<16> */ | |
| u16 urgentPtr; /* bit<16> */ | |
| u8 ebpf_valid; | |
| }; | |
| struct udp_t { | |
| u16 srcPort; /* bit<16> */ | |
| u16 dstPort; /* bit<16> */ | |
| u16 length_; /* bit<16> */ | |
| u16 checksum; /* bit<16> */ | |
| u8 ebpf_valid; | |
| }; | |
| struct Headers { | |
| struct Ethernet ethernet; /* Ethernet */ | |
| struct IPv4 ipv4; /* IPv4 */ | |
| struct tcp_t tcp; /* tcp_t */ | |
| struct udp_t udp; /* udp_t */ | |
| struct icmp_t icmp; /* icmp_t */ | |
| }; | |
| struct dstmactable_key { | |
| u16 field0; /* hd.ethernet.protocol */ | |
| }; | |
| enum dstmactable_actions { | |
| Fallback_action, | |
| Drop_action, | |
| }; | |
| struct dstmactable_value { | |
| enum dstmactable_actions action; | |
| union { | |
| struct { | |
| } Fallback_action; | |
| struct { | |
| } Drop_action; | |
| } u; | |
| }; | |
| #if CONTROL_PLANE | |
| void initialize_tables() | |
| { | |
| u32 ebpf_zero = 0; | |
| { | |
| int tableFileDescriptor = bpf_obj_get(MAP_PATH "/dstmactable_defaultAction"); | |
| if (tableFileDescriptor < 0) { fprintf(stderr, "map dstmactable_defaultAction not loaded"); exit(1); } | |
| struct dstmactable_value value = { | |
| .action = Fallback_action, | |
| }; | |
| int ok = bpf_update_elem(tableFileDescriptor, &ebpf_zero, &value, BPF_ANY); | |
| if (ok != 0) { perror("Could not write in dstmactable_defaultAction"); exit(1); } | |
| } | |
| } | |
| #endif | |
| #endif |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| xdp9.o: file format ELF64-BPF | |
| Disassembly of section prog: | |
| ebpf_filter: | |
| ; int ebpf_filter(struct xdp_md* skb){ | |
| 0: r6 = r1 | |
| ; void* ebpf_packetEnd = ((void*)(long)skb->data_end); | |
| 1: r3 = *(u32 *)(r6 + 4) | |
| ; void* ebpf_packetStart = ((void*)(long)skb->data); | |
| 2: r2 = *(u32 *)(r6 + 0) | |
| 3: r8 = 0 | |
| ; u32 ebpf_zero = 0; | |
| 4: *(u32 *)(r10 - 4) = r8 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) { | |
| 5: r1 = r2 | |
| 6: r1 += 14 | |
| 7: if r1 > r3 goto 1048 | |
| 8: r1 = 14 | |
| 9: *(u64 *)(r10 - 72) = r1 | |
| 10: r8 = 0 | |
| ; hd.ethernet.source[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0)); | |
| 11: r1 = *(u8 *)(r2 + 11) | |
| ; hd.ethernet.source[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0)); | |
| 12: *(u64 *)(r10 - 480) = r1 | |
| 13: r1 = *(u8 *)(r2 + 10) | |
| ; hd.ethernet.source[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0)); | |
| 14: *(u64 *)(r10 - 488) = r1 | |
| 15: r1 = *(u8 *)(r2 + 9) | |
| ; hd.ethernet.source[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0)); | |
| 16: *(u64 *)(r10 - 496) = r1 | |
| 17: r1 = *(u8 *)(r2 + 8) | |
| ; hd.ethernet.source[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0)); | |
| 18: *(u64 *)(r10 - 504) = r1 | |
| 19: r1 = *(u8 *)(r2 + 7) | |
| ; hd.ethernet.source[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0)); | |
| 20: *(u64 *)(r10 - 512) = r1 | |
| 21: r1 = *(u8 *)(r2 + 6) | |
| ; hd.ethernet.destination[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0)); | |
| 22: *(u64 *)(r10 - 520) = r1 | |
| 23: r1 = *(u8 *)(r2 + 5) | |
| ; hd.ethernet.destination[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0)); | |
| 24: *(u64 *)(r10 - 536) = r1 | |
| 25: r1 = *(u8 *)(r2 + 4) | |
| ; hd.ethernet.destination[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0)); | |
| 26: *(u64 *)(r10 - 544) = r1 | |
| 27: r1 = *(u8 *)(r2 + 3) | |
| ; hd.ethernet.destination[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0)); | |
| 28: *(u64 *)(r10 - 552) = r1 | |
| 29: r1 = *(u8 *)(r2 + 2) | |
| ; hd.ethernet.destination[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0)); | |
| 30: *(u64 *)(r10 - 560) = r1 | |
| 31: r1 = *(u8 *)(r2 + 1) | |
| ; hd.ethernet.destination[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0)); | |
| 32: *(u64 *)(r10 - 568) = r1 | |
| 33: r1 = *(u8 *)(r2 + 0) | |
| ; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 34: *(u64 *)(r10 - 576) = r1 | |
| 35: r1 = *(u16 *)(r2 + 12) | |
| 36: r4 = r1 | |
| 37: r4 >>= 8 | |
| 38: *(u64 *)(r10 - 528) = r1 | |
| ; switch (hd.ethernet.protocol) { | |
| 39: r1 <<= 8 | |
| 40: *(u64 *)(r10 - 584) = r4 | |
| 41: r1 |= r4 | |
| 42: r4 = r1 | |
| 43: r4 &= 65535 | |
| 44: r5 = 0 | |
| 45: *(u64 *)(r10 - 88) = r5 | |
| 46: r5 = 0 | |
| 47: *(u64 *)(r10 - 96) = r5 | |
| 48: r0 = 0 | |
| 49: r5 = 0 | |
| 50: r7 = 0 | |
| 51: *(u64 *)(r10 - 80) = r7 | |
| 52: r7 = 0 | |
| 53: *(u64 *)(r10 - 216) = r7 | |
| 54: r7 = 0 | |
| 55: *(u64 *)(r10 - 352) = r7 | |
| 56: r7 = 0 | |
| 57: *(u64 *)(r10 - 336) = r7 | |
| 58: r7 = 0 | |
| 59: *(u64 *)(r10 - 344) = r7 | |
| 60: r7 = 0 | |
| 61: *(u64 *)(r10 - 304) = r7 | |
| 62: r7 = 0 | |
| 63: *(u64 *)(r10 - 312) = r7 | |
| 64: r7 = 0 | |
| 65: *(u64 *)(r10 - 320) = r7 | |
| 66: r7 = 0 | |
| 67: *(u64 *)(r10 - 328) = r7 | |
| 68: r7 = 0 | |
| 69: *(u64 *)(r10 - 272) = r7 | |
| 70: r7 = 0 | |
| 71: *(u64 *)(r10 - 280) = r7 | |
| 72: r7 = 0 | |
| 73: *(u64 *)(r10 - 288) = r7 | |
| 74: r7 = 0 | |
| 75: *(u64 *)(r10 - 296) = r7 | |
| 76: r7 = 0 | |
| 77: *(u64 *)(r10 - 256) = r7 | |
| 78: r7 = 0 | |
| 79: *(u64 *)(r10 - 264) = r7 | |
| 80: r7 = 0 | |
| 81: *(u64 *)(r10 - 240) = r7 | |
| 82: r7 = 0 | |
| 83: *(u64 *)(r10 - 248) = r7 | |
| 84: r7 = 0 | |
| 85: *(u64 *)(r10 - 224) = r7 | |
| 86: r7 = 0 | |
| 87: *(u64 *)(r10 - 232) = r7 | |
| 88: r7 = 0 | |
| 89: *(u64 *)(r10 - 384) = r7 | |
| 90: r7 = 0 | |
| 91: *(u64 *)(r10 - 440) = r7 | |
| 92: r7 = 0 | |
| 93: *(u64 *)(r10 - 424) = r7 | |
| 94: r7 = 0 | |
| 95: *(u64 *)(r10 - 432) = r7 | |
| 96: r7 = 0 | |
| 97: *(u64 *)(r10 - 408) = r7 | |
| 98: r7 = 0 | |
| 99: *(u64 *)(r10 - 416) = r7 | |
| 100: r7 = 0 | |
| 101: *(u64 *)(r10 - 392) = r7 | |
| 102: r7 = 0 | |
| 103: *(u64 *)(r10 - 400) = r7 | |
| 104: r7 = 0 | |
| 105: *(u64 *)(r10 - 464) = r7 | |
| 106: r7 = 0 | |
| 107: *(u64 *)(r10 - 472) = r7 | |
| 108: r7 = 0 | |
| 109: *(u64 *)(r10 - 448) = r7 | |
| 110: r7 = 0 | |
| 111: *(u64 *)(r10 - 456) = r7 | |
| 112: r7 = 0 | |
| 113: *(u64 *)(r10 - 104) = r7 | |
| 114: r7 = 0 | |
| 115: *(u64 *)(r10 - 64) = r7 | |
| 116: r7 = 0 | |
| 117: *(u64 *)(r10 - 144) = r7 | |
| 118: r7 = 0 | |
| 119: *(u64 *)(r10 - 56) = r7 | |
| 120: r7 = 0 | |
| 121: r9 = 0 | |
| 122: *(u64 *)(r10 - 48) = r9 | |
| 123: r9 = 0 | |
| 124: *(u64 *)(r10 - 208) = r9 | |
| 125: r9 = 0 | |
| 126: *(u64 *)(r10 - 360) = r9 | |
| 127: r9 = 0 | |
| 128: *(u64 *)(r10 - 368) = r9 | |
| 129: r9 = 0 | |
| 130: *(u64 *)(r10 - 376) = r9 | |
| 131: r9 = 0 | |
| 132: *(u64 *)(r10 - 40) = r9 | |
| 133: r9 = 0 | |
| 134: *(u64 *)(r10 - 32) = r9 | |
| 135: r9 = 0 | |
| 136: *(u64 *)(r10 - 200) = r9 | |
| 137: r9 = 0 | |
| 138: *(u64 *)(r10 - 120) = r9 | |
| 139: r9 = 0 | |
| 140: *(u64 *)(r10 - 136) = r9 | |
| 141: r9 = 0 | |
| 142: *(u64 *)(r10 - 128) = r9 | |
| 143: r9 = 0 | |
| 144: *(u64 *)(r10 - 112) = r9 | |
| 145: r9 = 0 | |
| 146: *(u64 *)(r10 - 192) = r9 | |
| 147: r9 = 0 | |
| 148: *(u64 *)(r10 - 184) = r9 | |
| 149: r9 = 0 | |
| 150: *(u64 *)(r10 - 160) = r9 | |
| 151: r9 = 0 | |
| 152: *(u64 *)(r10 - 152) = r9 | |
| 153: r9 = 0 | |
| 154: *(u64 *)(r10 - 176) = r9 | |
| 155: r9 = 0 | |
| 156: *(u64 *)(r10 - 168) = r9 | |
| 157: if r4 != 2048 goto 439 | |
| 158: r8 = 0 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| 159: r4 = r2 | |
| 160: r4 += 34 | |
| 161: if r4 > r3 goto 894 | |
| ; hd.ipv4.ttl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 162: r4 = *(u8 *)(r2 + 22) | |
| ; hd.ipv4.diffserv = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 163: *(u64 *)(r10 - 200) = r4 | |
| 164: r4 = *(u8 *)(r2 + 15) | |
| ; hd.ipv4.dstAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 165: *(u64 *)(r10 - 112) = r4 | |
| 166: r5 = *(u32 *)(r2 + 30) | |
| 167: r0 = r5 | |
| 168: bswap16 r0 | |
| 169: r4 = r5 | |
| 170: bswap32 r4 | |
| 171: *(u64 *)(r10 - 80) = r4 | |
| ; hd.ipv4.srcAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 172: r8 = *(u32 *)(r2 + 26) | |
| 173: r4 = r8 | |
| 174: bswap16 r4 | |
| 175: *(u64 *)(r10 - 104) = r4 | |
| 176: r4 = r8 | |
| 177: bswap32 r4 | |
| 178: *(u64 *)(r10 - 88) = r4 | |
| ; hd.ipv4.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 179: r7 = *(u16 *)(r2 + 24) | |
| 180: *(u64 *)(r10 - 208) = r7 | |
| 181: r7 >>= 8 | |
| ; hd.ipv4.fragOffset = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u16, 13)); | |
| 182: r4 = *(u16 *)(r2 + 20) | |
| 183: r9 = r4 | |
| 184: r9 &= 31 | |
| 185: *(u64 *)(r10 - 128) = r9 | |
| 186: r4 >>= 8 | |
| 187: *(u64 *)(r10 - 120) = r4 | |
| ; hd.ipv4.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 5) & EBPF_MASK(u8, 3)); | |
| 188: r4 = *(u8 *)(r2 + 20) | |
| 189: r4 >>= 5 | |
| 190: *(u64 *)(r10 - 136) = r4 | |
| ; hd.ipv4.identification = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 191: r9 = *(u16 *)(r2 + 18) | |
| 192: *(u64 *)(r10 - 152) = r9 | |
| 193: r9 >>= 8 | |
| 194: *(u64 *)(r10 - 160) = r9 | |
| ; hd.ipv4.totalLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 195: r9 = *(u16 *)(r2 + 16) | |
| 196: *(u64 *)(r10 - 168) = r9 | |
| 197: r9 >>= 8 | |
| 198: *(u64 *)(r10 - 176) = r9 | |
| ; hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
| 199: r4 = *(u8 *)(r2 + 14) | |
| ; hd.ipv4.ihl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4)); | |
| 200: r9 = r4 | |
| 201: r9 &= 15 | |
| 202: *(u64 *)(r10 - 192) = r9 | |
| ; hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
| 203: r4 >>= 4 | |
| 204: *(u64 *)(r10 - 184) = r4 | |
| ; hd.ipv4.dstAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 205: bswap64 r5 | |
| 206: r4 = r5 | |
| 207: r4 >>= 56 | |
| 208: *(u64 *)(r10 - 96) = r4 | |
| 209: r5 >>= 40 | |
| ; hd.ipv4.srcAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 210: bswap64 r8 | |
| 211: r4 = r8 | |
| 212: r4 >>= 56 | |
| 213: *(u64 *)(r10 - 144) = r4 | |
| 214: r8 >>= 40 | |
| ; hd.ipv4.protocol = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 215: r9 = *(u8 *)(r2 + 23) | |
| ; switch (hd.ipv4.protocol) { | |
| 216: if r9 == 17 goto 171 | |
| 217: if r9 == 6 goto 270 | |
| 218: r4 = 34 | |
| 219: *(u64 *)(r10 - 72) = r4 | |
| 220: r4 = 1 | |
| 221: *(u64 *)(r10 - 40) = r4 | |
| 222: r4 = 0 | |
| 223: *(u64 *)(r10 - 216) = r4 | |
| 224: r4 = 0 | |
| 225: *(u64 *)(r10 - 352) = r4 | |
| 226: r4 = 0 | |
| 227: *(u64 *)(r10 - 336) = r4 | |
| 228: r4 = 0 | |
| 229: *(u64 *)(r10 - 344) = r4 | |
| 230: r4 = 0 | |
| 231: *(u64 *)(r10 - 304) = r4 | |
| 232: r4 = 0 | |
| 233: *(u64 *)(r10 - 312) = r4 | |
| 234: r4 = 0 | |
| 235: *(u64 *)(r10 - 320) = r4 | |
| 236: r4 = 0 | |
| 237: *(u64 *)(r10 - 328) = r4 | |
| 238: r4 = 0 | |
| 239: *(u64 *)(r10 - 272) = r4 | |
| 240: r4 = 0 | |
| 241: *(u64 *)(r10 - 280) = r4 | |
| 242: r4 = 0 | |
| 243: *(u64 *)(r10 - 288) = r4 | |
| 244: r4 = 0 | |
| 245: *(u64 *)(r10 - 296) = r4 | |
| 246: r4 = 0 | |
| 247: *(u64 *)(r10 - 256) = r4 | |
| 248: r4 = 0 | |
| 249: *(u64 *)(r10 - 264) = r4 | |
| 250: r4 = 0 | |
| 251: *(u64 *)(r10 - 240) = r4 | |
| 252: r4 = 0 | |
| 253: *(u64 *)(r10 - 248) = r4 | |
| 254: r4 = 0 | |
| 255: *(u64 *)(r10 - 224) = r4 | |
| 256: r4 = 0 | |
| 257: *(u64 *)(r10 - 232) = r4 | |
| 258: r4 = 0 | |
| 259: *(u64 *)(r10 - 384) = r4 | |
| 260: r4 = 0 | |
| 261: *(u64 *)(r10 - 440) = r4 | |
| 262: r4 = 0 | |
| 263: *(u64 *)(r10 - 424) = r4 | |
| 264: r4 = 0 | |
| 265: *(u64 *)(r10 - 432) = r4 | |
| 266: r4 = 0 | |
| 267: *(u64 *)(r10 - 408) = r4 | |
| 268: r4 = 0 | |
| 269: *(u64 *)(r10 - 416) = r4 | |
| 270: r4 = 0 | |
| 271: *(u64 *)(r10 - 392) = r4 | |
| 272: r4 = 0 | |
| 273: *(u64 *)(r10 - 400) = r4 | |
| 274: r4 = 0 | |
| 275: *(u64 *)(r10 - 464) = r4 | |
| 276: r4 = 0 | |
| 277: *(u64 *)(r10 - 472) = r4 | |
| 278: r4 = 0 | |
| 279: *(u64 *)(r10 - 448) = r4 | |
| 280: r4 = 0 | |
| 281: *(u64 *)(r10 - 456) = r4 | |
| 282: r4 = 0 | |
| 283: *(u64 *)(r10 - 64) = r4 | |
| 284: r4 = 0 | |
| 285: *(u64 *)(r10 - 56) = r4 | |
| 286: r4 = 0 | |
| 287: *(u64 *)(r10 - 48) = r4 | |
| 288: r4 = 0 | |
| 289: *(u64 *)(r10 - 360) = r4 | |
| 290: r4 = 0 | |
| 291: *(u64 *)(r10 - 368) = r4 | |
| 292: r4 = 0 | |
| 293: *(u64 *)(r10 - 376) = r4 | |
| 294: *(u64 *)(r10 - 32) = r9 | |
| 295: if r9 != 1 goto 301 | |
| 296: *(u64 *)(r10 - 592) = r0 | |
| 297: r0 = r5 | |
| 298: r5 = r8 | |
| 299: r8 = 0 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) { | |
| 300: r4 = r2 | |
| 301: r4 += 38 | |
| 302: if r4 > r3 goto 753 | |
| 303: r3 = 38 | |
| 304: *(u64 *)(r10 - 72) = r3 | |
| 305: r3 = 1 | |
| 306: *(u64 *)(r10 - 64) = r3 | |
| 307: r3 = 0 | |
| ; hd.icmp.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 308: *(u64 *)(r10 - 216) = r3 | |
| 309: r3 = *(u16 *)(r2 + 36) | |
| 310: r4 = r3 | |
| 311: r4 >>= 8 | |
| 312: *(u64 *)(r10 - 456) = r4 | |
| ; hd.icmp.typeCode = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 313: r2 = *(u16 *)(r2 + 34) | |
| 314: r4 = r2 | |
| 315: r4 >>= 8 | |
| 316: *(u64 *)(r10 - 472) = r4 | |
| ; hd.icmp.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 317: r3 <<= 8 | |
| 318: r3 &= 65280 | |
| 319: *(u64 *)(r10 - 448) = r3 | |
| ; hd.icmp.typeCode = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 320: r2 <<= 8 | |
| 321: r2 &= 65280 | |
| 322: *(u64 *)(r10 - 464) = r2 | |
| 323: r2 = 0 | |
| 324: *(u64 *)(r10 - 352) = r2 | |
| 325: r2 = 0 | |
| 326: *(u64 *)(r10 - 336) = r2 | |
| 327: r2 = 0 | |
| 328: *(u64 *)(r10 - 344) = r2 | |
| 329: r2 = 0 | |
| 330: *(u64 *)(r10 - 304) = r2 | |
| 331: r2 = 0 | |
| 332: *(u64 *)(r10 - 312) = r2 | |
| 333: r2 = 0 | |
| 334: *(u64 *)(r10 - 320) = r2 | |
| 335: r2 = 0 | |
| 336: *(u64 *)(r10 - 328) = r2 | |
| 337: r2 = 0 | |
| 338: *(u64 *)(r10 - 272) = r2 | |
| 339: r2 = 0 | |
| 340: *(u64 *)(r10 - 280) = r2 | |
| 341: r2 = 0 | |
| 342: *(u64 *)(r10 - 288) = r2 | |
| 343: r2 = 0 | |
| 344: *(u64 *)(r10 - 296) = r2 | |
| 345: r2 = 0 | |
| 346: *(u64 *)(r10 - 256) = r2 | |
| 347: r2 = 0 | |
| 348: *(u64 *)(r10 - 264) = r2 | |
| 349: r2 = 0 | |
| 350: *(u64 *)(r10 - 240) = r2 | |
| 351: r2 = 0 | |
| 352: *(u64 *)(r10 - 248) = r2 | |
| 353: r2 = 0 | |
| 354: *(u64 *)(r10 - 224) = r2 | |
| 355: r2 = 0 | |
| 356: *(u64 *)(r10 - 232) = r2 | |
| 357: r2 = 0 | |
| 358: *(u64 *)(r10 - 384) = r2 | |
| 359: r2 = 0 | |
| 360: *(u64 *)(r10 - 440) = r2 | |
| 361: r2 = 0 | |
| 362: *(u64 *)(r10 - 424) = r2 | |
| 363: r2 = 0 | |
| 364: *(u64 *)(r10 - 432) = r2 | |
| 365: r2 = 0 | |
| 366: *(u64 *)(r10 - 408) = r2 | |
| 367: r2 = 0 | |
| 368: *(u64 *)(r10 - 416) = r2 | |
| 369: r2 = 0 | |
| 370: *(u64 *)(r10 - 392) = r2 | |
| 371: r2 = 0 | |
| 372: *(u64 *)(r10 - 400) = r2 | |
| 373: r2 = 0 | |
| 374: *(u64 *)(r10 - 56) = r2 | |
| 375: r2 = 0 | |
| 376: *(u64 *)(r10 - 48) = r2 | |
| 377: r2 = 0 | |
| 378: *(u64 *)(r10 - 360) = r2 | |
| 379: r2 = 0 | |
| 380: *(u64 *)(r10 - 368) = r2 | |
| 381: r2 = 0 | |
| 382: *(u64 *)(r10 - 376) = r2 | |
| 383: r2 = 1 | |
| 384: *(u64 *)(r10 - 40) = r2 | |
| 385: r2 = 1 | |
| 386: *(u64 *)(r10 - 32) = r2 | |
| 387: goto 97 | |
| LBB0_10: | |
| 388: *(u64 *)(r10 - 592) = r0 | |
| 389: r0 = r5 | |
| 390: r5 = r8 | |
| 391: r8 = 0 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) { | |
| 392: r4 = r2 | |
| 393: r4 += 42 | |
| 394: if r4 > r3 goto 661 | |
| 395: r3 = 42 | |
| 396: *(u64 *)(r10 - 72) = r3 | |
| 397: r3 = 17 | |
| 398: *(u64 *)(r10 - 32) = r3 | |
| 399: r3 = 1 | |
| 400: *(u64 *)(r10 - 56) = r3 | |
| 401: r3 = 0 | |
| ; hd.udp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 402: *(u64 *)(r10 - 216) = r3 | |
| 403: r3 = *(u16 *)(r2 + 40) | |
| 404: r4 = r3 | |
| 405: r4 >>= 8 | |
| 406: *(u64 *)(r10 - 400) = r4 | |
| ; hd.udp.length_ = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 407: r4 = *(u16 *)(r2 + 38) | |
| 408: r8 = r4 | |
| 409: r8 >>= 8 | |
| 410: *(u64 *)(r10 - 416) = r8 | |
| ; hd.udp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 411: r8 = *(u16 *)(r2 + 36) | |
| 412: r9 = r8 | |
| 413: r9 >>= 8 | |
| 414: *(u64 *)(r10 - 432) = r9 | |
| ; hd.udp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 415: r2 = *(u16 *)(r2 + 34) | |
| 416: r9 = r2 | |
| 417: r9 >>= 8 | |
| 418: *(u64 *)(r10 - 440) = r9 | |
| ; hd.udp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 419: r3 <<= 8 | |
| 420: r3 &= 65280 | |
| 421: *(u64 *)(r10 - 392) = r3 | |
| ; hd.udp.length_ = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 422: r4 <<= 8 | |
| 423: r4 &= 65280 | |
| 424: *(u64 *)(r10 - 408) = r4 | |
| ; hd.udp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 425: r8 <<= 8 | |
| 426: r8 &= 65280 | |
| 427: *(u64 *)(r10 - 424) = r8 | |
| ; hd.udp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 428: r2 <<= 8 | |
| 429: r2 &= 65280 | |
| 430: *(u64 *)(r10 - 384) = r2 | |
| 431: r2 = 0 | |
| 432: *(u64 *)(r10 - 352) = r2 | |
| 433: r2 = 0 | |
| 434: *(u64 *)(r10 - 336) = r2 | |
| 435: r2 = 0 | |
| 436: *(u64 *)(r10 - 344) = r2 | |
| 437: r2 = 0 | |
| 438: *(u64 *)(r10 - 304) = r2 | |
| 439: r2 = 0 | |
| 440: *(u64 *)(r10 - 312) = r2 | |
| 441: r2 = 0 | |
| 442: *(u64 *)(r10 - 320) = r2 | |
| 443: r2 = 0 | |
| 444: *(u64 *)(r10 - 328) = r2 | |
| 445: r2 = 0 | |
| 446: *(u64 *)(r10 - 272) = r2 | |
| 447: r2 = 0 | |
| 448: *(u64 *)(r10 - 280) = r2 | |
| 449: r2 = 0 | |
| 450: *(u64 *)(r10 - 288) = r2 | |
| 451: r2 = 0 | |
| 452: *(u64 *)(r10 - 296) = r2 | |
| 453: r2 = 0 | |
| 454: *(u64 *)(r10 - 256) = r2 | |
| 455: r2 = 0 | |
| 456: *(u64 *)(r10 - 264) = r2 | |
| 457: r2 = 0 | |
| 458: *(u64 *)(r10 - 240) = r2 | |
| 459: r2 = 0 | |
| 460: *(u64 *)(r10 - 248) = r2 | |
| 461: r2 = 0 | |
| 462: *(u64 *)(r10 - 224) = r2 | |
| 463: r2 = 0 | |
| 464: *(u64 *)(r10 - 232) = r2 | |
| 465: r2 = 0 | |
| 466: *(u64 *)(r10 - 464) = r2 | |
| 467: r2 = 0 | |
| 468: *(u64 *)(r10 - 472) = r2 | |
| 469: r2 = 0 | |
| 470: *(u64 *)(r10 - 448) = r2 | |
| 471: r2 = 0 | |
| 472: *(u64 *)(r10 - 456) = r2 | |
| 473: r2 = 0 | |
| 474: *(u64 *)(r10 - 64) = r2 | |
| 475: r2 = 0 | |
| 476: *(u64 *)(r10 - 48) = r2 | |
| 477: r2 = 0 | |
| 478: *(u64 *)(r10 - 360) = r2 | |
| 479: r2 = 0 | |
| 480: *(u64 *)(r10 - 368) = r2 | |
| 481: r2 = 0 | |
| 482: *(u64 *)(r10 - 376) = r2 | |
| 483: r2 = 1 | |
| 484: *(u64 *)(r10 - 40) = r2 | |
| LBB0_12: | |
| 485: r8 = r5 | |
| 486: r5 = r0 | |
| 487: goto 108 | |
| LBB0_8: | |
| 488: *(u64 *)(r10 - 592) = r0 | |
| 489: *(u64 *)(r10 - 600) = r5 | |
| 490: r5 = r8 | |
| 491: r8 = 0 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| 492: r4 = r2 | |
| 493: r4 += 54 | |
| 494: if r4 > r3 goto 561 | |
| 495: r3 = 54 | |
| 496: *(u64 *)(r10 - 72) = r3 | |
| 497: r3 = 6 | |
| 498: *(u64 *)(r10 - 32) = r3 | |
| 499: r3 = 1 | |
| 500: *(u64 *)(r10 - 48) = r3 | |
| 501: r3 = 0 | |
| ; hd.tcp.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 502: *(u64 *)(r10 - 384) = r3 | |
| 503: r3 = *(u8 *)(r2 + 47) | |
| ; hd.tcp.ackNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 504: *(u64 *)(r10 - 360) = r3 | |
| 505: r3 = *(u32 *)(r2 + 42) | |
| 506: r4 = r3 | |
| 507: r4 >>= 24 | |
| 508: *(u64 *)(r10 - 296) = r4 | |
| 509: r4 = r3 | |
| 510: r4 >>= 16 | |
| 511: *(u64 *)(r10 - 288) = r4 | |
| 512: *(u64 *)(r10 - 272) = r3 | |
| ; goto accept; | |
| 513: r3 >>= 8 | |
| 514: *(u64 *)(r10 - 280) = r3 | |
| ; hd.tcp.seqNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 515: r3 = *(u32 *)(r2 + 38) | |
| 516: r4 = r3 | |
| 517: r4 >>= 24 | |
| 518: *(u64 *)(r10 - 328) = r4 | |
| 519: r4 = r3 | |
| 520: r4 >>= 16 | |
| 521: *(u64 *)(r10 - 320) = r4 | |
| 522: *(u64 *)(r10 - 304) = r3 | |
| ; goto accept; | |
| 523: r3 >>= 8 | |
| 524: *(u64 *)(r10 - 312) = r3 | |
| ; hd.tcp.dataOffset = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
| 525: r0 = *(u8 *)(r2 + 46) | |
| ; goto accept; | |
| 526: r3 = r0 | |
| 527: r3 &= 240 | |
| 528: *(u64 *)(r10 - 376) = r3 | |
| ; hd.tcp.urgentPtr = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 529: r3 = *(u16 *)(r2 + 52) | |
| 530: r4 = r3 | |
| 531: r4 >>= 8 | |
| 532: *(u64 *)(r10 - 232) = r4 | |
| ; hd.tcp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 533: r4 = *(u16 *)(r2 + 50) | |
| 534: r8 = r4 | |
| 535: r8 >>= 8 | |
| 536: *(u64 *)(r10 - 248) = r8 | |
| ; hd.tcp.window = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 537: r8 = *(u16 *)(r2 + 48) | |
| 538: r9 = r8 | |
| 539: r9 >>= 8 | |
| 540: *(u64 *)(r10 - 264) = r9 | |
| ; hd.tcp.res = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4)); | |
| 541: r0 &= 15 | |
| 542: *(u64 *)(r10 - 368) = r0 | |
| ; hd.tcp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 543: r0 = *(u16 *)(r2 + 36) | |
| 544: r9 = r0 | |
| 545: r9 >>= 8 | |
| 546: *(u64 *)(r10 - 344) = r9 | |
| ; hd.tcp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 547: r2 = *(u16 *)(r2 + 34) | |
| 548: r9 = r2 | |
| 549: r9 >>= 8 | |
| 550: *(u64 *)(r10 - 352) = r9 | |
| ; hd.tcp.urgentPtr = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 551: r3 <<= 8 | |
| 552: r3 &= 65280 | |
| 553: *(u64 *)(r10 - 224) = r3 | |
| ; hd.tcp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 554: r4 <<= 8 | |
| 555: r4 &= 65280 | |
| 556: *(u64 *)(r10 - 240) = r4 | |
| ; hd.tcp.window = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 557: r8 <<= 8 | |
| 558: r8 &= 65280 | |
| 559: *(u64 *)(r10 - 256) = r8 | |
| ; hd.tcp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 560: r0 <<= 8 | |
| 561: r0 &= 65280 | |
| 562: *(u64 *)(r10 - 336) = r0 | |
| ; hd.tcp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
| 563: r2 <<= 8 | |
| 564: r2 &= 65280 | |
| 565: *(u64 *)(r10 - 216) = r2 | |
| 566: r2 = 0 | |
| 567: *(u64 *)(r10 - 440) = r2 | |
| 568: r2 = 0 | |
| 569: *(u64 *)(r10 - 424) = r2 | |
| 570: r2 = 0 | |
| 571: *(u64 *)(r10 - 432) = r2 | |
| 572: r2 = 0 | |
| 573: *(u64 *)(r10 - 408) = r2 | |
| 574: r2 = 0 | |
| 575: *(u64 *)(r10 - 416) = r2 | |
| 576: r2 = 0 | |
| 577: *(u64 *)(r10 - 392) = r2 | |
| 578: r2 = 0 | |
| 579: *(u64 *)(r10 - 400) = r2 | |
| 580: r2 = 0 | |
| 581: *(u64 *)(r10 - 464) = r2 | |
| 582: r2 = 0 | |
| 583: *(u64 *)(r10 - 472) = r2 | |
| 584: r2 = 0 | |
| 585: *(u64 *)(r10 - 448) = r2 | |
| 586: r2 = 0 | |
| 587: *(u64 *)(r10 - 456) = r2 | |
| 588: r2 = 0 | |
| 589: *(u64 *)(r10 - 64) = r2 | |
| 590: r2 = 0 | |
| 591: *(u64 *)(r10 - 56) = r2 | |
| 592: r2 = 1 | |
| 593: *(u64 *)(r10 - 40) = r2 | |
| 594: r8 = r5 | |
| 595: r5 = *(u64 *)(r10 - 600) | |
| LBB0_13: | |
| 596: r0 = *(u64 *)(r10 - 592) | |
| LBB0_14: | |
| 597: *(u64 *)(r10 - 592) = r0 | |
| 598: *(u64 *)(r10 - 600) = r5 | |
| ; key.field0 = hd.ethernet.protocol; | |
| 599: *(u16 *)(r10 - 24) = r1 | |
| 600: r2 = r10 | |
| 601: r2 += -24 | |
| ; value = bpf_map_lookup_elem(&dstmactable, &key); | |
| 602: r1 = 0ll | |
| 604: call 1 | |
| 605: r9 = *(u64 *)(r10 - 32) | |
| ; if (value == NULL) { | |
| 606: if r0 != 0 goto 6 | |
| 607: r2 = r10 | |
| ; u8 hit; | |
| 608: r2 += -4 | |
| ; value = bpf_map_lookup_elem(&dstmactable_defaultAction, &ebpf_zero); | |
| 609: r1 = 0ll | |
| 611: call 1 | |
| ; if (value != NULL) { | |
| 612: if r0 == 0 goto 442 | |
| LBB0_16: | |
| 613: r1 = 1 | |
| ; switch (value->action) { | |
| 614: r2 = *(u32 *)(r0 + 0) | |
| 615: if r2 == 1 goto 85 | |
| 616: if r2 != 0 goto 438 | |
| ; tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr); | |
| 617: r1 = *(u64 *)(r10 - 96) | |
| 618: r1 <<= 24 | |
| 619: r2 = *(u64 *)(r10 - 592) | |
| 620: r2 &= 255 | |
| 621: r2 <<= 16 | |
| 622: r2 |= r1 | |
| 623: r3 = *(u64 *)(r10 - 600) | |
| 624: r3 &= 255 | |
| 625: r3 <<= 8 | |
| 626: r1 = r2 | |
| 627: r1 |= r3 | |
| 628: r3 = *(u64 *)(r10 - 80) | |
| 629: r3 &= 255 | |
| 630: r1 |= r3 | |
| ; checksum += (dstAddr >> 16) + (u16)dstAddr; | |
| 631: bswap32 r2 | |
| 632: bswap16 r1 | |
| ; checksum += htons(totalLen); | |
| 633: r1 += r2 | |
| ; tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr); | |
| 634: r2 = *(u64 *)(r10 - 88) | |
| 635: r2 &= 255 | |
| 636: r3 = r8 | |
| 637: r3 &= 255 | |
| 638: r3 <<= 8 | |
| 639: r3 |= r2 | |
| 640: r2 = *(u64 *)(r10 - 144) | |
| 641: r2 <<= 24 | |
| 642: r4 = *(u64 *)(r10 - 104) | |
| 643: r4 &= 255 | |
| 644: r4 <<= 16 | |
| 645: r2 |= r4 | |
| 646: r3 |= r2 | |
| ; checksum += (srcAddr >> 16) + (u16)srcAddr; | |
| 647: bswap32 r2 | |
| ; checksum += htons(identification); | |
| 648: r1 += r2 | |
| ; u32 checksum = htons(((u16)version << 12) | ((u16)ihl << 8) | (u16)diffserv); | |
| 649: r5 = *(u64 *)(r10 - 184) | |
| 650: r5 <<= 4 | |
| 651: r2 = *(u64 *)(r10 - 192) | |
| 652: r5 |= r2 | |
| ; tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr); | |
| 653: r4 = *(u64 *)(r10 - 168) | |
| 654: r4 &= 255 | |
| ; checksum += htons(totalLen); | |
| 655: r2 = *(u64 *)(r10 - 176) | |
| 656: r2 <<= 8 | |
| 657: r2 |= r4 | |
| ; tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr); | |
| 658: r0 = *(u64 *)(r10 - 152) | |
| 659: r0 &= 255 | |
| ; checksum += htons(identification); | |
| 660: r4 = *(u64 *)(r10 - 160) | |
| 661: r4 <<= 8 | |
| 662: r4 |= r0 | |
| ; checksum += (srcAddr >> 16) + (u16)srcAddr; | |
| 663: bswap16 r3 | |
| ; checksum += htons(((u16)flags << 13) | fragOffset); | |
| 664: r1 += r3 | |
| ; checksum += htons(((u16)ttl << 8) | (u16)protocol); | |
| 665: r3 = r9 | |
| 666: r3 <<= 8 | |
| 667: r3 |= 4 | |
| 668: r1 += r3 | |
| ; u32 checksum = htons(((u16)version << 12) | ((u16)ihl << 8) | (u16)diffserv); | |
| 669: r5 &= 255 | |
| 670: r3 = *(u64 *)(r10 - 112) | |
| 671: r3 &= 255 | |
| 672: r3 <<= 8 | |
| 673: r3 |= r5 | |
| ; checksum += htons(((u16)flags << 13) | fragOffset); | |
| 674: r5 = *(u64 *)(r10 - 136) | |
| 675: r5 <<= 5 | |
| 676: r0 = *(u64 *)(r10 - 128) | |
| 677: r5 |= r0 | |
| 678: r5 &= 255 | |
| 679: r0 = *(u64 *)(r10 - 120) | |
| 680: r0 <<= 8 | |
| 681: r0 |= r5 | |
| ; checksum += (srcAddr >> 16) + (u16)srcAddr; | |
| 682: r1 += r0 | |
| 683: r1 += r3 | |
| ; checksum += (dstAddr >> 16) + (u16)dstAddr; | |
| 684: r1 += r4 | |
| 685: r1 += r2 | |
| 686: r2 = 4294901760ll | |
| 688: r7 = r1 | |
| 689: r7 &= r2 | |
| ; return __constant_ntohs(~((checksum & 0xFFFF) + (checksum >> 16))); | |
| 690: r7 >>= 16 | |
| 691: r7 += r1 | |
| 692: r1 = 2 | |
| 693: r2 = 4 | |
| 694: *(u64 *)(r10 - 200) = r2 | |
| 695: r7 ^= -1 | |
| 696: r2 = r7 | |
| 697: r2 &= 65535 | |
| 698: *(u64 *)(r10 - 208) = r2 | |
| 699: r7 &= 65280 | |
| 700: r7 >>= 8 | |
| LBB0_19: | |
| 701: *(u64 *)(r10 - 608) = r8 | |
| ; if (hd.ipv4.ebpf_valid) ebpf_outHeaderLength += 160; | |
| 702: r2 = 272 | |
| 703: r8 = 0 | |
| 704: r3 = *(u64 *)(r10 - 40) | |
| 705: if r3 != r8 goto 1 | |
| 706: r2 = 112 | |
| LBB0_21: | |
| ; if (hd.tcp.ebpf_valid) ebpf_outHeaderLength += 160; | |
| 707: r3 = r2 | |
| 708: r3 += 160 | |
| 709: r4 = *(u64 *)(r10 - 48) | |
| 710: if r4 != r8 goto 1 | |
| 711: r3 = r2 | |
| LBB0_23: | |
| ; if (hd.udp.ebpf_valid) ebpf_outHeaderLength += 64; | |
| 712: r4 = r3 | |
| 713: r4 += 64 | |
| 714: r2 = *(u64 *)(r10 - 56) | |
| 715: if r2 != r8 goto 1 | |
| 716: r4 = r3 | |
| LBB0_25: | |
| ; if (hd.icmp.ebpf_valid) ebpf_outHeaderLength += 32; | |
| 717: r3 = r4 | |
| 718: r3 += 32 | |
| 719: r2 = *(u64 *)(r10 - 64) | |
| 720: if r2 != r8 goto 1 | |
| 721: r3 = r4 | |
| LBB0_27: | |
| ; xout.output_port = 0; | |
| 722: *(u32 *)(r10 - 12) = r8 | |
| ; xout.output_action = tmp_2; | |
| 723: *(u32 *)(r10 - 16) = r1 | |
| ; if (hd.icmp.ebpf_valid) ebpf_outHeaderLength += 32; | |
| 724: r1 = 4294967288ll | |
| 726: r3 &= r1 | |
| ; bpf_xdp_adjust_head(skb, BYTES(ebpf_packetOffsetInBits) - BYTES(ebpf_outHeaderLength)); | |
| 727: r3 >>= 3 | |
| 728: r2 = *(u64 *)(r10 - 72) | |
| 729: r2 -= r3 | |
| 730: r1 = r6 | |
| 731: call 44 | |
| ; ebpf_packetEnd = ((void*)(long)skb->data_end); | |
| 732: r2 = *(u32 *)(r6 + 4) | |
| ; ebpf_packetStart = ((void*)(long)skb->data); | |
| 733: r1 = *(u32 *)(r6 + 0) | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) { | |
| 734: r3 = r1 | |
| 735: r3 += 14 | |
| 736: if r3 > r2 goto 319 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 737: r3 = *(u64 *)(r10 - 576) | |
| 738: *(u8 *)(r1 + 0) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 739: r3 = *(u64 *)(r10 - 568) | |
| 740: *(u8 *)(r1 + 1) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 741: r3 = *(u64 *)(r10 - 560) | |
| 742: *(u8 *)(r1 + 2) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 743: r3 = *(u64 *)(r10 - 552) | |
| 744: *(u8 *)(r1 + 3) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0); | |
| 745: r3 = *(u64 *)(r10 - 544) | |
| 746: *(u8 *)(r1 + 4) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0); | |
| 747: r3 = *(u64 *)(r10 - 536) | |
| 748: *(u8 *)(r1 + 5) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 749: r3 = *(u64 *)(r10 - 520) | |
| 750: *(u8 *)(r1 + 6) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 751: r3 = *(u64 *)(r10 - 512) | |
| 752: *(u8 *)(r1 + 7) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 753: r3 = *(u64 *)(r10 - 504) | |
| 754: *(u8 *)(r1 + 8) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 755: r3 = *(u64 *)(r10 - 496) | |
| 756: *(u8 *)(r1 + 9) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0); | |
| 757: r3 = *(u64 *)(r10 - 488) | |
| 758: *(u8 *)(r1 + 10) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0); | |
| 759: r3 = *(u64 *)(r10 - 480) | |
| 760: *(u8 *)(r1 + 11) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 761: r3 = *(u64 *)(r10 - 528) | |
| 762: *(u8 *)(r1 + 12) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 763: r3 = *(u64 *)(r10 - 584) | |
| 764: *(u8 *)(r1 + 13) = r3 | |
| 765: r3 = 112 | |
| ; if (hd.ipv4.ebpf_valid) { | |
| 766: r4 = *(u64 *)(r10 - 40) | |
| 767: if r4 == 0 goto 50 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| 768: r3 = r1 | |
| 769: r3 += 34 | |
| 770: if r3 > r2 goto 285 | |
| 771: r3 = *(u64 *)(r10 - 184) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4); | |
| 772: r3 <<= 4 | |
| ; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4); | |
| 773: r4 = *(u64 *)(r10 - 192) | |
| 774: r3 |= r4 | |
| 775: *(u8 *)(r1 + 14) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 776: r3 = *(u64 *)(r10 - 112) | |
| 777: *(u8 *)(r1 + 15) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 778: r3 = *(u64 *)(r10 - 168) | |
| 779: *(u8 *)(r1 + 16) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 780: r3 = *(u64 *)(r10 - 176) | |
| 781: *(u8 *)(r1 + 17) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 782: r3 = *(u64 *)(r10 - 152) | |
| 783: *(u8 *)(r1 + 18) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 784: r3 = *(u64 *)(r10 - 160) | |
| 785: *(u8 *)(r1 + 19) = r3 | |
| 786: r4 = *(u64 *)(r10 - 136) | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 5); | |
| 787: r4 <<= 5 | |
| 788: r3 = *(u64 *)(r10 - 120) | |
| ; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 3, (ebpf_byte) << 3); | |
| 789: r3 >>= 2 | |
| 790: r3 &= 7 | |
| 791: r3 |= r4 | |
| 792: *(u8 *)(r1 + 20) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 793: r3 = *(u64 *)(r10 - 128) | |
| 794: *(u8 *)(r1 + 21) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 795: r3 = *(u64 *)(r10 - 200) | |
| 796: *(u8 *)(r1 + 22) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 797: *(u8 *)(r1 + 23) = r9 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 798: r3 = *(u64 *)(r10 - 208) | |
| 799: *(u8 *)(r1 + 24) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 800: *(u8 *)(r1 + 25) = r7 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 801: r3 = *(u64 *)(r10 - 144) | |
| 802: *(u8 *)(r1 + 26) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 803: r3 = *(u64 *)(r10 - 104) | |
| 804: *(u8 *)(r1 + 27) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 805: r3 = *(u64 *)(r10 - 608) | |
| 806: *(u8 *)(r1 + 28) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 807: r3 = *(u64 *)(r10 - 88) | |
| 808: *(u8 *)(r1 + 29) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 809: r3 = *(u64 *)(r10 - 96) | |
| 810: *(u8 *)(r1 + 30) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 811: r3 = *(u64 *)(r10 - 592) | |
| 812: *(u8 *)(r1 + 31) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 813: r3 = *(u64 *)(r10 - 600) | |
| 814: *(u8 *)(r1 + 32) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 815: r3 = *(u64 *)(r10 - 80) | |
| 816: *(u8 *)(r1 + 33) = r3 | |
| 817: r3 = 272 | |
| LBB0_31: | |
| ; if (hd.tcp.ebpf_valid) { | |
| 818: r4 = *(u64 *)(r10 - 48) | |
| 819: if r4 == 0 goto 140 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
| 820: r5 = r3 | |
| 821: r5 += 160 | |
| 822: r4 = 4294967288ll | |
| 824: r5 &= r4 | |
| 825: r5 >>= 3 | |
| 826: r0 = r1 | |
| 827: r0 += r5 | |
| 828: if r0 > r2 goto 227 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 829: r5 = r3 | |
| 830: r5 &= r4 | |
| 831: r5 >>= 3 | |
| 832: r6 = *(u64 *)(r10 - 216) | |
| ; hd.tcp.srcPort = htons(hd.tcp.srcPort); | |
| 833: r6 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 834: r0 = r1 | |
| 835: r0 += r5 | |
| 836: *(u8 *)(r0 + 0) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 837: r5 |= 1 | |
| 838: r0 = r1 | |
| 839: r0 += r5 | |
| 840: r5 = *(u64 *)(r10 - 352) | |
| 841: *(u8 *)(r0 + 0) = r5 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 842: r5 = r3 | |
| 843: r5 += 16 | |
| 844: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 845: r5 >>= 3 | |
| 846: r6 = *(u64 *)(r10 - 336) | |
| ; hd.tcp.dstPort = htons(hd.tcp.dstPort); | |
| 847: r6 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 848: r0 = r1 | |
| 849: r0 += r5 | |
| 850: *(u8 *)(r0 + 0) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 851: r5 |= 1 | |
| 852: r0 = r1 | |
| 853: r0 += r5 | |
| 854: r5 = *(u64 *)(r10 - 344) | |
| 855: *(u8 *)(r0 + 0) = r5 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 856: r5 = r3 | |
| 857: r5 += 32 | |
| 858: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 859: r5 >>= 3 | |
| 860: r0 = r1 | |
| 861: r0 += r5 | |
| 862: r6 = *(u64 *)(r10 - 304) | |
| 863: *(u8 *)(r0 + 0) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 864: r5 |= 1 | |
| 865: r6 = r1 | |
| 866: r6 += r5 | |
| 867: r5 = *(u64 *)(r10 - 312) | |
| 868: *(u8 *)(r6 + 0) = r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 869: r5 = *(u64 *)(r10 - 320) | |
| 870: *(u8 *)(r0 + 2) = r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 871: r5 = *(u64 *)(r10 - 328) | |
| 872: *(u8 *)(r0 + 3) = r5 | |
| ; ebpf_packetOffsetInBits += 32; | |
| 873: r5 = r3 | |
| 874: r5 += 64 | |
| 875: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 876: r5 >>= 3 | |
| 877: r0 = r1 | |
| 878: r0 += r5 | |
| 879: r6 = *(u64 *)(r10 - 272) | |
| 880: *(u8 *)(r0 + 0) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 881: r5 |= 1 | |
| 882: r6 = r1 | |
| 883: r6 += r5 | |
| 884: r5 = *(u64 *)(r10 - 280) | |
| 885: *(u8 *)(r6 + 0) = r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
| 886: r5 = *(u64 *)(r10 - 288) | |
| 887: *(u8 *)(r0 + 2) = r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
| 888: r5 = *(u64 *)(r10 - 296) | |
| 889: *(u8 *)(r0 + 3) = r5 | |
| ; ebpf_packetOffsetInBits += 32; | |
| 890: r5 = r3 | |
| 891: r5 += 96 | |
| 892: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4); | |
| 893: r5 >>= 3 | |
| 894: r0 = r1 | |
| 895: r0 += r5 | |
| 896: r5 = *(u64 *)(r10 - 376) | |
| 897: *(u8 *)(r0 + 0) = r5 | |
| ; ebpf_packetOffsetInBits += 4; | |
| 898: r5 = r3 | |
| 899: r5 += 100 | |
| 900: r5 &= r4 | |
| ; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4); | |
| 901: r5 >>= 3 | |
| 902: r0 = r1 | |
| 903: r0 += r5 | |
| 904: r5 = *(u8 *)(r0 + 0) | |
| 905: r5 &= 240 | |
| 906: r6 = *(u64 *)(r10 - 368) | |
| 907: r5 |= r6 | |
| 908: *(u8 *)(r0 + 0) = r5 | |
| ; ebpf_packetOffsetInBits += 4; | |
| 909: r5 = r3 | |
| 910: r5 += 104 | |
| 911: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 912: r5 >>= 3 | |
| 913: r0 = r1 | |
| 914: r0 += r5 | |
| 915: r5 = *(u64 *)(r10 - 360) | |
| 916: *(u8 *)(r0 + 0) = r5 | |
| ; ebpf_packetOffsetInBits += 8; | |
| 917: r5 = r3 | |
| 918: r5 += 112 | |
| 919: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 920: r5 >>= 3 | |
| 921: r6 = *(u64 *)(r10 - 256) | |
| ; hd.tcp.window = htons(hd.tcp.window); | |
| 922: r6 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 923: r0 = r1 | |
| 924: r0 += r5 | |
| 925: *(u8 *)(r0 + 0) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 926: r5 |= 1 | |
| 927: r0 = r1 | |
| 928: r0 += r5 | |
| 929: r5 = *(u64 *)(r10 - 264) | |
| 930: *(u8 *)(r0 + 0) = r5 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 931: r3 |= 128 | |
| 932: r5 = r3 | |
| 933: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 934: r5 >>= 3 | |
| 935: r6 = *(u64 *)(r10 - 240) | |
| ; hd.tcp.checksum = htons(hd.tcp.checksum); | |
| 936: r6 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 937: r0 = r1 | |
| 938: r0 += r5 | |
| 939: *(u8 *)(r0 + 0) = r6 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 940: r5 |= 1 | |
| 941: r0 = r1 | |
| 942: r0 += r5 | |
| 943: r5 = *(u64 *)(r10 - 248) | |
| 944: *(u8 *)(r0 + 0) = r5 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 945: r5 = r3 | |
| 946: r5 += 16 | |
| 947: r5 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 948: r5 >>= 3 | |
| 949: r0 = *(u64 *)(r10 - 224) | |
| ; hd.tcp.urgentPtr = htons(hd.tcp.urgentPtr); | |
| 950: r0 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 951: r4 = r1 | |
| 952: r4 += r5 | |
| 953: *(u8 *)(r4 + 0) = r0 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 954: r5 |= 1 | |
| 955: r4 = r1 | |
| 956: r4 += r5 | |
| 957: r5 = *(u64 *)(r10 - 232) | |
| 958: *(u8 *)(r4 + 0) = r5 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 959: r3 += 32 | |
| LBB0_34: | |
| ; if (hd.udp.ebpf_valid) { | |
| 960: r4 = *(u64 *)(r10 - 56) | |
| 961: if r4 == 0 goto 53 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) { | |
| 962: r4 = r3 | |
| 963: r4 += 64 | |
| 964: r5 = 4294967288ll | |
| 966: r0 = r4 | |
| 967: r0 &= r5 | |
| 968: r0 >>= 3 | |
| 969: r6 = r1 | |
| 970: r6 += r0 | |
| 971: if r6 > r2 goto 84 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 972: r0 = r3 | |
| 973: r0 &= r5 | |
| 974: r0 >>= 3 | |
| 975: r6 = r1 | |
| 976: r6 += r0 | |
| 977: r0 = *(u64 *)(r10 - 384) | |
| ; hd.udp.srcPort = htons(hd.udp.srcPort); | |
| 978: r0 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 979: *(u8 *)(r6 + 0) = r0 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 980: r0 = *(u64 *)(r10 - 440) | |
| 981: *(u8 *)(r6 + 1) = r0 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 982: r0 = r3 | |
| 983: r0 += 16 | |
| 984: r0 &= r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 985: r0 >>= 3 | |
| 986: r6 = r1 | |
| 987: r6 += r0 | |
| 988: r0 = *(u64 *)(r10 - 424) | |
| ; hd.udp.dstPort = htons(hd.udp.dstPort); | |
| 989: r0 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 990: *(u8 *)(r6 + 0) = r0 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 991: r0 = *(u64 *)(r10 - 432) | |
| 992: *(u8 *)(r6 + 1) = r0 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 993: r0 = r3 | |
| 994: r0 += 32 | |
| 995: r0 &= r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 996: r0 >>= 3 | |
| 997: r6 = r1 | |
| 998: r6 += r0 | |
| 999: r0 = *(u64 *)(r10 - 408) | |
| ; hd.udp.length_ = htons(hd.udp.length_); | |
| 1000: r0 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 1001: *(u8 *)(r6 + 0) = r0 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 1002: r0 = *(u64 *)(r10 - 416) | |
| 1003: *(u8 *)(r6 + 1) = r0 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 1004: r3 += 48 | |
| 1005: r3 &= r5 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 1006: r3 >>= 3 | |
| 1007: r5 = r1 | |
| 1008: r5 += r3 | |
| 1009: r3 = *(u64 *)(r10 - 392) | |
| ; hd.udp.checksum = htons(hd.udp.checksum); | |
| 1010: r3 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 1011: *(u8 *)(r5 + 0) = r3 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 1012: r3 = *(u64 *)(r10 - 400) | |
| 1013: *(u8 *)(r5 + 1) = r3 | |
| 1014: r3 = r4 | |
| LBB0_37: | |
| ; if (hd.icmp.ebpf_valid) { | |
| 1015: r4 = *(u64 *)(r10 - 64) | |
| 1016: if r4 == 0 goto 28 | |
| ; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) { | |
| 1017: r5 = r3 | |
| 1018: r5 += 32 | |
| 1019: r4 = 4294967288ll | |
| 1021: r5 &= r4 | |
| 1022: r5 >>= 3 | |
| 1023: r0 = r1 | |
| 1024: r0 += r5 | |
| 1025: if r0 > r2 goto 30 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 1026: r2 = r3 | |
| 1027: r2 &= r4 | |
| 1028: r2 >>= 3 | |
| 1029: r5 = r1 | |
| 1030: r5 += r2 | |
| 1031: r2 = *(u64 *)(r10 - 464) | |
| ; hd.icmp.typeCode = htons(hd.icmp.typeCode); | |
| 1032: r2 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 1033: *(u8 *)(r5 + 0) = r2 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 1034: r2 = *(u64 *)(r10 - 472) | |
| 1035: *(u8 *)(r5 + 1) = r2 | |
| ; ebpf_packetOffsetInBits += 16; | |
| 1036: r3 += 16 | |
| 1037: r3 &= r4 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 1038: r3 >>= 3 | |
| 1039: r1 += r3 | |
| 1040: r2 = *(u64 *)(r10 - 448) | |
| ; hd.icmp.hdrChecksum = htons(hd.icmp.hdrChecksum); | |
| 1041: r2 >>= 8 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
| 1042: *(u8 *)(r1 + 0) = r2 | |
| ; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
| 1043: r2 = *(u64 *)(r10 - 456) | |
| 1044: *(u8 *)(r1 + 1) = r2 | |
| LBB0_40: | |
| ; xout.output_port = 0; | |
| 1045: r3 = r10 | |
| 1046: r3 += -12 | |
| 1047: r2 = r10 | |
| 1048: r2 += -4 | |
| ; bpf_map_update_elem(&ebpf_outTable, &ebpf_zero, &xout.output_port, BPF_ANY); | |
| 1049: r1 = 0ll | |
| 1051: r4 = 0 | |
| 1052: call 2 | |
| ; return xout.output_action; | |
| 1053: r8 = *(u32 *)(r10 - 16) | |
| 1054: goto 1 | |
| LBB0_42: | |
| 1055: r8 = 0 | |
| LBB0_41: | |
| ; } | |
| 1056: r0 = r8 | |
| 1057: exit |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment