Created
January 4, 2021 09:45
-
-
Save takehaya/63524d57ca62db02273041a8290bb280 to your computer and use it in GitHub Desktop.
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
| srv6_bpf.o: file format ELF64-BPF | |
| Disassembly of section xdp_prog: | |
| 0000000000000000 srv6_handler: | |
| ; { | |
| 0: r6 = r1 | |
| ; void *data_end = (void *)(long)xdp->data_end; | |
| 1: r2 = *(u32 *)(r6 + 4) | |
| ; void *data = (void *)(long)xdp->data; | |
| 2: r1 = *(u32 *)(r6 + 0) | |
| ; } | |
| 3: r3 = r1 | |
| 4: r3 += 14 | |
| ; } | |
| 5: r4 = r1 | |
| 6: r4 += 54 | |
| 7: r7 = 0 | |
| 8: r8 = 0 | |
| 9: if r4 > r2 goto +1 <LBB0_2> | |
| 10: r8 = r3 | |
| 0000000000000058 LBB0_2: | |
| ; } | |
| 11: r4 = r1 | |
| 12: r4 += 34 | |
| 13: if r4 > r2 goto +1 <LBB0_4> | |
| 14: r7 = r3 | |
| 0000000000000078 LBB0_4: | |
| ; if (data + sizeof(*eth) > data_end) | |
| 15: if r2 >= r3 goto +1 <LBB0_6> | |
| 16: goto +2 <LBB0_8> | |
| 0000000000000088 LBB0_6: | |
| ; if (!iph || !v6h) | |
| 17: if r7 == 0 goto +1 <LBB0_8> | |
| 18: if r8 != 0 goto +8 <LBB0_10> | |
| 0000000000000098 LBB0_8: | |
| 19: r8 = 2 | |
| 20: r1 = r6 | |
| 21: r2 = 0 ll | |
| 23: r3 = 2 | |
| 00000000000000c0 LBB0_9: | |
| 24: call 12 | |
| ; } | |
| 25: r0 = r8 | |
| 26: exit | |
| 00000000000000d8 LBB0_10: | |
| ; h_proto = eth->h_proto; | |
| 27: r2 = *(u8 *)(r1 + 12) | |
| 28: r1 = *(u8 *)(r1 + 13) | |
| 29: r1 <<= 8 | |
| 30: r1 |= r2 | |
| ; if (h_proto == bpf_htons(ETH_P_IP)) | |
| 31: if r1 == 56710 goto +229 <LBB0_159> | |
| 32: if r1 != 8 goto -14 <LBB0_8> | |
| 33: r1 = 32 | |
| ; v4key.prefixlen = 32; | |
| 34: *(u32 *)(r10 - 160) = r1 | |
| ; v4key.addr = iph->daddr; | |
| 35: r1 = *(u32 *)(r7 + 16) | |
| 36: *(u32 *)(r10 - 156) = r1 | |
| 37: r2 = r10 | |
| ; v4key.prefixlen = 32; | |
| 38: r2 += -160 | |
| ; tb = bpf_map_lookup_elem(&transit_table_v4, &v4key); | |
| 39: r1 = 0 ll | |
| 41: call 1 | |
| ; if (tb) | |
| 42: if r0 == 0 goto -24 <LBB0_8> | |
| ; switch (tb->action) | |
| 43: r1 = *(u32 *)(r0 + 44) | |
| 44: if r1 == 5 goto +570 <LBB0_76> | |
| 45: if r1 != 1 goto -27 <LBB0_8> | |
| 46: *(u64 *)(r10 - 168) = r0 | |
| ; srh_len = sizeof(struct srhhdr) + sizeof(struct in6_addr) * tb->segment_length; | |
| 47: r9 = *(u32 *)(r0 + 40) | |
| 48: r9 <<= 4 | |
| 49: r9 |= 8 | |
| ; if (bpf_xdp_adjust_head(xdp, 0 - (int)(sizeof(struct ipv6hdr) + srh_len))) | |
| 50: r1 = r9 | |
| 51: r1 &= 248 | |
| 52: r2 = -40 | |
| 53: r2 -= r1 | |
| ; return xdpcap_exit(xdp, &xdpcap_hook, transit_encap(xdp, tb, IPPROTO_IPIP, bpf_ntohs(iph->tot_len))); | |
| 54: r7 = *(u16 *)(r7 + 2) | |
| ; if (bpf_xdp_adjust_head(xdp, 0 - (int)(sizeof(struct ipv6hdr) + srh_len))) | |
| 55: r1 = r6 | |
| 56: call 44 | |
| 57: r8 = 2 | |
| 58: r0 <<= 32 | |
| 59: r0 >>= 32 | |
| 60: if r0 != 0 goto +1803 <LBB0_75> | |
| ; data_end = (void *)(long)xdp->data_end; | |
| 61: r2 = *(u32 *)(r6 + 4) | |
| ; data = (void *)(long)xdp->data; | |
| 62: r1 = *(u32 *)(r6 + 0) | |
| ; if ((void *)((long)new_eth + sizeof(struct ethhdr)) > data_end) | |
| 63: r3 = r1 | |
| 64: r3 += 14 | |
| 65: if r3 > r2 goto +1798 <LBB0_75> | |
| 66: r3 = 221 | |
| ; new_eth->h_proto = bpf_htons(ETH_P_IPV6); | |
| 67: *(u8 *)(r1 + 13) = r3 | |
| 68: r3 = 134 | |
| 69: *(u8 *)(r1 + 12) = r3 | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr)) > data_end) | |
| 70: r3 = r1 | |
| 71: r3 += 54 | |
| 72: if r3 > r2 goto +1791 <LBB0_75> | |
| 73: r7 >>= 8 | |
| 74: r3 = 16427 | |
| ; v6h->nexthdr = NEXTHDR_ROUTING; | |
| 75: *(u16 *)(r1 + 20) = r3 | |
| 76: r3 = 96 | |
| ; v6h->priority = 0; | |
| 77: *(u8 *)(r1 + 14) = r3 | |
| 78: r3 = r9 | |
| 79: r3 &= 255 | |
| 80: r7 += r3 | |
| 81: r7 = be16 r7 | |
| ; v6h->payload_len = bpf_htons(srh_len + innerlen); | |
| 82: *(u16 *)(r1 + 18) = r7 | |
| 83: r4 = *(u64 *)(r10 - 168) | |
| ; __builtin_memcpy(&v6h->saddr, &tb->saddr, sizeof(struct in6_addr)); | |
| 84: r3 = *(u32 *)(r4 + 12) | |
| 85: *(u32 *)(r1 + 34) = r3 | |
| 86: r3 = *(u32 *)(r4 + 8) | |
| 87: *(u32 *)(r1 + 30) = r3 | |
| 88: r3 = *(u32 *)(r4 + 4) | |
| 89: *(u32 *)(r1 + 26) = r3 | |
| 90: r3 = *(u32 *)(r4 + 0) | |
| 91: *(u32 *)(r1 + 22) = r3 | |
| ; if (tb->segment_length == 0 || tb->segment_length > MAX_SEGMENTS) | |
| 92: r3 = *(u32 *)(r4 + 40) | |
| 93: r3 += -1 | |
| 94: r3 <<= 32 | |
| 95: r3 >>= 32 | |
| 96: if r3 > 4 goto +1767 <LBB0_75> | |
| ; __builtin_memcpy(&v6h->daddr, &tb->segments[tb->segment_length - 1], sizeof(struct in6_addr)); | |
| 97: r3 <<= 4 | |
| 98: r4 = *(u64 *)(r10 - 168) | |
| 99: r4 += r3 | |
| 100: r3 = *(u32 *)(r4 + 60) | |
| 101: *(u32 *)(r1 + 50) = r3 | |
| 102: r3 = *(u32 *)(r4 + 56) | |
| 103: *(u32 *)(r1 + 46) = r3 | |
| 104: r3 = *(u32 *)(r4 + 52) | |
| 105: *(u32 *)(r1 + 42) = r3 | |
| 106: r3 = *(u32 *)(r4 + 48) | |
| 107: *(u32 *)(r1 + 38) = r3 | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr)) > data_end) | |
| 108: r3 = r1 | |
| 109: r3 += 62 | |
| 110: if r3 > r2 goto +1753 <LBB0_75> | |
| 111: r4 = 4 | |
| ; srh->routingType = 4; | |
| 112: *(u8 *)(r1 + 56) = r4 | |
| ; srh->nextHdr = nexthdr; | |
| 113: *(u8 *)(r1 + 54) = r4 | |
| ; srh->hdrExtLen = ((srh_len / 8) - 1); | |
| 114: r9 &= 255 | |
| 115: r9 >>= 3 | |
| 116: r9 += -1 | |
| 117: *(u8 *)(r1 + 55) = r9 | |
| ; srh->segmentsLeft = tb->segment_length - 1; | |
| 118: r4 = *(u64 *)(r10 - 168) | |
| 119: r4 = *(u32 *)(r4 + 40) | |
| 120: r5 = 0 | |
| ; srh->tag = 0; | |
| 121: *(u16 *)(r1 + 60) = r5 | |
| ; srh->flags = 0; | |
| 122: *(u8 *)(r1 + 59) = r5 | |
| ; srh->segmentsLeft = tb->segment_length - 1; | |
| 123: r5 = r4 | |
| 124: r5 += -1 | |
| ; srh->lastEntry = tb->segment_length - 1; | |
| 125: *(u8 *)(r1 + 58) = r5 | |
| ; srh->segmentsLeft = tb->segment_length - 1; | |
| 126: *(u8 *)(r1 + 57) = r5 | |
| ; if (i >= tb->segment_length) | |
| 127: if r4 == 0 goto +72 <LBB0_31> | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end) | |
| 128: r4 = r1 | |
| 129: r4 += 79 | |
| 130: if r4 > r2 goto +1733 <LBB0_75> | |
| 131: r5 = *(u64 *)(r10 - 168) | |
| ; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr)); | |
| 132: r4 = *(u32 *)(r5 + 60) | |
| 133: *(u32 *)(r3 + 12) = r4 | |
| 134: r4 = *(u32 *)(r5 + 56) | |
| 135: *(u32 *)(r3 + 8) = r4 | |
| 136: r4 = *(u32 *)(r5 + 52) | |
| 137: *(u32 *)(r3 + 4) = r4 | |
| 138: r4 = *(u32 *)(r5 + 48) | |
| 139: *(u32 *)(r3 + 0) = r4 | |
| ; if (i >= tb->segment_length) | |
| 140: r3 = *(u32 *)(r5 + 40) | |
| 141: r8 = 2 | |
| 142: if r8 > r3 goto +57 <LBB0_31> | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end) | |
| 143: r3 = r1 | |
| 144: r3 += 95 | |
| 145: if r3 > r2 goto +1718 <LBB0_75> | |
| 146: r4 = *(u64 *)(r10 - 168) | |
| ; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr)); | |
| 147: r3 = *(u32 *)(r4 + 76) | |
| 148: *(u32 *)(r1 + 90) = r3 | |
| 149: r3 = *(u32 *)(r4 + 72) | |
| 150: *(u32 *)(r1 + 86) = r3 | |
| 151: r3 = *(u32 *)(r4 + 68) | |
| 152: *(u32 *)(r1 + 82) = r3 | |
| 153: r3 = *(u32 *)(r4 + 64) | |
| 154: *(u32 *)(r1 + 78) = r3 | |
| ; if (i >= tb->segment_length) | |
| 155: r3 = *(u32 *)(r4 + 40) | |
| 156: r4 = 3 | |
| 157: if r4 > r3 goto +42 <LBB0_31> | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end) | |
| 158: r3 = r1 | |
| 159: r3 += 111 | |
| 160: if r3 > r2 goto +1703 <LBB0_75> | |
| 161: r4 = *(u64 *)(r10 - 168) | |
| ; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr)); | |
| 162: r3 = *(u32 *)(r4 + 92) | |
| 163: *(u32 *)(r1 + 106) = r3 | |
| 164: r3 = *(u32 *)(r4 + 88) | |
| 165: *(u32 *)(r1 + 102) = r3 | |
| 166: r3 = *(u32 *)(r4 + 84) | |
| 167: *(u32 *)(r1 + 98) = r3 | |
| 168: r3 = *(u32 *)(r4 + 80) | |
| 169: *(u32 *)(r1 + 94) = r3 | |
| ; if (i >= tb->segment_length) | |
| 170: r3 = *(u32 *)(r4 + 40) | |
| 171: r4 = 4 | |
| 172: if r4 > r3 goto +27 <LBB0_31> | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end) | |
| 173: r3 = r1 | |
| 174: r3 += 127 | |
| 175: if r3 > r2 goto +1688 <LBB0_75> | |
| 176: r4 = *(u64 *)(r10 - 168) | |
| ; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr)); | |
| 177: r3 = *(u32 *)(r4 + 108) | |
| 178: *(u32 *)(r1 + 122) = r3 | |
| 179: r3 = *(u32 *)(r4 + 104) | |
| 180: *(u32 *)(r1 + 118) = r3 | |
| 181: r3 = *(u32 *)(r4 + 100) | |
| 182: *(u32 *)(r1 + 114) = r3 | |
| 183: r3 = *(u32 *)(r4 + 96) | |
| 184: *(u32 *)(r1 + 110) = r3 | |
| ; if (i >= tb->segment_length) | |
| 185: r3 = *(u32 *)(r4 + 40) | |
| 186: r4 = 5 | |
| 187: if r4 > r3 goto +12 <LBB0_31> | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end) | |
| 188: r3 = r1 | |
| 189: r3 += 143 | |
| 190: if r3 > r2 goto +1673 <LBB0_75> | |
| 191: r3 = *(u64 *)(r10 - 168) | |
| ; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr)); | |
| 192: r2 = *(u32 *)(r3 + 124) | |
| 193: *(u32 *)(r1 + 138) = r2 | |
| 194: r2 = *(u32 *)(r3 + 120) | |
| 195: *(u32 *)(r1 + 134) = r2 | |
| 196: r2 = *(u32 *)(r3 + 116) | |
| 197: *(u32 *)(r1 + 130) = r2 | |
| 198: r2 = *(u32 *)(r3 + 112) | |
| 199: *(u32 *)(r1 + 126) = r2 | |
| 0000000000000640 LBB0_31: | |
| ; if (data + sizeof(*eth) > data_end) | |
| 200: r1 = *(u32 *)(r6 + 4) | |
| ; | |
| 201: r7 = *(u32 *)(r6 + 0) | |
| ; } | |
| 202: r2 = r7 | |
| 203: r2 += 14 | |
| 204: r8 = 2 | |
| 205: if r2 > r1 goto +1658 <LBB0_75> | |
| ; } | |
| 206: r4 = r7 | |
| 207: r4 += 34 | |
| ; } | |
| 208: r5 = r7 | |
| 209: r5 += 54 | |
| 210: r3 = 0 | |
| 211: r9 = 0 | |
| 212: if r5 > r1 goto +1 <LBB0_34> | |
| 213: r9 = r2 | |
| 00000000000006b0 LBB0_34: | |
| ; } | |
| 214: r5 = 0 | |
| 215: if r4 > r1 goto +1 <LBB0_36> | |
| 216: r5 = r2 | |
| 00000000000006c8 LBB0_36: | |
| ; if (data + sizeof(struct ethhdr) > data_end) | |
| 217: *(u64 *)(r10 - 8) = r3 | |
| 218: *(u64 *)(r10 - 16) = r3 | |
| 219: *(u64 *)(r10 - 24) = r3 | |
| 220: *(u64 *)(r10 - 32) = r3 | |
| 221: *(u64 *)(r10 - 40) = r3 | |
| 222: *(u64 *)(r10 - 48) = r3 | |
| 223: *(u64 *)(r10 - 56) = r3 | |
| 224: *(u64 *)(r10 - 64) = r3 | |
| ; h_proto = eth->h_proto; | |
| 225: if r5 == 0 goto +1625 <LBB0_74> | |
| 226: if r9 == 0 goto +1624 <LBB0_74> | |
| 227: *(u64 *)(r10 - 168) = r5 | |
| ; switch (h_proto) | |
| 228: r1 = *(u8 *)(r7 + 12) | |
| 229: r8 = *(u8 *)(r7 + 13) | |
| 230: r2 = 0 | |
| ; { | |
| 231: *(u64 *)(r10 - 8) = r2 | |
| 232: *(u64 *)(r10 - 16) = r2 | |
| 233: *(u64 *)(r10 - 24) = r2 | |
| 234: *(u64 *)(r10 - 32) = r2 | |
| 235: *(u64 *)(r10 - 40) = r2 | |
| 236: *(u64 *)(r10 - 48) = r2 | |
| 237: *(u64 *)(r10 - 56) = r2 | |
| 238: *(u64 *)(r10 - 64) = r2 | |
| ; switch (h_proto) | |
| 239: r8 <<= 8 | |
| 240: r8 |= r1 | |
| ; fib_params.family = AF_INET; | |
| 241: if r8 == 56710 goto +747 <LBB0_41> | |
| 242: r3 = *(u64 *)(r10 - 168) | |
| 243: if r8 != 8 goto +1607 <LBB0_74> | |
| 244: r1 = 2 | |
| ; fib_params.sport = 0; | |
| 245: *(u8 *)(r10 - 64) = r1 | |
| ; fib_params.dport = 0; | |
| 246: r1 = *(u8 *)(r3 + 1) | |
| 247: *(u8 *)(r10 - 52) = r1 | |
| ; fib_params.tot_len = bpf_ntohs(iph->tot_len); | |
| 248: r1 = *(u8 *)(r3 + 9) | |
| 249: r2 = 0 | |
| ; fib_params.ipv4_dst = iph->daddr; | |
| 250: *(u16 *)(r10 - 60) = r2 | |
| ; fib_params.ipv4_src = iph->saddr; | |
| 251: *(u16 *)(r10 - 62) = r2 | |
| ; fib_params.tot_len = bpf_ntohs(iph->tot_len); | |
| 252: *(u8 *)(r10 - 63) = r1 | |
| ; break; | |
| 253: r1 = *(u16 *)(r3 + 2) | |
| 254: r1 = be16 r1 | |
| 255: *(u16 *)(r10 - 58) = r1 | |
| ; | |
| 256: r1 = *(u32 *)(r3 + 12) | |
| 257: *(u32 *)(r10 - 48) = r1 | |
| ; case bpf_htons(ETH_P_IPV6): | |
| 258: r1 = *(u32 *)(r3 + 16) | |
| 259: *(u32 *)(r10 - 32) = r1 | |
| 260: goto +767 <LBB0_43> | |
| 0000000000000828 LBB0_159: | |
| 261: r1 = 128 | |
| ; v6key.prefixlen = 128; | |
| 262: *(u32 *)(r10 - 160) = r1 | |
| ; v6key.addr = v6h->daddr; | |
| 263: r1 = *(u32 *)(r8 + 36) | |
| 264: *(u32 *)(r10 - 144) = r1 | |
| 265: r1 = *(u32 *)(r8 + 32) | |
| 266: *(u32 *)(r10 - 148) = r1 | |
| 267: r1 = *(u32 *)(r8 + 28) | |
| 268: *(u32 *)(r10 - 152) = r1 | |
| 269: r1 = *(u32 *)(r8 + 24) | |
| 270: *(u32 *)(r10 - 156) = r1 | |
| ; if (v6h->nexthdr == NEXTHDR_ROUTING) | |
| 271: r1 = *(u8 *)(r8 + 6) | |
| 272: if r1 != 43 goto +123 <LBB0_246> | |
| 273: r2 = r10 | |
| ; ef_table = bpf_map_lookup_elem(&function_table, &v6key); | |
| 274: r2 += -160 | |
| 275: r1 = 0 ll | |
| 277: call 1 | |
| 278: r7 = r0 | |
| ; if (ef_table) | |
| 279: if r7 == 0 goto -261 <LBB0_8> | |
| ; switch (ef_table->function) | |
| 280: r1 = *(u32 *)(r7 + 32) | |
| 281: if r1 == 6 goto +479 <LBB0_206> | |
| 282: if r1 != 1 goto -264 <LBB0_8> | |
| 283: r1 = 2925175077039727 ll | |
| ; bpf_printk("run action_end\n"); | |
| 285: *(u64 *)(r10 - 56) = r1 | |
| 286: r1 = 7598807740087956850 ll | |
| 288: *(u64 *)(r10 - 64) = r1 | |
| 289: r1 = r10 | |
| 290: r1 += -64 | |
| 291: r2 = 16 | |
| 292: call 6 | |
| 293: r1 = 0 | |
| ; int len, srhoff = 0; | |
| 294: r3 = *(u32 *)(r6 + 4) | |
| ; struct srhhdr *srh; | |
| 295: r4 = *(u32 *)(r6 + 0) | |
| ; } | |
| 296: r5 = r4 | |
| 297: r5 += 54 | |
| 298: r2 = 0 | |
| ; if (srh->segmentsLeft == 0) | |
| 299: if r5 == 0 goto +8 <LBB0_167> | |
| 300: r0 = r4 | |
| 301: r0 += 62 | |
| 302: r2 = 0 | |
| 303: if r0 > r3 goto +4 <LBB0_167> | |
| ; // TODO | |
| 304: r0 = *(u8 *)(r4 + 57) | |
| 305: r2 = 0 | |
| 306: if r0 == 0 goto +1 <LBB0_167> | |
| 307: r2 = r5 | |
| 00000000000009a0 LBB0_167: | |
| ; } | |
| 308: if r5 > r3 goto +2 <LBB0_169> | |
| 309: r4 += 14 | |
| 310: r1 = r4 | |
| 00000000000009b8 LBB0_169: | |
| 311: r8 = 2 | |
| ; if (!srhdr || !v6h) | |
| 312: if r1 == 0 goto +1551 <LBB0_75> | |
| 313: if r2 == 0 goto +1550 <LBB0_75> | |
| ; | |
| 314: r4 = *(u8 *)(r2 + 3) | |
| 315: r4 += -1 | |
| 316: *(u8 *)(r2 + 3) = r4 | |
| ; addr = srh->segments + srh->segmentsLeft; | |
| 317: r4 &= 255 | |
| 318: r4 <<= 4 | |
| 319: r5 = r4 | |
| 320: r5 += r2 | |
| 321: r5 += 24 | |
| 322: if r5 > r3 goto +1541 <LBB0_75> | |
| ; | |
| 323: r2 += r4 | |
| ; *daddr = *addr; | |
| 324: r4 = r2 | |
| 325: r4 += 24 | |
| 326: if r4 > r3 goto +1537 <LBB0_75> | |
| 327: r1 += 24 | |
| 328: r2 += 8 | |
| ; | |
| 329: r3 = *(u32 *)(r2 + 12) | |
| 330: *(u32 *)(r1 + 12) = r3 | |
| 331: r3 = *(u32 *)(r2 + 8) | |
| 332: *(u32 *)(r1 + 8) = r3 | |
| 333: r3 = *(u32 *)(r2 + 4) | |
| 334: *(u32 *)(r1 + 4) = r3 | |
| 335: r2 = *(u32 *)(r2 + 0) | |
| 336: *(u32 *)(r1 + 0) = r2 | |
| ; if (data + sizeof(*eth) > data_end) | |
| 337: r1 = *(u32 *)(r6 + 4) | |
| ; | |
| 338: r7 = *(u32 *)(r6 + 0) | |
| ; } | |
| 339: r2 = r7 | |
| 340: r2 += 14 | |
| 341: if r2 > r1 goto +1522 <LBB0_75> | |
| ; } | |
| 342: r4 = r7 | |
| 343: r4 += 34 | |
| ; } | |
| 344: r5 = r7 | |
| 345: r5 += 54 | |
| 346: r3 = 0 | |
| 347: r9 = 0 | |
| 348: if r5 > r1 goto +1 <LBB0_176> | |
| 349: r9 = r2 | |
| 0000000000000af0 LBB0_176: | |
| ; } | |
| 350: r5 = 0 | |
| 351: if r4 > r1 goto +1 <LBB0_178> | |
| 352: r5 = r2 | |
| 0000000000000b08 LBB0_178: | |
| ; if (data + sizeof(struct ethhdr) > data_end) | |
| 353: *(u64 *)(r10 - 8) = r3 | |
| 354: *(u64 *)(r10 - 16) = r3 | |
| 355: *(u64 *)(r10 - 24) = r3 | |
| 356: *(u64 *)(r10 - 32) = r3 | |
| 357: *(u64 *)(r10 - 40) = r3 | |
| 358: *(u64 *)(r10 - 48) = r3 | |
| 359: *(u64 *)(r10 - 56) = r3 | |
| 360: *(u64 *)(r10 - 64) = r3 | |
| ; h_proto = eth->h_proto; | |
| 361: if r5 == 0 goto +1489 <LBB0_74> | |
| 362: if r9 == 0 goto +1488 <LBB0_74> | |
| ; switch (h_proto) | |
| 363: r1 = *(u8 *)(r7 + 12) | |
| 364: r8 = *(u8 *)(r7 + 13) | |
| 365: r2 = 0 | |
| ; { | |
| 366: *(u64 *)(r10 - 8) = r2 | |
| 367: *(u64 *)(r10 - 16) = r2 | |
| 368: *(u64 *)(r10 - 24) = r2 | |
| 369: *(u64 *)(r10 - 32) = r2 | |
| 370: *(u64 *)(r10 - 40) = r2 | |
| 371: *(u64 *)(r10 - 48) = r2 | |
| 372: *(u64 *)(r10 - 56) = r2 | |
| 373: *(u64 *)(r10 - 64) = r2 | |
| ; switch (h_proto) | |
| 374: r8 <<= 8 | |
| 375: r8 |= r1 | |
| ; fib_params.family = AF_INET; | |
| 376: if r8 == 56710 goto +488 <LBB0_183> | |
| 377: if r8 != 8 goto +1473 <LBB0_74> | |
| 378: r1 = 2 | |
| ; fib_params.sport = 0; | |
| 379: *(u8 *)(r10 - 64) = r1 | |
| ; fib_params.dport = 0; | |
| 380: r1 = *(u8 *)(r5 + 1) | |
| 381: *(u8 *)(r10 - 52) = r1 | |
| ; fib_params.tot_len = bpf_ntohs(iph->tot_len); | |
| 382: r1 = *(u8 *)(r5 + 9) | |
| 383: r2 = 0 | |
| ; fib_params.ipv4_dst = iph->daddr; | |
| 384: *(u16 *)(r10 - 60) = r2 | |
| ; fib_params.ipv4_src = iph->saddr; | |
| 385: *(u16 *)(r10 - 62) = r2 | |
| ; fib_params.tot_len = bpf_ntohs(iph->tot_len); | |
| 386: *(u8 *)(r10 - 63) = r1 | |
| ; break; | |
| 387: r1 = *(u16 *)(r5 + 2) | |
| 388: r1 = be16 r1 | |
| 389: *(u16 *)(r10 - 58) = r1 | |
| ; | |
| 390: r1 = *(u32 *)(r5 + 12) | |
| 391: *(u32 *)(r10 - 48) = r1 | |
| 392: *(u64 *)(r10 - 168) = r5 | |
| ; case bpf_htons(ETH_P_IPV6): | |
| 393: r1 = *(u32 *)(r5 + 16) | |
| 394: *(u32 *)(r10 - 32) = r1 | |
| 395: goto +509 <LBB0_185> | |
| 0000000000000c60 LBB0_246: | |
| 396: r2 = r10 | |
| ; tb = bpf_map_lookup_elem(&transit_table_v6, &v6key); | |
| 397: r2 += -160 | |
| 398: r1 = 0 ll | |
| 400: call 1 | |
| 401: r7 = r0 | |
| ; if (tb) | |
| 402: if r7 == 0 goto -384 <LBB0_8> | |
| ; switch (tb->action) | |
| 403: r1 = *(u32 *)(r7 + 44) | |
| 404: if r1 != 1 goto -386 <LBB0_8> | |
| ; srh_len = sizeof(struct srhhdr) + sizeof(struct in6_addr) * tb->segment_length; | |
| 405: r9 = *(u32 *)(r7 + 40) | |
| 406: r9 <<= 4 | |
| 407: r9 |= 8 | |
| ; if (bpf_xdp_adjust_head(xdp, 0 - (int)(sizeof(struct ipv6hdr) + srh_len))) | |
| 408: r1 = r9 | |
| 409: r1 &= 248 | |
| 410: r2 = -40 | |
| 411: r2 -= r1 | |
| ; return xdpcap_exit(xdp, &xdpcap_hook, transit_encap(xdp, tb, IPPROTO_IPV6, v6h->payload_len)); | |
| 412: r1 = *(u16 *)(r8 + 4) | |
| ; if (bpf_xdp_adjust_head(xdp, 0 - (int)(sizeof(struct ipv6hdr) + srh_len))) | |
| 413: *(u64 *)(r10 - 168) = r1 | |
| 414: r1 = r6 | |
| 415: call 44 | |
| 416: r8 = 2 | |
| 417: r0 <<= 32 | |
| 418: r0 >>= 32 | |
| 419: if r0 != 0 goto +1444 <LBB0_75> | |
| ; data_end = (void *)(long)xdp->data_end; | |
| 420: r2 = *(u32 *)(r6 + 4) | |
| ; data = (void *)(long)xdp->data; | |
| 421: r1 = *(u32 *)(r6 + 0) | |
| ; if ((void *)((long)new_eth + sizeof(struct ethhdr)) > data_end) | |
| 422: r3 = r1 | |
| 423: r3 += 14 | |
| 424: if r3 > r2 goto +1439 <LBB0_75> | |
| 425: r3 = 221 | |
| ; new_eth->h_proto = bpf_htons(ETH_P_IPV6); | |
| 426: *(u8 *)(r1 + 13) = r3 | |
| 427: r3 = 134 | |
| 428: *(u8 *)(r1 + 12) = r3 | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr)) > data_end) | |
| 429: r3 = r1 | |
| 430: r3 += 54 | |
| 431: if r3 > r2 goto +1432 <LBB0_75> | |
| 432: r4 = *(u64 *)(r10 - 168) | |
| 433: r4 &= 255 | |
| 434: r3 = 16427 | |
| ; v6h->nexthdr = NEXTHDR_ROUTING; | |
| 435: *(u16 *)(r1 + 20) = r3 | |
| 436: r3 = 96 | |
| ; v6h->priority = 0; | |
| 437: *(u8 *)(r1 + 14) = r3 | |
| 438: r3 = r9 | |
| 439: r3 &= 255 | |
| 440: r4 += r3 | |
| 441: r4 = be16 r4 | |
| ; v6h->payload_len = bpf_htons(srh_len + innerlen); | |
| 442: *(u16 *)(r1 + 18) = r4 | |
| ; __builtin_memcpy(&v6h->saddr, &tb->saddr, sizeof(struct in6_addr)); | |
| 443: r3 = *(u32 *)(r7 + 12) | |
| 444: *(u32 *)(r1 + 34) = r3 | |
| 445: r3 = *(u32 *)(r7 + 8) | |
| 446: *(u32 *)(r1 + 30) = r3 | |
| 447: r3 = *(u32 *)(r7 + 4) | |
| 448: *(u32 *)(r1 + 26) = r3 | |
| 449: r3 = *(u32 *)(r7 + 0) | |
| 450: *(u32 *)(r1 + 22) = r3 | |
| ; if (tb->segment_length == 0 || tb->segment_length > MAX_SEGMENTS) | |
| 451: r3 = *(u32 *)(r7 + 40) | |
| 452: r3 += -1 | |
| 453: r3 <<= 32 | |
| 454: r3 >>= 32 | |
| 455: if r3 > 4 goto +1408 <LBB0_75> | |
| ; __builtin_memcpy(&v6h->daddr, &tb->segments[tb->segment_length - 1], sizeof(struct in6_addr)); | |
| 456: r3 <<= 4 | |
| 457: r4 = r7 | |
| 458: r4 += r3 | |
| 459: r3 = *(u32 *)(r4 + 60) | |
| 460: *(u32 *)(r1 + 50) = r3 | |
| 461: r3 = *(u32 *)(r4 + 56) | |
| 462: *(u32 *)(r1 + 46) = r3 | |
| 463: r3 = *(u32 *)(r4 + 52) | |
| 464: *(u32 *)(r1 + 42) = r3 | |
| 465: r3 = *(u32 *)(r4 + 48) | |
| 466: *(u32 *)(r1 + 38) = r3 | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr)) > data_end) | |
| 467: r3 = r1 | |
| 468: r3 += 62 | |
| 469: if r3 > r2 goto +1394 <LBB0_75> | |
| 470: r4 = 4 | |
| ; srh->routingType = 4; | |
| 471: *(u8 *)(r1 + 56) = r4 | |
| 472: r4 = 41 | |
| ; srh->nextHdr = nexthdr; | |
| 473: *(u8 *)(r1 + 54) = r4 | |
| ; srh->hdrExtLen = ((srh_len / 8) - 1); | |
| 474: r9 &= 255 | |
| 475: r9 >>= 3 | |
| 476: r9 += -1 | |
| 477: *(u8 *)(r1 + 55) = r9 | |
| ; srh->segmentsLeft = tb->segment_length - 1; | |
| 478: r4 = *(u32 *)(r7 + 40) | |
| 479: r5 = 0 | |
| ; srh->tag = 0; | |
| 480: *(u16 *)(r1 + 60) = r5 | |
| ; srh->flags = 0; | |
| 481: *(u8 *)(r1 + 59) = r5 | |
| ; srh->segmentsLeft = tb->segment_length - 1; | |
| 482: r5 = r4 | |
| 483: r5 += -1 | |
| ; srh->lastEntry = tb->segment_length - 1; | |
| 484: *(u8 *)(r1 + 58) = r5 | |
| ; srh->segmentsLeft = tb->segment_length - 1; | |
| 485: *(u8 *)(r1 + 57) = r5 | |
| ; if (i >= tb->segment_length) | |
| 486: if r4 == 0 goto +67 <LBB0_264> | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end) | |
| 487: r4 = r1 | |
| 488: r4 += 79 | |
| 489: if r4 > r2 goto +1374 <LBB0_75> | |
| ; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr)); | |
| 490: r4 = *(u32 *)(r7 + 60) | |
| 491: *(u32 *)(r3 + 12) = r4 | |
| 492: r4 = *(u32 *)(r7 + 56) | |
| 493: *(u32 *)(r3 + 8) = r4 | |
| 494: r4 = *(u32 *)(r7 + 52) | |
| 495: *(u32 *)(r3 + 4) = r4 | |
| 496: r4 = *(u32 *)(r7 + 48) | |
| 497: *(u32 *)(r3 + 0) = r4 | |
| ; if (i >= tb->segment_length) | |
| 498: r3 = *(u32 *)(r7 + 40) | |
| 499: r8 = 2 | |
| 500: if r8 > r3 goto +53 <LBB0_264> | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end) | |
| 501: r3 = r1 | |
| 502: r3 += 95 | |
| 503: if r3 > r2 goto +1360 <LBB0_75> | |
| ; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr)); | |
| 504: r3 = *(u32 *)(r7 + 76) | |
| 505: *(u32 *)(r1 + 90) = r3 | |
| 506: r3 = *(u32 *)(r7 + 72) | |
| 507: *(u32 *)(r1 + 86) = r3 | |
| 508: r3 = *(u32 *)(r7 + 68) | |
| 509: *(u32 *)(r1 + 82) = r3 | |
| 510: r3 = *(u32 *)(r7 + 64) | |
| 511: *(u32 *)(r1 + 78) = r3 | |
| ; if (i >= tb->segment_length) | |
| 512: r3 = *(u32 *)(r7 + 40) | |
| 513: r4 = 3 | |
| 514: if r4 > r3 goto +39 <LBB0_264> | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end) | |
| 515: r3 = r1 | |
| 516: r3 += 111 | |
| 517: if r3 > r2 goto +1346 <LBB0_75> | |
| ; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr)); | |
| 518: r3 = *(u32 *)(r7 + 92) | |
| 519: *(u32 *)(r1 + 106) = r3 | |
| 520: r3 = *(u32 *)(r7 + 88) | |
| 521: *(u32 *)(r1 + 102) = r3 | |
| 522: r3 = *(u32 *)(r7 + 84) | |
| 523: *(u32 *)(r1 + 98) = r3 | |
| 524: r3 = *(u32 *)(r7 + 80) | |
| 525: *(u32 *)(r1 + 94) = r3 | |
| ; if (i >= tb->segment_length) | |
| 526: r3 = *(u32 *)(r7 + 40) | |
| 527: r4 = 4 | |
| 528: if r4 > r3 goto +25 <LBB0_264> | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end) | |
| 529: r3 = r1 | |
| 530: r3 += 127 | |
| 531: if r3 > r2 goto +1332 <LBB0_75> | |
| ; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr)); | |
| 532: r3 = *(u32 *)(r7 + 108) | |
| 533: *(u32 *)(r1 + 122) = r3 | |
| 534: r3 = *(u32 *)(r7 + 104) | |
| 535: *(u32 *)(r1 + 118) = r3 | |
| 536: r3 = *(u32 *)(r7 + 100) | |
| 537: *(u32 *)(r1 + 114) = r3 | |
| 538: r3 = *(u32 *)(r7 + 96) | |
| 539: *(u32 *)(r1 + 110) = r3 | |
| ; if (i >= tb->segment_length) | |
| 540: r3 = *(u32 *)(r7 + 40) | |
| 541: r4 = 5 | |
| 542: if r4 > r3 goto +11 <LBB0_264> | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end) | |
| 543: r3 = r1 | |
| 544: r3 += 143 | |
| 545: if r3 > r2 goto +1318 <LBB0_75> | |
| ; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr)); | |
| 546: r2 = *(u32 *)(r7 + 124) | |
| 547: *(u32 *)(r1 + 138) = r2 | |
| 548: r2 = *(u32 *)(r7 + 120) | |
| 549: *(u32 *)(r1 + 134) = r2 | |
| 550: r2 = *(u32 *)(r7 + 116) | |
| 551: *(u32 *)(r1 + 130) = r2 | |
| 552: r2 = *(u32 *)(r7 + 112) | |
| 553: *(u32 *)(r1 + 126) = r2 | |
| 0000000000001150 LBB0_264: | |
| ; if (data + sizeof(*eth) > data_end) | |
| 554: r1 = *(u32 *)(r6 + 4) | |
| ; | |
| 555: r7 = *(u32 *)(r6 + 0) | |
| ; } | |
| 556: r2 = r7 | |
| 557: r2 += 14 | |
| 558: r8 = 2 | |
| 559: if r2 > r1 goto +1304 <LBB0_75> | |
| ; } | |
| 560: r4 = r7 | |
| 561: r4 += 34 | |
| ; } | |
| 562: r5 = r7 | |
| 563: r5 += 54 | |
| 564: r3 = 0 | |
| 565: r9 = 0 | |
| 566: if r5 > r1 goto +1 <LBB0_267> | |
| 567: r9 = r2 | |
| 00000000000011c0 LBB0_267: | |
| ; } | |
| 568: r5 = 0 | |
| 569: if r4 > r1 goto +1 <LBB0_269> | |
| 570: r5 = r2 | |
| 00000000000011d8 LBB0_269: | |
| ; if (data + sizeof(struct ethhdr) > data_end) | |
| 571: *(u64 *)(r10 - 8) = r3 | |
| 572: *(u64 *)(r10 - 16) = r3 | |
| 573: *(u64 *)(r10 - 24) = r3 | |
| 574: *(u64 *)(r10 - 32) = r3 | |
| 575: *(u64 *)(r10 - 40) = r3 | |
| 576: *(u64 *)(r10 - 48) = r3 | |
| 577: *(u64 *)(r10 - 56) = r3 | |
| 578: *(u64 *)(r10 - 64) = r3 | |
| 579: *(u64 *)(r10 - 168) = r5 | |
| ; h_proto = eth->h_proto; | |
| 580: if r5 == 0 goto +1270 <LBB0_74> | |
| 581: if r9 == 0 goto +1269 <LBB0_74> | |
| ; switch (h_proto) | |
| 582: r1 = *(u8 *)(r7 + 12) | |
| 583: r8 = *(u8 *)(r7 + 13) | |
| 584: r2 = 0 | |
| ; { | |
| 585: *(u64 *)(r10 - 8) = r2 | |
| 586: *(u64 *)(r10 - 16) = r2 | |
| 587: *(u64 *)(r10 - 24) = r2 | |
| 588: *(u64 *)(r10 - 32) = r2 | |
| 589: *(u64 *)(r10 - 40) = r2 | |
| 590: *(u64 *)(r10 - 48) = r2 | |
| 591: *(u64 *)(r10 - 56) = r2 | |
| 592: *(u64 *)(r10 - 64) = r2 | |
| ; switch (h_proto) | |
| 593: r8 <<= 8 | |
| 594: r8 |= r1 | |
| ; fib_params.family = AF_INET; | |
| 595: if r8 == 56710 goto +455 <LBB0_274> | |
| 596: if r8 != 8 goto +1254 <LBB0_74> | |
| 597: r1 = 2 | |
| ; fib_params.sport = 0; | |
| 598: *(u8 *)(r10 - 64) = r1 | |
| 599: r3 = *(u64 *)(r10 - 168) | |
| ; fib_params.dport = 0; | |
| 600: r1 = *(u8 *)(r3 + 1) | |
| 601: *(u8 *)(r10 - 52) = r1 | |
| ; fib_params.tot_len = bpf_ntohs(iph->tot_len); | |
| 602: r1 = *(u8 *)(r3 + 9) | |
| 603: r2 = 0 | |
| ; fib_params.ipv4_dst = iph->daddr; | |
| 604: *(u16 *)(r10 - 60) = r2 | |
| ; fib_params.ipv4_src = iph->saddr; | |
| 605: *(u16 *)(r10 - 62) = r2 | |
| ; fib_params.tot_len = bpf_ntohs(iph->tot_len); | |
| 606: *(u8 *)(r10 - 63) = r1 | |
| ; break; | |
| 607: r1 = *(u16 *)(r3 + 2) | |
| 608: r1 = be16 r1 | |
| 609: *(u16 *)(r10 - 58) = r1 | |
| ; | |
| 610: r1 = *(u32 *)(r3 + 12) | |
| 611: *(u32 *)(r10 - 48) = r1 | |
| ; case bpf_htons(ETH_P_IPV6): | |
| 612: r1 = *(u32 *)(r3 + 16) | |
| 613: *(u32 *)(r10 - 32) = r1 | |
| 614: goto +475 <LBB0_276> | |
| 0000000000001338 LBB0_76: | |
| ; void *data = (void *)(unsigned long)xdp->data; | |
| 615: r1 = *(u32 *)(r6 + 0) | |
| 616: r8 = 2 | |
| ; if (!iph) | |
| 617: if r1 == -14 goto +1246 <LBB0_75> | |
| 618: r2 = *(u32 *)(r6 + 4) | |
| 619: r3 = r1 | |
| 620: r3 += 34 | |
| 621: r8 = 2 | |
| 622: if r3 > r2 goto +1241 <LBB0_75> | |
| 623: r3 = r1 | |
| 624: r3 += 50 | |
| 625: r8 = 2 | |
| ; if (iph->protocol != IPPROTO_UDP) | |
| 626: if r3 > r2 goto +1237 <LBB0_75> | |
| 627: r2 = *(u8 *)(r1 + 23) | |
| 628: r8 = 2 | |
| 629: if r2 != 17 goto +1234 <LBB0_75> | |
| ; __builtin_memmove(&outer_saddr, &iph->saddr, sizeof(__u32)); | |
| 630: r2 = *(u32 *)(r1 + 26) | |
| 631: *(u32 *)(r10 - 72) = r2 | |
| ; __builtin_memmove(&outer_daddr, &iph->daddr, sizeof(__u32)); | |
| 632: r2 = *(u32 *)(r1 + 30) | |
| 633: *(u32 *)(r10 - 76) = r2 | |
| ; type = gtp1h->type; | |
| 634: r2 = *(u8 *)(r1 + 43) | |
| 635: r8 = 1 | |
| ; if (type != GTPV1_GPDU) | |
| 636: if r2 != 255 goto +1227 <LBB0_75> | |
| ; if (tb->s_prefixlen == 0 || tb->d_prefixlen == 0 || | |
| 637: r2 = *(u32 *)(r0 + 32) | |
| 638: r8 = 1 | |
| 639: if r2 == 0 goto +1224 <LBB0_75> | |
| 640: r8 = 1 | |
| 641: if r2 > 96 goto +1222 <LBB0_75> | |
| 642: r2 = *(u32 *)(r0 + 36) | |
| 643: r2 += -1 | |
| 644: r2 <<= 32 | |
| 645: r2 >>= 32 | |
| 646: r8 = 1 | |
| 647: if r2 > 55 goto +1216 <LBB0_75> | |
| 648: r2 = *(u32 *)(r1 + 46) | |
| 649: *(u64 *)(r10 - 176) = r2 | |
| 650: r9 = *(u16 *)(r1 + 44) | |
| ; __u32 seg_len = tb->segment_length + 1; | |
| 651: r7 = *(u32 *)(r0 + 40) | |
| ; if (bpf_xdp_adjust_head(xdp, (int)(decap_len))) | |
| 652: r1 = r6 | |
| 653: r2 = 36 | |
| 654: *(u64 *)(r10 - 168) = r0 | |
| 655: call 44 | |
| 656: r0 <<= 32 | |
| 657: r0 >>= 32 | |
| 658: r8 = 2 | |
| 659: if r0 != 0 goto +1204 <LBB0_75> | |
| 660: r7 += 1 | |
| 661: r1 = r7 | |
| 662: r1 <<= 4 | |
| 663: r1 |= 8 | |
| 664: *(u64 *)(r10 - 184) = r1 | |
| ; encap_len = sizeof(struct ipv6hdr) + srh_len; | |
| 665: r1 &= 255 | |
| 666: r2 = -40 | |
| ; if (bpf_xdp_adjust_head(xdp, 0 - (int)(encap_len))) | |
| 667: r2 -= r1 | |
| 668: r1 = r6 | |
| 669: call 44 | |
| 670: r3 = *(u64 *)(r10 - 168) | |
| 671: r0 <<= 32 | |
| 672: r0 >>= 32 | |
| 673: r8 = 2 | |
| 674: if r0 != 0 goto +1189 <LBB0_75> | |
| ; data_end = (void *)(long)xdp->data_end; | |
| 675: r1 = *(u32 *)(r6 + 4) | |
| ; data = (void *)(long)xdp->data; | |
| 676: r5 = *(u32 *)(r6 + 0) | |
| ; if ((void *)((long)new_eth + sizeof(struct ethhdr)) > data_end) | |
| 677: r2 = r5 | |
| 678: r2 += 14 | |
| 679: r8 = 1 | |
| 680: if r2 > r1 goto +1183 <LBB0_75> | |
| 681: r2 = 221 | |
| ; new_eth->h_proto = bpf_htons(ETH_P_IPV6); | |
| 682: *(u8 *)(r5 + 13) = r2 | |
| 683: r2 = 134 | |
| 684: *(u8 *)(r5 + 12) = r2 | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr)) > data_end) | |
| 685: r2 = r5 | |
| 686: r2 += 54 | |
| 687: r8 = 1 | |
| 688: if r2 > r1 goto +1175 <LBB0_75> | |
| 689: r9 = be16 r9 | |
| 690: r7 &= 65535 | |
| 691: r2 = 16427 | |
| ; v6h->nexthdr = NEXTHDR_ROUTING; | |
| 692: *(u16 *)(r5 + 20) = r2 | |
| 693: r2 = 96 | |
| ; v6h->priority = 0; | |
| 694: *(u8 *)(r5 + 14) = r2 | |
| 695: r2 = *(u64 *)(r10 - 184) | |
| 696: r2 &= 255 | |
| 697: r9 += r2 | |
| 698: r9 = be16 r9 | |
| ; v6h->payload_len = bpf_htons(srh_len + innerlen); | |
| 699: *(u16 *)(r5 + 18) = r9 | |
| ; __builtin_memcpy(&v6h->saddr, &tb->saddr, sizeof(struct in6_addr)); | |
| 700: r2 = *(u32 *)(r3 + 4) | |
| 701: *(u32 *)(r5 + 26) = r2 | |
| 702: r2 = *(u32 *)(r3 + 0) | |
| 703: *(u32 *)(r5 + 22) = r2 | |
| 704: r2 = *(u32 *)(r3 + 12) | |
| 705: *(u32 *)(r5 + 34) = r2 | |
| 706: r2 = *(u32 *)(r3 + 8) | |
| 707: *(u32 *)(r5 + 30) = r2 | |
| ; if (seg_len < 1 || MAX_SEGMENTS < seg_len) | |
| 708: r2 = r7 | |
| 709: r2 += -1 | |
| 710: *(u64 *)(r10 - 200) = r2 | |
| 711: r2 <<= 32 | |
| 712: r2 >>= 32 | |
| 713: r8 = 1 | |
| 714: if r2 > 4 goto +1149 <LBB0_75> | |
| 715: *(u64 *)(r10 - 192) = r7 | |
| ; __builtin_memcpy(&v6h->daddr, &tb->segments[seg_len - 1], sizeof(struct in6_addr)); | |
| 716: r2 <<= 4 | |
| 717: r0 = r3 | |
| 718: r0 += 48 | |
| 719: *(u64 *)(r10 - 208) = r0 | |
| 720: r0 += r2 | |
| 721: r2 = *(u32 *)(r0 + 12) | |
| 722: *(u32 *)(r5 + 50) = r2 | |
| 723: r2 = *(u32 *)(r0 + 8) | |
| 724: *(u32 *)(r5 + 46) = r2 | |
| 725: r2 = *(u32 *)(r0 + 4) | |
| 726: *(u32 *)(r5 + 42) = r2 | |
| 727: r2 = *(u32 *)(r0 + 0) | |
| 728: *(u32 *)(r5 + 38) = r2 | |
| ; s_offset = tb->s_prefixlen / 8; | |
| 729: r0 = *(u32 *)(r3 + 32) | |
| ; d_offset = tb->d_prefixlen / 8; | |
| 730: r2 = *(u32 *)(r3 + 36) | |
| ; args.session.pdu_session_id = tid; | |
| 731: *(u64 *)(r10 - 216) = r2 | |
| 732: r3 = *(u64 *)(r10 - 176) | |
| 733: r2 = r3 | |
| 734: r2 >>= 24 | |
| 735: *(u8 *)(r10 - 84) = r2 | |
| 736: r2 = r3 | |
| 737: r2 >>= 16 | |
| 738: *(u8 *)(r10 - 85) = r2 | |
| 739: r2 = r3 | |
| 740: r2 >>= 8 | |
| 741: *(u8 *)(r10 - 86) = r2 | |
| 742: *(u8 *)(r10 - 87) = r3 | |
| 743: r2 = 0 | |
| ; args.u = 0; | |
| 744: *(u8 *)(r10 - 88) = r2 | |
| 745: r2 = r0 | |
| 746: r2 &= 524256 | |
| ; if (sizeof(struct in6_addr) <= offset || | |
| 747: if r2 > 88 goto +565 <LBB0_99> | |
| 748: r7 = r0 | |
| 749: r7 >>= 3 | |
| 750: r7 &= 65535 | |
| 751: if r7 > 15 goto +561 <LBB0_99> | |
| 752: r0 &= 7 | |
| ; if (shift == 0) | |
| 753: if r0 == 0 goto +540 <LBB0_94> | |
| ; for (__u16 index = 0; index < sizeof(struct in6_addr); index++) | |
| 754: r3 = r5 | |
| 755: r3 += r7 | |
| 756: r2 = 8 | |
| 757: r2 -= r0 | |
| 758: *(u64 *)(r10 - 176) = r2 | |
| 759: r9 = 0 | |
| 760: goto +615 <LBB0_93> | |
| 00000000000017c8 LBB0_206: | |
| ; int len, srhoff = 0; | |
| 761: r1 = *(u32 *)(r6 + 4) | |
| ; struct srhhdr *srh; | |
| 762: r4 = *(u32 *)(r6 + 0) | |
| ; } | |
| 763: r3 = r4 | |
| 764: r3 += 54 | |
| 765: r5 = r4 | |
| 766: r5 += 62 | |
| 767: r2 = 0 | |
| 768: if r5 > r1 goto +1 <LBB0_208> | |
| 769: r2 = r3 | |
| 0000000000001810 LBB0_208: | |
| 770: r8 = 2 | |
| ; if (!srh || !v6h) | |
| 771: if r4 == -14 goto +1092 <LBB0_75> | |
| 772: r8 = 2 | |
| 773: if r3 > r1 goto +1090 <LBB0_75> | |
| 774: r8 = 2 | |
| 775: if r2 == 0 goto +1088 <LBB0_75> | |
| ; if (bpf_xdp_adjust_head(xdp, (int)(sizeof(struct ipv6hdr) + (srh->hdrExtLen + 1) * 8))) | |
| 776: r2 = *(u8 *)(r2 + 1) | |
| 777: r2 <<= 3 | |
| 778: r2 += 48 | |
| 779: r1 = r6 | |
| 780: call 44 | |
| 781: r0 <<= 32 | |
| 782: r0 >>= 32 | |
| 783: r8 = 2 | |
| 784: if r0 != 0 goto +1079 <LBB0_75> | |
| 785: r8 = 1 | |
| ; data_end = (void *)(unsigned long)xdp->data_end; | |
| 786: r1 = *(u32 *)(r6 + 4) | |
| ; data = (void *)(unsigned long)xdp->data; | |
| 787: r9 = *(u32 *)(r6 + 0) | |
| ; if (new_eth + 1 > data_end) | |
| 788: r2 = r9 | |
| 789: r2 += 14 | |
| 790: if r2 > r1 goto +1073 <LBB0_75> | |
| 791: r3 = 0 | |
| ; new_eth->h_proto = bpf_htons(proto); | |
| 792: *(u8 *)(r9 + 13) = r3 | |
| 793: r3 = 8 | |
| 794: *(u8 *)(r9 + 12) = r3 | |
| 795: r8 = 2 | |
| ; if (!iph) | |
| 796: if r2 == 0 goto +1067 <LBB0_75> | |
| 797: r3 = r9 | |
| 798: r3 += 34 | |
| 799: r8 = 2 | |
| 800: if r3 > r1 goto +1063 <LBB0_75> | |
| ; iph->daddr = ef->nexthop.v4.addr; | |
| 801: r3 = *(u32 *)(r7 + 16) | |
| 802: *(u32 *)(r9 + 30) = r3 | |
| 803: r3 = 0 | |
| ; for (i = 0; i < (sizeof(*iph) >> 1); i++) | |
| 804: *(u16 *)(r9 + 24) = r3 | |
| 805: r4 = 14 | |
| 0000000000001930 LBB0_216: | |
| ; } | |
| 806: r5 = r9 | |
| 807: r5 += r4 | |
| 808: r5 = *(u16 *)(r5 + 0) | |
| 809: r3 += r5 | |
| ; iph->check = ~((csum & 0xffff) + (csum >> 16)); | |
| 810: r4 += 2 | |
| 811: r5 = r4 | |
| 812: r5 <<= 32 | |
| 813: r5 >>= 32 | |
| 814: if r5 != 34 goto -9 <LBB0_216> | |
| ; /* Function to set source and destination mac of the packet */ | |
| 815: r4 = r3 | |
| 816: r4 >>= 16 | |
| 817: r4 += r3 | |
| 818: r4 ^= -1 | |
| 819: *(u16 *)(r9 + 24) = r4 | |
| 820: r8 = 2 | |
| ; } | |
| 821: if r2 > r1 goto +1042 <LBB0_75> | |
| 822: r2 = 0 | |
| ; if (data + sizeof(struct ethhdr) > data_end) | |
| 823: *(u64 *)(r10 - 8) = r2 | |
| 824: *(u64 *)(r10 - 16) = r2 | |
| 825: *(u64 *)(r10 - 24) = r2 | |
| 826: *(u64 *)(r10 - 32) = r2 | |
| 827: *(u64 *)(r10 - 40) = r2 | |
| 828: *(u64 *)(r10 - 48) = r2 | |
| 829: *(u64 *)(r10 - 56) = r2 | |
| 830: *(u64 *)(r10 - 64) = r2 | |
| ; } | |
| 831: r3 = r9 | |
| 832: r3 += 54 | |
| ; h_proto = eth->h_proto; | |
| 833: if r3 > r1 goto +1017 <LBB0_74> | |
| ; switch (h_proto) | |
| 834: r1 = *(u8 *)(r9 + 12) | |
| 835: r7 = *(u8 *)(r9 + 13) | |
| ; { | |
| 836: *(u64 *)(r10 - 8) = r2 | |
| 837: *(u64 *)(r10 - 16) = r2 | |
| 838: *(u64 *)(r10 - 24) = r2 | |
| 839: *(u64 *)(r10 - 32) = r2 | |
| 840: *(u64 *)(r10 - 40) = r2 | |
| 841: *(u64 *)(r10 - 48) = r2 | |
| 842: *(u64 *)(r10 - 56) = r2 | |
| 843: *(u64 *)(r10 - 64) = r2 | |
| ; switch (h_proto) | |
| 844: r7 <<= 8 | |
| 845: r7 |= r1 | |
| ; fib_params.family = AF_INET; | |
| 846: if r7 == 56710 goto +81 <LBB0_222> | |
| 847: if r7 != 8 goto +1003 <LBB0_74> | |
| 848: r1 = 2 | |
| ; fib_params.sport = 0; | |
| 849: *(u8 *)(r10 - 64) = r1 | |
| ; fib_params.dport = 0; | |
| 850: r1 = *(u8 *)(r9 + 15) | |
| 851: *(u8 *)(r10 - 52) = r1 | |
| ; fib_params.tot_len = bpf_ntohs(iph->tot_len); | |
| 852: r1 = *(u8 *)(r9 + 23) | |
| 853: r2 = 0 | |
| ; fib_params.ipv4_dst = iph->daddr; | |
| 854: *(u16 *)(r10 - 60) = r2 | |
| ; fib_params.ipv4_src = iph->saddr; | |
| 855: *(u16 *)(r10 - 62) = r2 | |
| ; fib_params.tot_len = bpf_ntohs(iph->tot_len); | |
| 856: *(u8 *)(r10 - 63) = r1 | |
| ; break; | |
| 857: r1 = *(u16 *)(r9 + 16) | |
| 858: r1 = be16 r1 | |
| 859: *(u16 *)(r10 - 58) = r1 | |
| ; | |
| 860: r1 = *(u32 *)(r9 + 26) | |
| 861: *(u32 *)(r10 - 48) = r1 | |
| ; case bpf_htons(ETH_P_IPV6): | |
| 862: r1 = *(u32 *)(r9 + 30) | |
| 863: *(u32 *)(r10 - 32) = r1 | |
| 864: goto +102 <LBB0_224> | |
| 0000000000001b08 LBB0_183: | |
| ; struct in6_addr *src = (struct in6_addr *)fib_params.ipv6_src; | |
| 865: r1 = *(u8 *)(r9 + 7) | |
| 866: r2 = 2 | |
| 867: if r2 > r1 goto +983 <LBB0_74> | |
| 868: *(u64 *)(r10 - 168) = r5 | |
| 869: r1 = 10 | |
| ; fib_params.l4_protocol = v6h->nexthdr; | |
| 870: *(u8 *)(r10 - 64) = r1 | |
| 871: r1 = 0 | |
| ; fib_params.sport = 0; | |
| 872: *(u8 *)(r10 - 52) = r1 | |
| ; fib_params.dport = 0; | |
| 873: r2 = *(u32 *)(r9 + 0) | |
| 874: r3 = 4294967055 ll | |
| 876: r2 &= r3 | |
| 877: *(u32 *)(r10 - 52) = r2 | |
| ; fib_params.tot_len = bpf_ntohs(v6h->payload_len); | |
| 878: r2 = *(u8 *)(r9 + 6) | |
| ; *dst = v6h->daddr; | |
| 879: *(u16 *)(r10 - 60) = r1 | |
| ; *src = v6h->saddr; | |
| 880: *(u16 *)(r10 - 62) = r1 | |
| ; fib_params.tot_len = bpf_ntohs(v6h->payload_len); | |
| 881: *(u8 *)(r10 - 63) = r2 | |
| ; break; | |
| 882: r1 = *(u16 *)(r9 + 4) | |
| 883: r1 = be16 r1 | |
| 884: *(u16 *)(r10 - 58) = r1 | |
| ; | |
| 885: r1 = *(u32 *)(r9 + 12) | |
| 886: r1 <<= 32 | |
| 887: r2 = *(u32 *)(r9 + 8) | |
| 888: r1 |= r2 | |
| 889: *(u64 *)(r10 - 48) = r1 | |
| 890: r1 = *(u32 *)(r9 + 20) | |
| 891: r1 <<= 32 | |
| 892: r2 = *(u32 *)(r9 + 16) | |
| 893: r1 |= r2 | |
| 894: *(u64 *)(r10 - 40) = r1 | |
| ; default: | |
| 895: r1 = *(u32 *)(r9 + 36) | |
| 896: r1 <<= 32 | |
| 897: r2 = *(u32 *)(r9 + 32) | |
| 898: r1 |= r2 | |
| 899: *(u64 *)(r10 - 24) = r1 | |
| 900: r1 = *(u32 *)(r9 + 24) | |
| 901: r2 = *(u32 *)(r9 + 28) | |
| 902: r2 <<= 32 | |
| 903: r2 |= r1 | |
| 904: *(u64 *)(r10 - 32) = r2 | |
| 0000000000001c48 LBB0_185: | |
| ; | |
| 905: r1 = *(u32 *)(r6 + 12) | |
| 906: *(u32 *)(r10 - 56) = r1 | |
| 907: r2 = r10 | |
| 908: r2 += -64 | |
| ; { | |
| 909: r1 = r6 | |
| 910: r3 = 64 | |
| 911: r4 = 0 | |
| 912: call 69 | |
| ; if (h_proto == bpf_htons(ETH_P_IP)) | |
| 913: r0 <<= 32 | |
| 914: r0 >>= 32 | |
| 915: if r0 s> 3 goto +4 <LBB0_191> | |
| 916: if r0 s> 1 goto +65 <LBB0_189> | |
| 917: if r0 == 0 goto +194 <LBB0_197> | |
| 918: if r0 == 1 goto +186 <LBB0_60> | |
| 919: goto +931 <LBB0_74> | |
| 0000000000001cc0 LBB0_191: | |
| 920: if r0 s> 5 goto +3 <LBB0_194> | |
| 921: if r0 == 4 goto +858 <LBB0_293> | |
| 922: if r0 == 5 goto +208 <LBB0_72> | |
| 923: goto +927 <LBB0_74> | |
| 0000000000001ce0 LBB0_194: | |
| 924: if r0 == 6 goto +876 <LBB0_294> | |
| 925: if r0 == 7 goto +890 <LBB0_295> | |
| 926: if r0 == 8 goto +232 <LBB0_296> | |
| 927: goto +923 <LBB0_74> | |
| 0000000000001d00 LBB0_222: | |
| ; struct in6_addr *src = (struct in6_addr *)fib_params.ipv6_src; | |
| 928: r1 = *(u8 *)(r9 + 21) | |
| 929: r2 = 2 | |
| 930: if r2 > r1 goto +920 <LBB0_74> | |
| 931: r1 = 10 | |
| ; fib_params.l4_protocol = v6h->nexthdr; | |
| 932: *(u8 *)(r10 - 64) = r1 | |
| 933: r1 = 0 | |
| ; fib_params.sport = 0; | |
| 934: *(u8 *)(r10 - 52) = r1 | |
| ; fib_params.dport = 0; | |
| 935: r2 = *(u32 *)(r9 + 14) | |
| 936: r3 = 4294967055 ll | |
| 938: r2 &= r3 | |
| 939: *(u32 *)(r10 - 52) = r2 | |
| ; fib_params.tot_len = bpf_ntohs(v6h->payload_len); | |
| 940: r2 = *(u8 *)(r9 + 20) | |
| ; *dst = v6h->daddr; | |
| 941: *(u16 *)(r10 - 60) = r1 | |
| ; *src = v6h->saddr; | |
| 942: *(u16 *)(r10 - 62) = r1 | |
| ; fib_params.tot_len = bpf_ntohs(v6h->payload_len); | |
| 943: *(u8 *)(r10 - 63) = r2 | |
| ; break; | |
| 944: r1 = *(u16 *)(r9 + 18) | |
| 945: r1 = be16 r1 | |
| 946: *(u16 *)(r10 - 58) = r1 | |
| ; | |
| 947: r1 = *(u32 *)(r9 + 26) | |
| 948: r1 <<= 32 | |
| 949: r2 = *(u32 *)(r9 + 22) | |
| 950: r1 |= r2 | |
| 951: *(u64 *)(r10 - 48) = r1 | |
| 952: r1 = *(u32 *)(r9 + 34) | |
| 953: r1 <<= 32 | |
| 954: r2 = *(u32 *)(r9 + 30) | |
| 955: r1 |= r2 | |
| 956: *(u64 *)(r10 - 40) = r1 | |
| ; default: | |
| 957: r1 = *(u32 *)(r9 + 50) | |
| 958: r1 <<= 32 | |
| 959: r2 = *(u32 *)(r9 + 46) | |
| 960: r1 |= r2 | |
| 961: *(u64 *)(r10 - 24) = r1 | |
| 962: r1 = *(u32 *)(r9 + 38) | |
| 963: r2 = *(u32 *)(r9 + 42) | |
| 964: r2 <<= 32 | |
| 965: r2 |= r1 | |
| 966: *(u64 *)(r10 - 32) = r2 | |
| 0000000000001e38 LBB0_224: | |
| ; | |
| 967: r1 = *(u32 *)(r6 + 12) | |
| 968: *(u32 *)(r10 - 56) = r1 | |
| 969: r2 = r10 | |
| 970: r2 += -64 | |
| ; { | |
| 971: r1 = r6 | |
| 972: r3 = 64 | |
| 973: r4 = 0 | |
| 974: call 69 | |
| ; if (h_proto == bpf_htons(ETH_P_IP)) | |
| 975: r0 <<= 32 | |
| 976: r0 >>= 32 | |
| 977: if r0 s> 3 goto +7 <LBB0_230> | |
| 978: if r0 s> 1 goto +169 <LBB0_228> | |
| 979: if r0 == 0 goto +189 <LBB0_236> | |
| 980: if r0 == 1 goto +124 <LBB0_60> | |
| 981: goto +869 <LBB0_74> | |
| 0000000000001eb0 LBB0_189: | |
| 982: if r0 == 2 goto +851 <LBB0_62> | |
| 983: if r0 == 3 goto +201 <LBB0_64> | |
| 984: goto +866 <LBB0_74> | |
| 0000000000001ec8 LBB0_230: | |
| 985: if r0 s> 5 goto +57 <LBB0_233> | |
| 986: if r0 == 4 goto +793 <LBB0_293> | |
| 987: if r0 == 5 goto +143 <LBB0_72> | |
| 988: goto +862 <LBB0_74> | |
| 0000000000001ee8 LBB0_41: | |
| ; struct in6_addr *src = (struct in6_addr *)fib_params.ipv6_src; | |
| 989: r1 = *(u8 *)(r9 + 7) | |
| 990: r2 = 2 | |
| 991: if r2 > r1 goto +859 <LBB0_74> | |
| 992: r1 = 10 | |
| ; fib_params.l4_protocol = v6h->nexthdr; | |
| 993: *(u8 *)(r10 - 64) = r1 | |
| 994: r1 = 0 | |
| ; fib_params.sport = 0; | |
| 995: *(u8 *)(r10 - 52) = r1 | |
| ; fib_params.dport = 0; | |
| 996: r2 = *(u32 *)(r9 + 0) | |
| 997: r3 = 4294967055 ll | |
| 999: r2 &= r3 | |
| 1000: *(u32 *)(r10 - 52) = r2 | |
| ; fib_params.tot_len = bpf_ntohs(v6h->payload_len); | |
| 1001: r2 = *(u8 *)(r9 + 6) | |
| ; *dst = v6h->daddr; | |
| 1002: *(u16 *)(r10 - 60) = r1 | |
| ; *src = v6h->saddr; | |
| 1003: *(u16 *)(r10 - 62) = r1 | |
| ; fib_params.tot_len = bpf_ntohs(v6h->payload_len); | |
| 1004: *(u8 *)(r10 - 63) = r2 | |
| ; break; | |
| 1005: r1 = *(u16 *)(r9 + 4) | |
| 1006: r1 = be16 r1 | |
| 1007: *(u16 *)(r10 - 58) = r1 | |
| ; | |
| 1008: r1 = *(u32 *)(r9 + 12) | |
| 1009: r1 <<= 32 | |
| 1010: r2 = *(u32 *)(r9 + 8) | |
| 1011: r1 |= r2 | |
| 1012: *(u64 *)(r10 - 48) = r1 | |
| 1013: r1 = *(u32 *)(r9 + 20) | |
| 1014: r1 <<= 32 | |
| 1015: r2 = *(u32 *)(r9 + 16) | |
| 1016: r1 |= r2 | |
| 1017: *(u64 *)(r10 - 40) = r1 | |
| ; default: | |
| 1018: r1 = *(u32 *)(r9 + 36) | |
| 1019: r1 <<= 32 | |
| 1020: r2 = *(u32 *)(r9 + 32) | |
| 1021: r1 |= r2 | |
| 1022: *(u64 *)(r10 - 24) = r1 | |
| 1023: r1 = *(u32 *)(r9 + 24) | |
| 1024: r2 = *(u32 *)(r9 + 28) | |
| 1025: r2 <<= 32 | |
| 1026: r2 |= r1 | |
| 1027: *(u64 *)(r10 - 32) = r2 | |
| 0000000000002020 LBB0_43: | |
| ; | |
| 1028: r1 = *(u32 *)(r6 + 12) | |
| 1029: *(u32 *)(r10 - 56) = r1 | |
| 1030: r2 = r10 | |
| 1031: r2 += -64 | |
| ; { | |
| 1032: r1 = r6 | |
| 1033: r3 = 64 | |
| 1034: r4 = 2 | |
| 1035: call 69 | |
| ; if (h_proto == bpf_htons(ETH_P_IP)) | |
| 1036: r0 <<= 32 | |
| 1037: r0 >>= 32 | |
| 1038: if r0 s> 3 goto +8 <LBB0_49> | |
| 1039: if r0 s> 1 goto +126 <LBB0_47> | |
| 1040: if r0 == 0 goto +186 <LBB0_55> | |
| 1041: if r0 == 1 goto +63 <LBB0_60> | |
| 1042: goto +808 <LBB0_74> | |
| 0000000000002098 LBB0_233: | |
| 1043: if r0 == 6 goto +757 <LBB0_294> | |
| 1044: if r0 == 7 goto +771 <LBB0_295> | |
| 1045: if r0 == 8 goto +113 <LBB0_296> | |
| 1046: goto +804 <LBB0_74> | |
| 00000000000020b8 LBB0_49: | |
| 1047: if r0 s> 5 goto +103 <LBB0_52> | |
| 1048: if r0 == 4 goto +731 <LBB0_293> | |
| 1049: if r0 == 5 goto +81 <LBB0_72> | |
| 1050: goto +800 <LBB0_74> | |
| 00000000000020d8 LBB0_274: | |
| ; struct in6_addr *src = (struct in6_addr *)fib_params.ipv6_src; | |
| 1051: r1 = *(u8 *)(r9 + 7) | |
| 1052: r2 = 2 | |
| 1053: if r2 > r1 goto +797 <LBB0_74> | |
| 1054: r1 = 10 | |
| ; fib_params.l4_protocol = v6h->nexthdr; | |
| 1055: *(u8 *)(r10 - 64) = r1 | |
| 1056: r1 = 0 | |
| ; fib_params.sport = 0; | |
| 1057: *(u8 *)(r10 - 52) = r1 | |
| ; fib_params.dport = 0; | |
| 1058: r2 = *(u32 *)(r9 + 0) | |
| 1059: r3 = 4294967055 ll | |
| 1061: r2 &= r3 | |
| 1062: *(u32 *)(r10 - 52) = r2 | |
| ; fib_params.tot_len = bpf_ntohs(v6h->payload_len); | |
| 1063: r2 = *(u8 *)(r9 + 6) | |
| ; *dst = v6h->daddr; | |
| 1064: *(u16 *)(r10 - 60) = r1 | |
| ; *src = v6h->saddr; | |
| 1065: *(u16 *)(r10 - 62) = r1 | |
| ; fib_params.tot_len = bpf_ntohs(v6h->payload_len); | |
| 1066: *(u8 *)(r10 - 63) = r2 | |
| ; break; | |
| 1067: r1 = *(u16 *)(r9 + 4) | |
| 1068: r1 = be16 r1 | |
| 1069: *(u16 *)(r10 - 58) = r1 | |
| ; | |
| 1070: r1 = *(u32 *)(r9 + 12) | |
| 1071: r1 <<= 32 | |
| 1072: r2 = *(u32 *)(r9 + 8) | |
| 1073: r1 |= r2 | |
| 1074: *(u64 *)(r10 - 48) = r1 | |
| 1075: r1 = *(u32 *)(r9 + 20) | |
| 1076: r1 <<= 32 | |
| 1077: r2 = *(u32 *)(r9 + 16) | |
| 1078: r1 |= r2 | |
| 1079: *(u64 *)(r10 - 40) = r1 | |
| ; default: | |
| 1080: r1 = *(u32 *)(r9 + 36) | |
| 1081: r1 <<= 32 | |
| 1082: r2 = *(u32 *)(r9 + 32) | |
| 1083: r1 |= r2 | |
| 1084: *(u64 *)(r10 - 24) = r1 | |
| 1085: r1 = *(u32 *)(r9 + 24) | |
| 1086: r2 = *(u32 *)(r9 + 28) | |
| 1087: r2 <<= 32 | |
| 1088: r2 |= r1 | |
| 1089: *(u64 *)(r10 - 32) = r2 | |
| 0000000000002210 LBB0_276: | |
| ; | |
| 1090: r1 = *(u32 *)(r6 + 12) | |
| 1091: *(u32 *)(r10 - 56) = r1 | |
| 1092: r2 = r10 | |
| 1093: r2 += -64 | |
| ; { | |
| 1094: r1 = r6 | |
| 1095: r3 = 64 | |
| 1096: r4 = 2 | |
| 1097: call 69 | |
| ; if (h_proto == bpf_htons(ETH_P_IP)) | |
| 1098: r0 <<= 32 | |
| 1099: r0 >>= 32 | |
| 1100: if r0 s> 3 goto +26 <LBB0_282> | |
| 1101: if r0 s> 1 goto +80 <LBB0_280> | |
| 1102: if r0 == 0 goto +139 <LBB0_288> | |
| 1103: if r0 == 1 goto +1 <LBB0_60> | |
| 1104: goto +746 <LBB0_74> | |
| 0000000000002288 LBB0_60: | |
| 1105: r1 = 0 | |
| 1106: *(u8 *)(r10 - 94) = r1 | |
| 1107: r1 = 17740 | |
| 1108: *(u16 *)(r10 - 96) = r1 | |
| 1109: r1 = 5712898879549882975 ll | |
| 1111: goto +674 <LBB0_61> | |
| 00000000000022c0 LBB0_197: | |
| ; v6h->hop_limit--; | |
| 1112: if r8 == 56710 goto +77 <LBB0_202> | |
| 1113: if r8 != 8 goto +79 <LBB0_203> | |
| 1114: r2 = *(u64 *)(r10 - 168) | |
| ; { | |
| 1115: r1 = *(u8 *)(r2 + 8) | |
| 1116: r1 += -1 | |
| 1117: *(u8 *)(r2 + 8) = r1 | |
| 1118: r3 = r2 | |
| ; iph->check = (__sum16)(check + (check >= 0xFFFF)); | |
| 1119: r1 = *(u16 *)(r2 + 10) | |
| 1120: r2 = 1 | |
| ; __attribute__((__always_inline__)) static inline __u16 wrapsum(__u32 sum) | |
| 1121: if r1 > 65533 goto +1 <LBB0_201> | |
| 1122: r2 = 0 | |
| 0000000000002318 LBB0_201: | |
| ; }; | |
| 1123: r1 += r2 | |
| ; __attribute__((__always_inline__)) static inline __u16 wrapsum(__u32 sum) | |
| 1124: r1 += 1 | |
| 1125: *(u16 *)(r3 + 10) = r1 | |
| 1126: goto +66 <LBB0_203> | |
| 0000000000002338 LBB0_282: | |
| ; if (h_proto == bpf_htons(ETH_P_IP)) | |
| 1127: if r0 s> 5 goto +27 <LBB0_285> | |
| 1128: if r0 == 4 goto +651 <LBB0_293> | |
| 1129: if r0 == 5 goto +1 <LBB0_72> | |
| 1130: goto +720 <LBB0_74> | |
| 0000000000002358 LBB0_72: | |
| 1131: r1 = 68 | |
| 1132: *(u16 *)(r10 - 92) = r1 | |
| 1133: r1 = 1162625601 | |
| 1134: *(u32 *)(r10 - 96) = r1 | |
| 1135: r1 = 6001403154407048799 ll | |
| 1137: *(u64 *)(r10 - 104) = r1 | |
| 1138: r1 = 6072350241902119756 ll | |
| 1140: *(u64 *)(r10 - 112) = r1 | |
| 1141: r1 = 6864129348661039170 ll | |
| 1143: *(u64 *)(r10 - 120) = r1 | |
| 1144: r1 = r10 | |
| 1145: r1 += -120 | |
| 1146: r2 = 30 | |
| 1147: goto +702 <LBB0_73> | |
| 00000000000023e0 LBB0_228: | |
| 1148: if r0 == 2 goto +685 <LBB0_62> | |
| 1149: if r0 == 3 goto +35 <LBB0_64> | |
| 1150: goto +700 <LBB0_74> | |
| 00000000000023f8 LBB0_52: | |
| 1151: if r0 == 6 goto +649 <LBB0_294> | |
| 1152: if r0 == 7 goto +663 <LBB0_295> | |
| 1153: if r0 == 8 goto +5 <LBB0_296> | |
| 1154: goto +696 <LBB0_74> | |
| 0000000000002418 LBB0_285: | |
| 1155: if r0 == 6 goto +645 <LBB0_294> | |
| 1156: if r0 == 7 goto +659 <LBB0_295> | |
| 1157: if r0 == 8 goto +1 <LBB0_296> | |
| 1158: goto +692 <LBB0_74> | |
| 0000000000002438 LBB0_296: | |
| 1159: r1 = 0 | |
| 1160: *(u8 *)(r10 - 92) = r1 | |
| 1161: r1 = 1145390149 | |
| 1162: *(u32 *)(r10 - 96) = r1 | |
| 1163: r1 = 4994033796443686495 ll | |
| 1165: goto +674 <LBB0_63> | |
| 0000000000002470 LBB0_47: | |
| 1166: if r0 == 2 goto +667 <LBB0_62> | |
| 1167: if r0 == 3 goto +17 <LBB0_64> | |
| 1168: goto +682 <LBB0_74> | |
| 0000000000002488 LBB0_236: | |
| ; v6h->hop_limit--; | |
| 1169: if r7 == 56710 goto +87 <LBB0_241> | |
| 1170: if r7 != 8 goto +89 <LBB0_242> | |
| ; { | |
| 1171: r1 = *(u8 *)(r9 + 22) | |
| 1172: r1 += -1 | |
| 1173: *(u8 *)(r9 + 22) = r1 | |
| ; iph->check = (__sum16)(check + (check >= 0xFFFF)); | |
| 1174: r1 = *(u16 *)(r9 + 24) | |
| 1175: r2 = 1 | |
| ; __attribute__((__always_inline__)) static inline __u16 wrapsum(__u32 sum) | |
| 1176: if r1 > 65533 goto +1 <LBB0_240> | |
| 1177: r2 = 0 | |
| 00000000000024d0 LBB0_240: | |
| ; }; | |
| 1178: r1 += r2 | |
| ; __attribute__((__always_inline__)) static inline __u16 wrapsum(__u32 sum) | |
| 1179: r1 += 1 | |
| 1180: *(u16 *)(r9 + 24) = r1 | |
| 1181: goto +78 <LBB0_242> | |
| 00000000000024f0 LBB0_280: | |
| ; if (h_proto == bpf_htons(ETH_P_IP)) | |
| 1182: if r0 == 2 goto +651 <LBB0_62> | |
| 1183: if r0 == 3 goto +1 <LBB0_64> | |
| 1184: goto +666 <LBB0_74> | |
| 0000000000002508 LBB0_64: | |
| 1185: r1 = 84 | |
| 1186: *(u16 *)(r10 - 96) = r1 | |
| 1187: r1 = 5278862288148910175 ll | |
| 1189: goto +630 <LBB0_65> | |
| 0000000000002530 LBB0_202: | |
| ; | |
| 1190: r1 = *(u8 *)(r9 + 7) | |
| 1191: r1 += -1 | |
| 1192: *(u8 *)(r9 + 7) = r1 | |
| 0000000000002548 LBB0_203: | |
| ; __u8 *dest = dmac; | |
| 1193: r1 = *(u32 *)(r10 - 56) | |
| 1194: *(u32 *)(r10 - 88) = r1 | |
| ; bpf_printk("BPF_FIB_LKUP_RET_BLACKHOLE"); | |
| 1195: r1 = *(u32 *)(r10 - 12) | |
| 1196: *(u32 *)(r10 - 128) = r1 | |
| 1197: r1 = *(u16 *)(r10 - 8) | |
| 1198: *(u16 *)(r10 - 124) = r1 | |
| ; case BPF_FIB_LKUP_RET_BLACKHOLE: /* dest is blackholed; can be dropped */ | |
| 1199: r1 = *(u16 *)(r10 - 4) | |
| 1200: r2 = r1 | |
| 1201: r2 <<= 16 | |
| 1202: r3 = *(u16 *)(r10 - 6) | |
| 1203: r2 |= r3 | |
| 1204: *(u32 *)(r10 - 136) = r2 | |
| 1205: r2 = *(u16 *)(r10 - 2) | |
| 1206: *(u16 *)(r10 - 132) = r2 | |
| ; | |
| 1207: *(u16 *)(r7 + 4) = r2 | |
| 1208: *(u16 *)(r7 + 2) = r1 | |
| 1209: *(u16 *)(r7 + 0) = r3 | |
| ; __attribute__((__always_inline__)) static inline struct ethhdr *get_eth(struct xdp_md *xdp) | |
| 1210: r1 = *(u16 *)(r10 - 124) | |
| 1211: *(u16 *)(r7 + 10) = r1 | |
| 1212: r1 = *(u32 *)(r10 - 128) | |
| 1213: *(u16 *)(r7 + 6) = r1 | |
| 1214: r1 >>= 16 | |
| 1215: *(u16 *)(r7 + 8) = r1 | |
| 1216: r2 = r10 | |
| ; __u8 *dest = dmac; | |
| 1217: r2 += -88 | |
| ; if (xdp->ingress_ifindex == ifindex) | |
| 1218: r1 = 0 ll | |
| 1220: call 1 | |
| 1221: r8 = 2 | |
| 1222: if r0 == 0 goto +641 <LBB0_75> | |
| ; return XDP_TX; | |
| 1223: r1 = *(u32 *)(r6 + 12) | |
| 1224: r2 = *(u32 *)(r10 - 88) | |
| 1225: if r1 != r2 goto +273 <LBB0_70> | |
| 1226: goto +223 <LBB0_69> | |
| 0000000000002658 LBB0_55: | |
| ; v6h->hop_limit--; | |
| 1227: if r8 == 56710 goto +186 <LBB0_66> | |
| 1228: if r8 != 8 goto +188 <LBB0_67> | |
| 1229: r2 = *(u64 *)(r10 - 168) | |
| ; { | |
| 1230: r1 = *(u8 *)(r2 + 8) | |
| 1231: r1 += -1 | |
| 1232: *(u8 *)(r2 + 8) = r1 | |
| ; iph->check = (__sum16)(check + (check >= 0xFFFF)); | |
| 1233: r1 = *(u16 *)(r2 + 10) | |
| 1234: r2 = 1 | |
| ; __attribute__((__always_inline__)) static inline __u16 wrapsum(__u32 sum) | |
| 1235: if r1 > 65533 goto +1 <LBB0_59> | |
| 1236: r2 = 0 | |
| 00000000000026a8 LBB0_59: | |
| ; }; | |
| 1237: r1 += r2 | |
| ; __attribute__((__always_inline__)) static inline __u16 wrapsum(__u32 sum) | |
| 1238: r1 += 1 | |
| 1239: r2 = *(u64 *)(r10 - 168) | |
| 1240: *(u16 *)(r2 + 10) = r1 | |
| 1241: goto +175 <LBB0_67> | |
| 00000000000026d0 LBB0_288: | |
| ; v6h->hop_limit--; | |
| 1242: if r8 == 56710 goto +219 <LBB0_297> | |
| 1243: if r8 != 8 goto +221 <LBB0_298> | |
| 1244: r2 = *(u64 *)(r10 - 168) | |
| ; { | |
| 1245: r1 = *(u8 *)(r2 + 8) | |
| 1246: r1 += -1 | |
| 1247: *(u8 *)(r2 + 8) = r1 | |
| ; iph->check = (__sum16)(check + (check >= 0xFFFF)); | |
| 1248: r1 = *(u16 *)(r2 + 10) | |
| 1249: r2 = 1 | |
| ; __attribute__((__always_inline__)) static inline __u16 wrapsum(__u32 sum) | |
| 1250: if r1 > 65533 goto +1 <LBB0_292> | |
| 1251: r2 = 0 | |
| 0000000000002720 LBB0_292: | |
| ; }; | |
| 1252: r1 += r2 | |
| ; __attribute__((__always_inline__)) static inline __u16 wrapsum(__u32 sum) | |
| 1253: r1 += 1 | |
| 1254: r2 = *(u64 *)(r10 - 168) | |
| 1255: *(u16 *)(r2 + 10) = r1 | |
| 1256: goto +208 <LBB0_298> | |
| 0000000000002748 LBB0_241: | |
| ; | |
| 1257: r1 = *(u8 *)(r9 + 21) | |
| 1258: r1 += -1 | |
| 1259: *(u8 *)(r9 + 21) = r1 | |
| 0000000000002760 LBB0_242: | |
| ; __u8 *dest = dmac; | |
| 1260: r1 = *(u32 *)(r10 - 56) | |
| 1261: *(u32 *)(r10 - 120) = r1 | |
| ; bpf_printk("BPF_FIB_LKUP_RET_BLACKHOLE"); | |
| 1262: r1 = *(u32 *)(r10 - 12) | |
| 1263: *(u32 *)(r10 - 128) = r1 | |
| 1264: r1 = *(u16 *)(r10 - 8) | |
| 1265: *(u16 *)(r10 - 124) = r1 | |
| ; case BPF_FIB_LKUP_RET_BLACKHOLE: /* dest is blackholed; can be dropped */ | |
| 1266: r1 = *(u16 *)(r10 - 4) | |
| 1267: r2 = r1 | |
| 1268: r2 <<= 16 | |
| 1269: r3 = *(u16 *)(r10 - 6) | |
| 1270: r2 |= r3 | |
| 1271: *(u32 *)(r10 - 136) = r2 | |
| 1272: r2 = *(u16 *)(r10 - 2) | |
| 1273: *(u16 *)(r10 - 132) = r2 | |
| ; | |
| 1274: *(u16 *)(r9 + 4) = r2 | |
| 1275: *(u16 *)(r9 + 2) = r1 | |
| 1276: *(u16 *)(r9 + 0) = r3 | |
| ; __attribute__((__always_inline__)) static inline struct ethhdr *get_eth(struct xdp_md *xdp) | |
| 1277: r1 = *(u16 *)(r10 - 124) | |
| 1278: *(u16 *)(r9 + 10) = r1 | |
| 1279: r1 = *(u32 *)(r10 - 128) | |
| 1280: *(u16 *)(r9 + 6) = r1 | |
| 1281: r1 >>= 16 | |
| 1282: *(u16 *)(r9 + 8) = r1 | |
| 1283: r2 = r10 | |
| ; __u8 *dest = dmac; | |
| 1284: r2 += -120 | |
| ; if (xdp->ingress_ifindex == ifindex) | |
| 1285: r1 = 0 ll | |
| 1287: call 1 | |
| 1288: r8 = 2 | |
| 1289: if r0 == 0 goto +574 <LBB0_75> | |
| ; return XDP_TX; | |
| 1290: r1 = *(u32 *)(r6 + 12) | |
| 1291: r2 = *(u32 *)(r10 - 120) | |
| 1292: if r1 != r2 goto +106 <LBB0_245> | |
| 1293: goto +156 <LBB0_69> | |
| 0000000000002870 LBB0_94: | |
| 1294: r2 = r5 | |
| 1295: r2 += 22 | |
| 1296: r2 += r7 | |
| ; if ((void *)v6addr + offset + py_size > data_end) | |
| 1297: r0 = r2 | |
| 1298: r0 += 4 | |
| 1299: if r0 > r1 goto +13 <LBB0_99> | |
| ; __builtin_memcpy(&v6addr->in6_u.u6_addr8[offset], pyload, py_size); | |
| 1300: r0 = *(u32 *)(r10 - 72) | |
| 1301: r7 = r0 | |
| 1302: r7 >>= 24 | |
| 1303: *(u8 *)(r2 + 3) = r7 | |
| 1304: r7 = r0 | |
| 1305: r7 >>= 16 | |
| 1306: *(u8 *)(r2 + 2) = r7 | |
| 1307: *(u8 *)(r2 + 0) = r0 | |
| 1308: r0 >>= 8 | |
| 1309: *(u8 *)(r2 + 1) = r0 | |
| 1310: goto +2 <LBB0_99> | |
| 00000000000028f8 LBB0_98: | |
| ; for (__u16 index = 0; index < sizeof(struct in6_addr); index++) | |
| 1311: r9 += 1 | |
| 1312: if r9 != 4 goto +63 <LBB0_93> | |
| 0000000000002908 LBB0_99: | |
| 1313: r8 = 2 | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr)) > data_end) | |
| 1314: r2 = r5 | |
| 1315: r2 += 62 | |
| 1316: if r2 > r1 goto +547 <LBB0_75> | |
| 1317: r3 = 0 | |
| ; srh->tag = 0; | |
| 1318: *(u16 *)(r5 + 60) = r3 | |
| ; srh->flags = 0; | |
| 1319: *(u8 *)(r5 + 59) = r3 | |
| 1320: r3 = *(u64 *)(r10 - 200) | |
| ; srh->lastEntry = seg_len - 1; | |
| 1321: *(u8 *)(r5 + 58) = r3 | |
| ; srh->segmentsLeft = seg_len - 1; | |
| 1322: *(u8 *)(r5 + 57) = r3 | |
| 1323: r3 = 4 | |
| ; srh->routingType = 4; | |
| 1324: *(u8 *)(r5 + 56) = r3 | |
| ; srh->nextHdr = IPPROTO_IPIP; | |
| 1325: *(u8 *)(r5 + 54) = r3 | |
| 1326: r3 = *(u64 *)(r10 - 184) | |
| ; srh->hdrExtLen = ((srh_len / 8) - 1); | |
| 1327: r3 &= 255 | |
| 1328: r3 >>= 3 | |
| 1329: r3 += -1 | |
| 1330: *(u8 *)(r5 + 55) = r3 | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) + 1) > data_end) | |
| 1331: r3 = r5 | |
| 1332: r3 += 79 | |
| 1333: if r3 > r1 goto +530 <LBB0_75> | |
| 1334: r3 = r5 | |
| 1335: r3 += 38 | |
| 1336: r7 = *(u64 *)(r10 - 216) | |
| 1337: r4 = r7 | |
| 1338: r4 &= 7 | |
| 1339: *(u64 *)(r10 - 176) = r4 | |
| 1340: r4 = r7 | |
| 1341: r4 >>= 3 | |
| 1342: *(u64 *)(r10 - 200) = r4 | |
| 1343: r4 = *(u64 *)(r10 - 208) | |
| ; __builtin_memcpy(&v6h->daddr, &tb->segments[0], sizeof(struct in6_addr)); | |
| 1344: r0 = *(u32 *)(r4 + 12) | |
| 1345: *(u32 *)(r3 + 12) = r0 | |
| 1346: r0 = *(u32 *)(r4 + 8) | |
| 1347: *(u32 *)(r3 + 8) = r0 | |
| 1348: r0 = *(u32 *)(r4 + 4) | |
| 1349: *(u32 *)(r3 + 4) = r0 | |
| 1350: r0 = *(u32 *)(r4 + 0) | |
| 1351: *(u32 *)(r3 + 0) = r0 | |
| 1352: r4 = *(u64 *)(r10 - 168) | |
| ; __builtin_memcpy(&srh->segments[0], &tb->daddr, sizeof(struct in6_addr)); | |
| 1353: r3 = *(u32 *)(r4 + 24) | |
| 1354: *(u32 *)(r2 + 8) = r3 | |
| 1355: r3 = *(u32 *)(r4 + 28) | |
| 1356: *(u32 *)(r2 + 12) = r3 | |
| 1357: r3 = *(u32 *)(r4 + 16) | |
| 1358: *(u32 *)(r2 + 0) = r3 | |
| 1359: r3 = *(u32 *)(r4 + 20) | |
| 1360: *(u32 *)(r2 + 4) = r3 | |
| 1361: r7 &= 524256 | |
| ; if (sizeof(struct in6_addr) <= offset || | |
| 1362: if r7 > 88 goto +174 <LBB0_111> | |
| 1363: r0 = *(u64 *)(r10 - 200) | |
| 1364: r0 &= 65535 | |
| 1365: if r0 > 15 goto +171 <LBB0_111> | |
| ; if (shift == 0) | |
| 1366: r3 = *(u64 *)(r10 - 176) | |
| 1367: if r3 == 0 goto +151 <LBB0_106> | |
| ; for (__u16 index = 0; index < sizeof(struct in6_addr); index++) | |
| 1368: r8 = r5 | |
| 1369: r8 += r0 | |
| 1370: r4 = 8 | |
| 1371: r3 = *(u64 *)(r10 - 176) | |
| 1372: r4 -= r3 | |
| 1373: *(u64 *)(r10 - 184) = r4 | |
| 1374: r7 = 0 | |
| 1375: goto +176 <LBB0_105> | |
| 0000000000002b00 LBB0_93: | |
| ; __u8 *v6val2 = (__u8 *)(void *)v6addr + offset + index + 1; | |
| 1376: r2 = r3 | |
| 1377: r2 += r9 | |
| ; if (v6val1 + 1 <= data_end && v6val2 + 1 <= data_end) | |
| 1378: r7 = r2 | |
| 1379: r7 += 23 | |
| 1380: if r7 > r1 goto -70 <LBB0_98> | |
| 1381: r7 = r2 | |
| 1382: r7 += 24 | |
| 1383: if r7 > r1 goto -73 <LBB0_98> | |
| 1384: r7 = r10 | |
| ; *v6val1 |= pyload[index] >> shift; | |
| 1385: r7 += -72 | |
| 1386: r7 += r9 | |
| 1387: r4 = *(u8 *)(r7 + 0) | |
| 1388: r4 >>= r0 | |
| 1389: r8 = *(u8 *)(r2 + 22) | |
| 1390: r8 |= r4 | |
| 1391: *(u8 *)(r2 + 22) = r8 | |
| ; *v6val2 |= pyload[index] << (8 - shift); | |
| 1392: r4 = *(u8 *)(r7 + 0) | |
| 1393: r7 = *(u64 *)(r10 - 176) | |
| 1394: r4 <<= r7 | |
| 1395: r7 = *(u8 *)(r2 + 23) | |
| 1396: r7 |= r4 | |
| 1397: *(u8 *)(r2 + 23) = r7 | |
| 1398: goto -88 <LBB0_98> | |
| 0000000000002bb8 LBB0_245: | |
| 1399: r1 = 29795 | |
| ; bpf_printk("failed rewrite nhop"); | |
| 1400: *(u16 *)(r10 - 52) = r1 | |
| 1401: r1 = 1701996900 | |
| 1402: *(u32 *)(r10 - 56) = r1 | |
| 1403: r1 = 7309940808237477735 ll | |
| 1405: *(u64 *)(r10 - 64) = r1 | |
| 1406: r1 = 0 | |
| 1407: *(u8 *)(r10 - 50) = r1 | |
| 1408: r1 = r10 | |
| 1409: r1 += -64 | |
| 1410: r2 = 15 | |
| 1411: call 6 | |
| ; return XDP_PASS; | |
| 1412: r2 = *(u32 *)(r10 - 120) | |
| 1413: goto +99 <LBB0_71> | |
| 0000000000002c30 LBB0_66: | |
| ; | |
| 1414: r1 = *(u8 *)(r9 + 7) | |
| 1415: r1 += -1 | |
| 1416: *(u8 *)(r9 + 7) = r1 | |
| 0000000000002c48 LBB0_67: | |
| ; __u8 *dest = dmac; | |
| 1417: r1 = *(u32 *)(r10 - 56) | |
| 1418: *(u32 *)(r10 - 88) = r1 | |
| ; bpf_printk("BPF_FIB_LKUP_RET_BLACKHOLE"); | |
| 1419: r1 = *(u32 *)(r10 - 12) | |
| 1420: *(u32 *)(r10 - 128) = r1 | |
| 1421: r1 = *(u16 *)(r10 - 8) | |
| 1422: *(u16 *)(r10 - 124) = r1 | |
| ; case BPF_FIB_LKUP_RET_BLACKHOLE: /* dest is blackholed; can be dropped */ | |
| 1423: r1 = *(u16 *)(r10 - 4) | |
| 1424: r2 = r1 | |
| 1425: r2 <<= 16 | |
| 1426: r3 = *(u16 *)(r10 - 6) | |
| 1427: r2 |= r3 | |
| 1428: *(u32 *)(r10 - 136) = r2 | |
| 1429: r2 = *(u16 *)(r10 - 2) | |
| 1430: *(u16 *)(r10 - 132) = r2 | |
| ; | |
| 1431: *(u16 *)(r7 + 4) = r2 | |
| 1432: *(u16 *)(r7 + 2) = r1 | |
| 1433: *(u16 *)(r7 + 0) = r3 | |
| ; __attribute__((__always_inline__)) static inline struct ethhdr *get_eth(struct xdp_md *xdp) | |
| 1434: r1 = *(u16 *)(r10 - 124) | |
| 1435: *(u16 *)(r7 + 10) = r1 | |
| 1436: r1 = *(u32 *)(r10 - 128) | |
| 1437: *(u16 *)(r7 + 6) = r1 | |
| 1438: r1 >>= 16 | |
| 1439: *(u16 *)(r7 + 8) = r1 | |
| 1440: r2 = r10 | |
| ; __u8 *dest = dmac; | |
| 1441: r2 += -88 | |
| ; if (xdp->ingress_ifindex == ifindex) | |
| 1442: r1 = 0 ll | |
| 1444: call 1 | |
| 1445: r8 = 2 | |
| 1446: if r0 == 0 goto +417 <LBB0_75> | |
| ; return XDP_TX; | |
| 1447: r1 = *(u32 *)(r6 + 12) | |
| 1448: r2 = *(u32 *)(r10 - 88) | |
| 1449: if r1 != r2 goto +49 <LBB0_70> | |
| 0000000000002d50 LBB0_69: | |
| 1450: r1 = 0 | |
| 1451: *(u8 *)(r10 - 58) = r1 | |
| 1452: r1 = 30836 | |
| 1453: *(u16 *)(r10 - 60) = r1 | |
| 1454: r1 = 544109938 | |
| 1455: *(u32 *)(r10 - 64) = r1 | |
| 1456: r1 = r10 | |
| 1457: r1 += -64 | |
| 1458: r2 = 7 | |
| 1459: call 6 | |
| 1460: r8 = 3 | |
| 1461: goto +402 <LBB0_75> | |
| 0000000000002db0 LBB0_297: | |
| ; | |
| 1462: r1 = *(u8 *)(r9 + 7) | |
| 1463: r1 += -1 | |
| 1464: *(u8 *)(r9 + 7) = r1 | |
| 0000000000002dc8 LBB0_298: | |
| ; __u8 *dest = dmac; | |
| 1465: r1 = *(u32 *)(r10 - 56) | |
| 1466: *(u32 *)(r10 - 88) = r1 | |
| ; bpf_printk("BPF_FIB_LKUP_RET_BLACKHOLE"); | |
| 1467: r1 = *(u32 *)(r10 - 12) | |
| 1468: *(u32 *)(r10 - 128) = r1 | |
| 1469: r1 = *(u16 *)(r10 - 8) | |
| 1470: *(u16 *)(r10 - 124) = r1 | |
| ; case BPF_FIB_LKUP_RET_BLACKHOLE: /* dest is blackholed; can be dropped */ | |
| 1471: r1 = *(u16 *)(r10 - 4) | |
| 1472: r2 = r1 | |
| 1473: r2 <<= 16 | |
| 1474: r3 = *(u16 *)(r10 - 6) | |
| 1475: r2 |= r3 | |
| 1476: *(u32 *)(r10 - 136) = r2 | |
| 1477: r2 = *(u16 *)(r10 - 2) | |
| 1478: *(u16 *)(r10 - 132) = r2 | |
| ; | |
| 1479: *(u16 *)(r7 + 4) = r2 | |
| 1480: *(u16 *)(r7 + 2) = r1 | |
| 1481: *(u16 *)(r7 + 0) = r3 | |
| ; __attribute__((__always_inline__)) static inline struct ethhdr *get_eth(struct xdp_md *xdp) | |
| 1482: r1 = *(u16 *)(r10 - 124) | |
| 1483: *(u16 *)(r7 + 10) = r1 | |
| 1484: r1 = *(u32 *)(r10 - 128) | |
| 1485: *(u16 *)(r7 + 6) = r1 | |
| 1486: r1 >>= 16 | |
| 1487: *(u16 *)(r7 + 8) = r1 | |
| 1488: r2 = r10 | |
| ; __u8 *dest = dmac; | |
| 1489: r2 += -88 | |
| ; if (xdp->ingress_ifindex == ifindex) | |
| 1490: r1 = 0 ll | |
| 1492: call 1 | |
| 1493: r8 = 2 | |
| 1494: if r0 == 0 goto +369 <LBB0_75> | |
| ; return XDP_TX; | |
| 1495: r1 = *(u32 *)(r6 + 12) | |
| 1496: r2 = *(u32 *)(r10 - 88) | |
| 1497: if r1 != r2 goto +1 <LBB0_70> | |
| 1498: goto -49 <LBB0_69> | |
| 0000000000002ed8 LBB0_70: | |
| 1499: r1 = 29795 | |
| 1500: *(u16 *)(r10 - 52) = r1 | |
| 1501: r1 = 1701996900 | |
| 1502: *(u32 *)(r10 - 56) = r1 | |
| 1503: r1 = 7309940808237477735 ll | |
| 1505: *(u64 *)(r10 - 64) = r1 | |
| 1506: r1 = 0 | |
| 1507: *(u8 *)(r10 - 50) = r1 | |
| 1508: r1 = r10 | |
| 1509: r1 += -64 | |
| 1510: r2 = 15 | |
| 1511: call 6 | |
| 1512: r2 = *(u32 *)(r10 - 88) | |
| 0000000000002f48 LBB0_71: | |
| 1513: r1 = 0 ll | |
| 1515: r3 = 0 | |
| 1516: call 51 | |
| 1517: r8 = r0 | |
| 1518: goto +345 <LBB0_75> | |
| 0000000000002f78 LBB0_106: | |
| 1519: r3 = r2 | |
| 1520: r3 += r0 | |
| ; if ((void *)v6addr + offset + py_size > data_end) | |
| 1521: r0 = r3 | |
| 1522: r0 += 4 | |
| 1523: if r0 > r1 goto +13 <LBB0_111> | |
| ; __builtin_memcpy(&v6addr->in6_u.u6_addr8[offset], pyload, py_size); | |
| 1524: r0 = *(u32 *)(r10 - 76) | |
| 1525: r7 = r0 | |
| 1526: r7 >>= 24 | |
| 1527: *(u8 *)(r3 + 3) = r7 | |
| 1528: r7 = r0 | |
| 1529: r7 >>= 16 | |
| 1530: *(u8 *)(r3 + 2) = r7 | |
| 1531: *(u8 *)(r3 + 0) = r0 | |
| 1532: r0 >>= 8 | |
| 1533: *(u8 *)(r3 + 1) = r0 | |
| 1534: goto +2 <LBB0_111> | |
| 0000000000002ff8 LBB0_110: | |
| ; for (__u16 index = 0; index < sizeof(struct in6_addr); index++) | |
| 1535: r7 += 1 | |
| 1536: if r7 != 4 goto +15 <LBB0_105> | |
| 0000000000003008 LBB0_111: | |
| 1537: r3 = *(u64 *)(r10 - 200) | |
| ; d_offset += sizeof(__u32); | |
| 1538: r3 += 4 | |
| 1539: r3 &= 65535 | |
| 1540: r0 = r3 | |
| ; if (sizeof(struct in6_addr) <= offset || | |
| 1541: if r3 > 10 goto +54 <LBB0_120> | |
| ; if (shift == 0) | |
| 1542: r3 = *(u64 *)(r10 - 176) | |
| 1543: if r3 == 0 goto +32 <LBB0_115> | |
| ; for (__u16 index = 0; index < sizeof(struct in6_addr); index++) | |
| 1544: r3 = r5 | |
| 1545: r3 += r0 | |
| 1546: r0 = 8 | |
| 1547: r4 = *(u64 *)(r10 - 176) | |
| 1548: r0 -= r4 | |
| 1549: *(u64 *)(r10 - 184) = r0 | |
| 1550: r7 = 0 | |
| 1551: goto +52 <LBB0_114> | |
| 0000000000003080 LBB0_105: | |
| ; __u8 *v6val2 = (__u8 *)(void *)v6addr + offset + index + 1; | |
| 1552: r3 = r8 | |
| 1553: r3 += r7 | |
| ; if (v6val1 + 1 <= data_end && v6val2 + 1 <= data_end) | |
| 1554: r9 = r3 | |
| 1555: r9 += 63 | |
| 1556: if r9 > r1 goto -22 <LBB0_110> | |
| 1557: r9 = r3 | |
| 1558: r9 += 64 | |
| 1559: if r9 > r1 goto -25 <LBB0_110> | |
| 1560: r9 = r10 | |
| ; *v6val1 |= pyload[index] >> shift; | |
| 1561: r9 += -76 | |
| 1562: r9 += r7 | |
| 1563: r4 = *(u8 *)(r9 + 0) | |
| 1564: r0 = *(u64 *)(r10 - 176) | |
| 1565: r4 >>= r0 | |
| 1566: r0 = *(u8 *)(r3 + 62) | |
| 1567: r0 |= r4 | |
| 1568: *(u8 *)(r3 + 62) = r0 | |
| ; *v6val2 |= pyload[index] << (8 - shift); | |
| 1569: r4 = *(u8 *)(r9 + 0) | |
| 1570: r0 = *(u64 *)(r10 - 184) | |
| 1571: r4 <<= r0 | |
| 1572: r0 = *(u8 *)(r3 + 63) | |
| 1573: r0 |= r4 | |
| 1574: *(u8 *)(r3 + 63) = r0 | |
| 1575: goto -41 <LBB0_110> | |
| 0000000000003140 LBB0_115: | |
| 1576: r4 = r2 | |
| 1577: r4 += r0 | |
| ; if ((void *)v6addr + offset + py_size > data_end) | |
| 1578: r3 = r4 | |
| 1579: r3 += 5 | |
| 1580: if r3 > r1 goto +15 <LBB0_120> | |
| ; __builtin_memcpy(&v6addr->in6_u.u6_addr8[offset], pyload, py_size); | |
| 1581: r3 = *(u8 *)(r10 - 84) | |
| 1582: *(u8 *)(r4 + 4) = r3 | |
| 1583: r3 = *(u32 *)(r10 - 88) | |
| 1584: r0 = r3 | |
| 1585: r0 >>= 24 | |
| 1586: *(u8 *)(r4 + 3) = r0 | |
| 1587: r0 = r3 | |
| 1588: r0 >>= 16 | |
| 1589: *(u8 *)(r4 + 2) = r0 | |
| 1590: *(u8 *)(r4 + 0) = r3 | |
| 1591: r3 >>= 8 | |
| 1592: *(u8 *)(r4 + 1) = r3 | |
| 1593: goto +2 <LBB0_120> | |
| 00000000000031d0 LBB0_119: | |
| ; for (__u16 index = 0; index < sizeof(struct in6_addr); index++) | |
| 1594: r7 += 1 | |
| 1595: if r7 != 5 goto +8 <LBB0_114> | |
| 00000000000031e0 LBB0_120: | |
| 1596: r8 = 2 | |
| ; for (__u16 i = 1; i < MAX_SEGMENTS; i++) | |
| 1597: r3 = *(u64 *)(r10 - 192) | |
| 1598: if r8 > r3 goto +62 <LBB0_125> | |
| 1599: r4 = 1 | |
| 1600: r5 += 63 | |
| 1601: r3 = -4294967296 ll | |
| 1603: goto +24 <LBB0_122> | |
| 0000000000003220 LBB0_114: | |
| ; __u8 *v6val2 = (__u8 *)(void *)v6addr + offset + index + 1; | |
| 1604: r8 = r3 | |
| 1605: r8 += r7 | |
| ; if (v6val1 + 1 <= data_end && v6val2 + 1 <= data_end) | |
| 1606: r4 = r8 | |
| 1607: r4 += 63 | |
| 1608: if r4 > r1 goto -15 <LBB0_119> | |
| 1609: r4 = r8 | |
| 1610: r4 += 64 | |
| 1611: if r4 > r1 goto -18 <LBB0_119> | |
| 1612: r4 = r10 | |
| ; *v6val1 |= pyload[index] >> shift; | |
| 1613: r4 += -88 | |
| 1614: r4 += r7 | |
| 1615: r9 = *(u8 *)(r4 + 0) | |
| 1616: r0 = *(u64 *)(r10 - 176) | |
| 1617: r9 >>= r0 | |
| 1618: r0 = *(u8 *)(r8 + 62) | |
| 1619: r0 |= r9 | |
| 1620: *(u8 *)(r8 + 62) = r0 | |
| ; *v6val2 |= pyload[index] << (8 - shift); | |
| 1621: r4 = *(u8 *)(r4 + 0) | |
| 1622: r0 = *(u64 *)(r10 - 184) | |
| 1623: r4 <<= r0 | |
| 1624: r0 = *(u8 *)(r8 + 63) | |
| 1625: r0 |= r4 | |
| 1626: *(u8 *)(r8 + 63) = r0 | |
| 1627: goto -34 <LBB0_119> | |
| 00000000000032e0 LBB0_122: | |
| ; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 2) + 1) > data_end) | |
| 1628: r0 = r4 | |
| 1629: r0 <<= 4 | |
| 1630: r0 += 32 | |
| 1631: r0 <<= 32 | |
| 1632: r0 >>= 32 | |
| 1633: r7 = r5 | |
| 1634: r7 += r0 | |
| 1635: if r7 > r1 goto +228 <LBB0_75> | |
| ; __builtin_memcpy(&srh->segments[i], &tb->segments[i - 1], sizeof(struct in6_addr)); | |
| 1636: r0 = r4 | |
| 1637: r0 <<= 32 | |
| 1638: r7 = r0 | |
| 1639: r7 >>= 32 | |
| 1640: r7 <<= 4 | |
| 1641: r9 = r2 | |
| 1642: r9 += r7 | |
| 1643: r0 += r3 | |
| 1644: r0 s>>= 32 | |
| 1645: r0 <<= 4 | |
| 1646: r7 = *(u64 *)(r10 - 168) | |
| 1647: r7 += r0 | |
| 1648: r0 = *(u32 *)(r7 + 60) | |
| 1649: *(u32 *)(r9 + 12) = r0 | |
| 1650: r0 = *(u32 *)(r7 + 56) | |
| 1651: *(u32 *)(r9 + 8) = r0 | |
| 1652: r0 = *(u32 *)(r7 + 52) | |
| 1653: *(u32 *)(r9 + 4) = r0 | |
| 1654: r0 = *(u32 *)(r7 + 48) | |
| 1655: *(u32 *)(r9 + 0) = r0 | |
| ; for (__u16 i = 1; i < MAX_SEGMENTS; i++) | |
| 1656: r4 += 1 | |
| 1657: r4 &= 65535 | |
| 1658: if r4 > 4 goto +2 <LBB0_125> | |
| 1659: r0 = *(u64 *)(r10 - 192) | |
| 1660: if r0 > r4 goto -33 <LBB0_122> | |
| 00000000000033e8 LBB0_125: | |
| ; if (data + sizeof(*eth) > data_end) | |
| 1661: r1 = *(u32 *)(r6 + 4) | |
| ; | |
| 1662: r7 = *(u32 *)(r6 + 0) | |
| ; } | |
| 1663: r2 = r7 | |
| 1664: r2 += 14 | |
| 1665: if r2 > r1 goto +198 <LBB0_75> | |
| ; } | |
| 1666: r4 = r7 | |
| 1667: r4 += 34 | |
| ; } | |
| 1668: r5 = r7 | |
| 1669: r5 += 54 | |
| 1670: r3 = 0 | |
| 1671: r9 = 0 | |
| 1672: if r5 > r1 goto +1 <LBB0_128> | |
| 1673: r9 = r2 | |
| 0000000000003450 LBB0_128: | |
| ; } | |
| 1674: r5 = 0 | |
| 1675: *(u64 *)(r10 - 168) = r5 | |
| 1676: if r4 > r1 goto +1 <LBB0_130> | |
| 1677: *(u64 *)(r10 - 168) = r2 | |
| 0000000000003470 LBB0_130: | |
| ; if (data + sizeof(struct ethhdr) > data_end) | |
| 1678: *(u64 *)(r10 - 8) = r3 | |
| 1679: *(u64 *)(r10 - 16) = r3 | |
| 1680: *(u64 *)(r10 - 24) = r3 | |
| 1681: *(u64 *)(r10 - 32) = r3 | |
| 1682: *(u64 *)(r10 - 40) = r3 | |
| 1683: *(u64 *)(r10 - 48) = r3 | |
| 1684: *(u64 *)(r10 - 56) = r3 | |
| 1685: *(u64 *)(r10 - 64) = r3 | |
| ; h_proto = eth->h_proto; | |
| 1686: r1 = *(u64 *)(r10 - 168) | |
| 1687: if r1 == 0 goto +163 <LBB0_74> | |
| 1688: if r9 == 0 goto +162 <LBB0_74> | |
| ; switch (h_proto) | |
| 1689: r1 = *(u8 *)(r7 + 12) | |
| 1690: r8 = *(u8 *)(r7 + 13) | |
| 1691: r2 = 0 | |
| ; { | |
| 1692: *(u64 *)(r10 - 8) = r2 | |
| 1693: *(u64 *)(r10 - 16) = r2 | |
| 1694: *(u64 *)(r10 - 24) = r2 | |
| 1695: *(u64 *)(r10 - 32) = r2 | |
| 1696: *(u64 *)(r10 - 40) = r2 | |
| 1697: *(u64 *)(r10 - 48) = r2 | |
| 1698: *(u64 *)(r10 - 56) = r2 | |
| 1699: *(u64 *)(r10 - 64) = r2 | |
| ; switch (h_proto) | |
| 1700: r8 <<= 8 | |
| 1701: r8 |= r1 | |
| ; fib_params.family = AF_INET; | |
| 1702: if r8 == 56710 goto +19 <LBB0_135> | |
| 1703: if r8 != 8 goto +147 <LBB0_74> | |
| 1704: r1 = 2 | |
| ; fib_params.sport = 0; | |
| 1705: *(u8 *)(r10 - 64) = r1 | |
| 1706: r3 = *(u64 *)(r10 - 168) | |
| ; fib_params.dport = 0; | |
| 1707: r1 = *(u8 *)(r3 + 1) | |
| 1708: *(u8 *)(r10 - 52) = r1 | |
| ; fib_params.tot_len = bpf_ntohs(iph->tot_len); | |
| 1709: r1 = *(u8 *)(r3 + 9) | |
| 1710: r2 = 0 | |
| ; fib_params.ipv4_dst = iph->daddr; | |
| 1711: *(u16 *)(r10 - 60) = r2 | |
| ; fib_params.ipv4_src = iph->saddr; | |
| 1712: *(u16 *)(r10 - 62) = r2 | |
| ; fib_params.tot_len = bpf_ntohs(iph->tot_len); | |
| 1713: *(u8 *)(r10 - 63) = r1 | |
| ; break; | |
| 1714: r1 = *(u16 *)(r3 + 2) | |
| 1715: r1 = be16 r1 | |
| 1716: *(u16 *)(r10 - 58) = r1 | |
| ; | |
| 1717: r1 = *(u32 *)(r3 + 12) | |
| 1718: *(u32 *)(r10 - 48) = r1 | |
| ; case bpf_htons(ETH_P_IPV6): | |
| 1719: r1 = *(u32 *)(r3 + 16) | |
| 1720: *(u32 *)(r10 - 32) = r1 | |
| 1721: goto +39 <LBB0_137> | |
| 00000000000035d0 LBB0_135: | |
| ; struct in6_addr *src = (struct in6_addr *)fib_params.ipv6_src; | |
| 1722: r1 = *(u8 *)(r9 + 7) | |
| 1723: r2 = 2 | |
| 1724: if r2 > r1 goto +126 <LBB0_74> | |
| 1725: r1 = 10 | |
| ; fib_params.l4_protocol = v6h->nexthdr; | |
| 1726: *(u8 *)(r10 - 64) = r1 | |
| 1727: r1 = 0 | |
| ; fib_params.sport = 0; | |
| 1728: *(u8 *)(r10 - 52) = r1 | |
| ; fib_params.dport = 0; | |
| 1729: r2 = *(u32 *)(r9 + 0) | |
| 1730: r3 = 4294967055 ll | |
| 1732: r2 &= r3 | |
| 1733: *(u32 *)(r10 - 52) = r2 | |
| ; fib_params.tot_len = bpf_ntohs(v6h->payload_len); | |
| 1734: r2 = *(u8 *)(r9 + 6) | |
| ; *dst = v6h->daddr; | |
| 1735: *(u16 *)(r10 - 60) = r1 | |
| ; *src = v6h->saddr; | |
| 1736: *(u16 *)(r10 - 62) = r1 | |
| ; fib_params.tot_len = bpf_ntohs(v6h->payload_len); | |
| 1737: *(u8 *)(r10 - 63) = r2 | |
| ; break; | |
| 1738: r1 = *(u16 *)(r9 + 4) | |
| 1739: r1 = be16 r1 | |
| 1740: *(u16 *)(r10 - 58) = r1 | |
| ; | |
| 1741: r1 = *(u32 *)(r9 + 12) | |
| 1742: r1 <<= 32 | |
| 1743: r2 = *(u32 *)(r9 + 8) | |
| 1744: r1 |= r2 | |
| 1745: *(u64 *)(r10 - 48) = r1 | |
| 1746: r1 = *(u32 *)(r9 + 20) | |
| 1747: r1 <<= 32 | |
| 1748: r2 = *(u32 *)(r9 + 16) | |
| 1749: r1 |= r2 | |
| 1750: *(u64 *)(r10 - 40) = r1 | |
| ; default: | |
| 1751: r1 = *(u32 *)(r9 + 36) | |
| 1752: r1 <<= 32 | |
| 1753: r2 = *(u32 *)(r9 + 32) | |
| 1754: r1 |= r2 | |
| 1755: *(u64 *)(r10 - 24) = r1 | |
| 1756: r1 = *(u32 *)(r9 + 24) | |
| 1757: r2 = *(u32 *)(r9 + 28) | |
| 1758: r2 <<= 32 | |
| 1759: r2 |= r1 | |
| 1760: *(u64 *)(r10 - 32) = r2 | |
| 0000000000003708 LBB0_137: | |
| ; | |
| 1761: r1 = *(u32 *)(r6 + 12) | |
| 1762: *(u32 *)(r10 - 56) = r1 | |
| 1763: r2 = r10 | |
| 1764: r2 += -64 | |
| ; { | |
| 1765: r1 = r6 | |
| 1766: r3 = 64 | |
| 1767: r4 = 2 | |
| 1768: call 69 | |
| ; if (h_proto == bpf_htons(ETH_P_IP)) | |
| 1769: r0 <<= 32 | |
| 1770: r0 >>= 32 | |
| 1771: if r0 s> 3 goto +4 <LBB0_143> | |
| 1772: if r0 s> 1 goto +58 <LBB0_141> | |
| 1773: if r0 == 0 goto +95 <LBB0_149> | |
| 1774: if r0 == 1 goto -670 <LBB0_60> | |
| 1775: goto +75 <LBB0_74> | |
| 0000000000003780 LBB0_143: | |
| 1776: if r0 s> 5 goto +20 <LBB0_146> | |
| 1777: if r0 == 4 goto +2 <LBB0_293> | |
| 1778: if r0 == 5 goto -648 <LBB0_72> | |
| 1779: goto +71 <LBB0_74> | |
| 00000000000037a0 LBB0_293: | |
| 1780: r1 = 0 | |
| 1781: *(u8 *)(r10 - 94) = r1 | |
| 1782: r1 = 17477 | |
| 1783: *(u16 *)(r10 - 96) = r1 | |
| 1784: r1 = 4924482092803247711 ll | |
| 00000000000037d0 LBB0_61: | |
| 1786: *(u64 *)(r10 - 104) = r1 | |
| 1787: r1 = 6072350241902119756 ll | |
| 1789: *(u64 *)(r10 - 112) = r1 | |
| 1790: r1 = 6864129348661039170 ll | |
| 1792: *(u64 *)(r10 - 120) = r1 | |
| 1793: r1 = r10 | |
| 1794: r1 += -120 | |
| 1795: r2 = 27 | |
| 1796: goto +53 <LBB0_73> | |
| 0000000000003828 LBB0_146: | |
| 1797: if r0 == 6 goto +3 <LBB0_294> | |
| 1798: if r0 == 7 goto +17 <LBB0_295> | |
| 1799: if r0 == 8 goto -641 <LBB0_296> | |
| 1800: goto +50 <LBB0_74> | |
| 0000000000003848 LBB0_294: | |
| 1801: r1 = 5527372 | |
| 1802: *(u32 *)(r10 - 96) = r1 | |
| 1803: r1 = 6868077759140091231 ll | |
| 1805: *(u64 *)(r10 - 104) = r1 | |
| 1806: r1 = 6072350241902119756 ll | |
| 1808: *(u64 *)(r10 - 112) = r1 | |
| 1809: r1 = 6864129348661039170 ll | |
| 1811: *(u64 *)(r10 - 120) = r1 | |
| 1812: r1 = r10 | |
| 1813: r1 += -120 | |
| 1814: r2 = 28 | |
| 1815: goto +34 <LBB0_73> | |
| 00000000000038c0 LBB0_295: | |
| 1816: r1 = 72 | |
| 1817: *(u16 *)(r10 - 96) = r1 | |
| 1818: r1 = 5136713052901559903 ll | |
| 00000000000038e0 LBB0_65: | |
| 1820: *(u64 *)(r10 - 104) = r1 | |
| 1821: r1 = 6072350241902119756 ll | |
| 1823: *(u64 *)(r10 - 112) = r1 | |
| 1824: r1 = 6864129348661039170 ll | |
| 1826: *(u64 *)(r10 - 120) = r1 | |
| 1827: r1 = r10 | |
| 1828: r1 += -120 | |
| 1829: r2 = 26 | |
| 1830: goto +19 <LBB0_73> | |
| 0000000000003938 LBB0_141: | |
| 1831: if r0 == 2 goto +2 <LBB0_62> | |
| 1832: if r0 == 3 goto -648 <LBB0_64> | |
| 1833: goto +17 <LBB0_74> | |
| 0000000000003950 LBB0_62: | |
| 1834: r1 = 0 | |
| 1835: *(u8 *)(r10 - 92) = r1 | |
| 1836: r1 = 1162625601 | |
| 1837: *(u32 *)(r10 - 96) = r1 | |
| 1838: r1 = 5207077360159839583 ll | |
| 0000000000003980 LBB0_63: | |
| 1840: *(u64 *)(r10 - 104) = r1 | |
| 1841: r1 = 6072350241902119756 ll | |
| 1843: *(u64 *)(r10 - 112) = r1 | |
| 1844: r1 = 6864129348661039170 ll | |
| 1846: *(u64 *)(r10 - 120) = r1 | |
| 1847: r1 = r10 | |
| 1848: r1 += -120 | |
| 1849: r2 = 29 | |
| 00000000000039d0 LBB0_73: | |
| 1850: call 6 | |
| 00000000000039d8 LBB0_74: | |
| 1851: r1 = 7368552 | |
| 1852: *(u32 *)(r10 - 48) = r1 | |
| 1853: r1 = 7935454094086535013 ll | |
| 1855: *(u64 *)(r10 - 56) = r1 | |
| 1856: r1 = 8223683306351845734 ll | |
| 1858: *(u64 *)(r10 - 64) = r1 | |
| 1859: r1 = r10 | |
| 1860: r1 += -64 | |
| 1861: r2 = 20 | |
| 1862: call 6 | |
| 1863: r8 = 2 | |
| 0000000000003a40 LBB0_75: | |
| 1864: r1 = r6 | |
| 1865: r2 = 0 ll | |
| 1867: r3 = r8 | |
| 1868: goto -1845 <LBB0_9> | |
| 0000000000003a68 LBB0_149: | |
| ; v6h->hop_limit--; | |
| 1869: if r8 == 56710 goto +14 <LBB0_154> | |
| 1870: if r8 != 8 goto +16 <LBB0_155> | |
| 1871: r2 = *(u64 *)(r10 - 168) | |
| ; { | |
| 1872: r1 = *(u8 *)(r2 + 8) | |
| 1873: r1 += -1 | |
| 1874: *(u8 *)(r2 + 8) = r1 | |
| ; iph->check = (__sum16)(check + (check >= 0xFFFF)); | |
| 1875: r1 = *(u16 *)(r2 + 10) | |
| 1876: r2 = 1 | |
| ; __attribute__((__always_inline__)) static inline __u16 wrapsum(__u32 sum) | |
| 1877: if r1 > 65533 goto +1 <LBB0_153> | |
| 1878: r2 = 0 | |
| 0000000000003ab8 LBB0_153: | |
| ; }; | |
| 1879: r1 += r2 | |
| ; __attribute__((__always_inline__)) static inline __u16 wrapsum(__u32 sum) | |
| 1880: r1 += 1 | |
| 1881: r2 = *(u64 *)(r10 - 168) | |
| 1882: *(u16 *)(r2 + 10) = r1 | |
| 1883: goto +3 <LBB0_155> | |
| 0000000000003ae0 LBB0_154: | |
| ; | |
| 1884: r1 = *(u8 *)(r9 + 7) | |
| 1885: r1 += -1 | |
| 1886: *(u8 *)(r9 + 7) = r1 | |
| 0000000000003af8 LBB0_155: | |
| ; __u8 *dest = dmac; | |
| 1887: r1 = *(u32 *)(r10 - 56) | |
| 1888: *(u32 *)(r10 - 68) = r1 | |
| ; bpf_printk("BPF_FIB_LKUP_RET_BLACKHOLE"); | |
| 1889: r1 = *(u32 *)(r10 - 12) | |
| 1890: *(u32 *)(r10 - 128) = r1 | |
| 1891: r1 = *(u16 *)(r10 - 8) | |
| 1892: *(u16 *)(r10 - 124) = r1 | |
| ; case BPF_FIB_LKUP_RET_BLACKHOLE: /* dest is blackholed; can be dropped */ | |
| 1893: r1 = *(u16 *)(r10 - 4) | |
| 1894: r2 = r1 | |
| 1895: r2 <<= 16 | |
| 1896: r3 = *(u16 *)(r10 - 6) | |
| 1897: r2 |= r3 | |
| 1898: *(u32 *)(r10 - 136) = r2 | |
| 1899: r2 = *(u16 *)(r10 - 2) | |
| 1900: *(u16 *)(r10 - 132) = r2 | |
| ; | |
| 1901: *(u16 *)(r7 + 4) = r2 | |
| 1902: *(u16 *)(r7 + 2) = r1 | |
| 1903: *(u16 *)(r7 + 0) = r3 | |
| ; __attribute__((__always_inline__)) static inline struct ethhdr *get_eth(struct xdp_md *xdp) | |
| 1904: r1 = *(u16 *)(r10 - 124) | |
| 1905: *(u16 *)(r7 + 10) = r1 | |
| 1906: r1 = *(u32 *)(r10 - 128) | |
| 1907: *(u16 *)(r7 + 6) = r1 | |
| 1908: r1 >>= 16 | |
| 1909: *(u16 *)(r7 + 8) = r1 | |
| 1910: r2 = r10 | |
| ; __u8 *dest = dmac; | |
| 1911: r2 += -68 | |
| ; if (xdp->ingress_ifindex == ifindex) | |
| 1912: r1 = 0 ll | |
| 1914: call 1 | |
| 1915: r8 = 2 | |
| 1916: if r0 == 0 goto -53 <LBB0_75> | |
| ; return XDP_TX; | |
| 1917: r1 = *(u32 *)(r6 + 12) | |
| 1918: r2 = *(u32 *)(r10 - 68) | |
| 1919: if r1 != r2 goto +1 <LBB0_158> | |
| 1920: goto -471 <LBB0_69> | |
| 0000000000003c08 LBB0_158: | |
| 1921: r1 = 29795 | |
| ; bpf_printk("failed rewrite nhop"); | |
| 1922: *(u16 *)(r10 - 52) = r1 | |
| 1923: r1 = 1701996900 | |
| 1924: *(u32 *)(r10 - 56) = r1 | |
| 1925: r1 = 7309940808237477735 ll | |
| 1927: *(u64 *)(r10 - 64) = r1 | |
| 1928: r1 = 0 | |
| 1929: *(u8 *)(r10 - 50) = r1 | |
| 1930: r1 = r10 | |
| 1931: r1 += -64 | |
| 1932: r2 = 15 | |
| 1933: call 6 | |
| ; return XDP_PASS; | |
| 1934: r2 = *(u32 *)(r10 - 68) | |
| 1935: goto -423 <LBB0_71> | |
| Disassembly of section xdp_pass: | |
| 0000000000000000 xdp_pass_func: | |
| ; return XDP_PASS; | |
| 0: r0 = 2 | |
| 1: exit |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment