Re: xdp2 nix refactor - fixed!
dave seddon <[email protected]> Wed, 11 Feb 2026 11:02:12 -0800
| Newsgroups | dev.linux.lists.xdp2 |
|---|---|
| Message-ID | <CANypexQq=2+5a-+F6x2NRVv4KRtLqS0MHim8qX9u6vt2erH2UQ@mail.gmail.com> |
I haven't updated the pull request yet ... And I'm going to try to do smaller commits, so might take a bit more ti= me :) On Wed, Feb 11, 2026 at 10:52=E2=80=AFAM Tom Herbert <[email protected]> = wrote: > > > > On Wed, Feb 11, 2026 at 10:41=E2=80=AFAM dave seddon <dave.seddon.ca@gmai= l.com> wrote: >> >> Sorry for the spam, but I'm very excited! Woot woot! >> >> Test for simple parser works! > > > Awesome! > > We'll give this a spin. > > Tom > >> >> >> [das@l:~/Downloads/xdp2]$ nix run .#tests.simple-parser >> warning: Git tree '/home/das/Downloads/xdp2' is dirty >> =3D=3D=3D XDP2 simple_parser Test =3D=3D=3D >> >> Work directory: /tmp/tmp.SWgyx5bwm3 >> >> XDP2DIR: /nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0 >> LD_LIBRARY_PATH: >> /nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0/lib:/nix/st= ore/j0bn0lp3dlhsa6gsbfmny4waj4g63hjc-libpcap-1.10.6-lib/lib:/nix/store/ibmk= sxcskm802fk7dj03m90y4mx385hq-libdrm-2.4.131/lib >> >> --- Building simple_parser --- >> gcc -I/nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0/inclu= de >> -I/nix/store/33b3bi8wys6p4rk1bwl3adap03v1c0zi-libpcap-1.10.6/include >> -g -c -o parser_tmpl.o parser_tmpl.c >> /nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0/bin/xdp2-co= mpiler >> -I/nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0/include >> -i parser_tmpl.c -o parser_tmpl.p.c >> struct __attribute__((aligned(64))) __attribute__((packed)) xdp2_parse_n= ode { >> enum xdp2_parser_node_type node_type __attribute__((packed)); >> __s8 unknown_ret; >> __u8 key_sel; >> __u8 flags; >> __u8 rsvd; >> const struct xdp2_proto_def *proto_def; >> const struct xdp2_parse_node_ops ops; >> const struct xdp2_proto_table *proto_table; >> const struct xdp2_parse_node *wildcard_node; >> char *text_name; >> }struct __attribute__((aligned(64))) __attribute__((packed)) xdp2_parse_= node { >> enum xdp2_parser_node_type node_type __attribute__((packed)); >> __s8 unknown_ret; >> __u8 key_sel; >> __u8 flags; >> __u8 rsvd; >> const struct xdp2_proto_def *proto_def; >> const struct xdp2_parse_node_ops ops; >> const struct xdp2_proto_table *proto_table; >> const struct xdp2_parse_node *wildcard_node; >> char *text_name; >> }struct xdp2_parse_node_ops { >> void (*extract_metadata)(const void *, size_t, size_t, void *, >> void *, const struct xdp2_ctrl_data *); >> int (*handler)(const void *, size_t, size_t, void *, void *, const >> struct xdp2_ctrl_data *); >> int (*post_handler)(const void *, size_t, size_t, void *, void *, >> const struct xdp2_ctrl_data *); >> }struct __attribute__((aligned(64))) __attribute__((packed)) xdp2_parse_= node { >> enum xdp2_parser_node_type node_type __attribute__((packed)); >> __s8 unknown_ret; >> __u8 key_sel; >> __u8 flags; >> __u8 rsvd; >> const struct xdp2_proto_def *proto_def; >> const struct xdp2_parse_node_ops ops; >> const struct xdp2_proto_table *proto_table; >> const struct xdp2_parse_node *wildcard_node; >> char *text_name; >> }struct xdp2_parse_node_ops { >> void (*extract_metadata)(const void *, size_t, size_t, void *, >> void *, const struct xdp2_ctrl_data *); >> int (*handler)(const void *, size_t, size_t, void *, void *, const >> struct xdp2_ctrl_data *); >> int (*post_handler)(const void *, size_t, size_t, void *, void *, >> const struct xdp2_ctrl_data *); >> }struct __attribute__((aligned(64))) __attribute__((packed)) xdp2_parse_= node { >> enum xdp2_parser_node_type node_type __attribute__((packed)); >> __s8 unknown_ret; >> __u8 key_sel; >> __u8 flags; >> __u8 rsvd; >> const struct xdp2_proto_def *proto_def; >> const struct xdp2_parse_node_ops ops; >> const struct xdp2_proto_table *proto_table; >> const struct xdp2_parse_node *wildcard_node; >> char *text_name; >> }struct xdp2_parse_node_ops { >> void (*extract_metadata)(const void *, size_t, size_t, void *, >> void *, const struct xdp2_ctrl_data *); >> int (*handler)(const void *, size_t, size_t, void *, void *, const >> struct xdp2_ctrl_data *); >> int (*post_handler)(const void *, size_t, size_t, void *, void *, >> const struct xdp2_ctrl_data *); >> }struct __attribute__((aligned(64))) __attribute__((packed)) xdp2_parse_= node { >> enum xdp2_parser_node_type node_type __attribute__((packed)); >> __s8 unknown_ret; >> __u8 key_sel; >> __u8 flags; >> __u8 rsvd; >> const struct xdp2_proto_def *proto_def; >> const struct xdp2_parse_node_ops ops; >> const struct xdp2_proto_table *proto_table; >> const struct xdp2_parse_node *wildcard_node; >> char *text_name; >> }struct xdp2_parse_node_ops { >> void (*extract_metadata)(const void *, size_t, size_t, void *, >> void *, const struct xdp2_ctrl_data *); >> int (*handler)(const void *, size_t, size_t, void *, void *, const >> struct xdp2_ctrl_data *); >> int (*post_handler)(const void *, size_t, size_t, void *, void *, >> const struct xdp2_ctrl_data *); >> }static const struct xdp2_proto_tlvs_table_entry __tcp_tlv_table[] =3D >> {{.type =3D 8, .node =3D &tcp_opt_timestamp_node}}[Python template] Grap= h >> has 5 vertices >> [Python template] ether_node: out_edges=3D2, next_proto_info=3D0 >> [Python template] -> ipv4_node key=3D0x8 >> [Python template] -> ipv6_node key=3D0xdd86 >> [Python template] ipv4_node: out_edges=3D2, next_proto_info=3D0 >> [Python template] -> tcp_node key=3D0x6 >> [Python template] -> ports_node key=3D0x11 >> [Python template] ipv6_node: out_edges=3D2, next_proto_info=3D0 >> [Python template] -> tcp_node key=3D0x6 >> [Python template] -> ports_node key=3D0x11 >> [Python template] ports_node: out_edges=3D0, next_proto_info=3D0 >> [Python template] tcp_node: out_edges=3D0, next_proto_info=3D0 >> gcc -I/nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0/inclu= de >> -I/nix/store/33b3bi8wys6p4rk1bwl3adap03v1c0zi-libpcap-1.10.6/include >> -g -L/nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0/lib >> -L/nix/store/j0bn0lp3dlhsa6gsbfmny4waj4g63hjc-libpcap-1.10.6-lib/lib >> -Wl,-rpath,/nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0/= lib >> -Wl,-rpath,/nix/store/j0bn0lp3dlhsa6gsbfmny4waj4g63hjc-libpcap-1.10.6-li= b/lib >> -o parser_tmpl parser_tmpl.p.c -lpcap -lxdp2 -lcli -lsiphash >> gcc -I/nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0/inclu= de >> -I/nix/store/33b3bi8wys6p4rk1bwl3adap03v1c0zi-libpcap-1.10.6/include >> -g -c -o parser_notmpl.o parser_notmpl.c >> /nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0/bin/xdp2-co= mpiler >> -I/nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0/include >> -i parser_notmpl.c -o parser_notmpl.p.c >> struct __attribute__((aligned(64))) __attribute__((packed)) xdp2_parse_n= ode { >> enum xdp2_parser_node_type node_type __attribute__((packed)); >> __s8 unknown_ret; >> __u8 key_sel; >> __u8 flags; >> __u8 rsvd; >> const struct xdp2_proto_def *proto_def; >> const struct xdp2_parse_node_ops ops; >> const struct xdp2_proto_table *proto_table; >> const struct xdp2_parse_node *wildcard_node; >> char *text_name; >> }struct __attribute__((aligned(64))) __attribute__((packed)) xdp2_parse_= node { >> enum xdp2_parser_node_type node_type __attribute__((packed)); >> __s8 unknown_ret; >> __u8 key_sel; >> __u8 flags; >> __u8 rsvd; >> const struct xdp2_proto_def *proto_def; >> const struct xdp2_parse_node_ops ops; >> const struct xdp2_proto_table *proto_table; >> const struct xdp2_parse_node *wildcard_node; >> char *text_name; >> }struct xdp2_parse_node_ops { >> void (*extract_metadata)(const void *, size_t, size_t, void *, >> void *, const struct xdp2_ctrl_data *); >> int (*handler)(const void *, size_t, size_t, void *, void *, const >> struct xdp2_ctrl_data *); >> int (*post_handler)(const void *, size_t, size_t, void *, void *, >> const struct xdp2_ctrl_data *); >> }struct __attribute__((aligned(64))) __attribute__((packed)) xdp2_parse_= node { >> enum xdp2_parser_node_type node_type __attribute__((packed)); >> __s8 unknown_ret; >> __u8 key_sel; >> __u8 flags; >> __u8 rsvd; >> const struct xdp2_proto_def *proto_def; >> const struct xdp2_parse_node_ops ops; >> const struct xdp2_proto_table *proto_table; >> const struct xdp2_parse_node *wildcard_node; >> char *text_name; >> }struct xdp2_parse_node_ops { >> void (*extract_metadata)(const void *, size_t, size_t, void *, >> void *, const struct xdp2_ctrl_data *); >> int (*handler)(const void *, size_t, size_t, void *, void *, const >> struct xdp2_ctrl_data *); >> int (*post_handler)(const void *, size_t, size_t, void *, void *, >> const struct xdp2_ctrl_data *); >> }struct __attribute__((aligned(64))) __attribute__((packed)) xdp2_parse_= node { >> enum xdp2_parser_node_type node_type __attribute__((packed)); >> __s8 unknown_ret; >> __u8 key_sel; >> __u8 flags; >> __u8 rsvd; >> const struct xdp2_proto_def *proto_def; >> const struct xdp2_parse_node_ops ops; >> const struct xdp2_proto_table *proto_table; >> const struct xdp2_parse_node *wildcard_node; >> char *text_name; >> }struct xdp2_parse_node_ops { >> void (*extract_metadata)(const void *, size_t, size_t, void *, >> void *, const struct xdp2_ctrl_data *); >> int (*handler)(const void *, size_t, size_t, void *, void *, const >> struct xdp2_ctrl_data *); >> int (*post_handler)(const void *, size_t, size_t, void *, void *, >> const struct xdp2_ctrl_data *); >> }struct __attribute__((aligned(64))) __attribute__((packed)) xdp2_parse_= node { >> enum xdp2_parser_node_type node_type __attribute__((packed)); >> __s8 unknown_ret; >> __u8 key_sel; >> __u8 flags; >> __u8 rsvd; >> const struct xdp2_proto_def *proto_def; >> const struct xdp2_parse_node_ops ops; >> const struct xdp2_proto_table *proto_table; >> const struct xdp2_parse_node *wildcard_node; >> char *text_name; >> }struct xdp2_parse_node_ops { >> void (*extract_metadata)(const void *, size_t, size_t, void *, >> void *, const struct xdp2_ctrl_data *); >> int (*handler)(const void *, size_t, size_t, void *, void *, const >> struct xdp2_ctrl_data *); >> int (*post_handler)(const void *, size_t, size_t, void *, void *, >> const struct xdp2_ctrl_data *); >> }static const struct xdp2_proto_tlvs_table_entry __tcp_tlv_table[] =3D >> {{.type =3D 8, .node =3D &tcp_opt_timestamp_node}}[Python template] Grap= h >> has 5 vertices >> [Python template] ether_node: out_edges=3D2, next_proto_info=3D0 >> [Python template] -> ipv4_node key=3D0x8 >> [Python template] -> ipv6_node key=3D0xdd86 >> [Python template] ipv4_node: out_edges=3D2, next_proto_info=3D0 >> [Python template] -> tcp_node key=3D0x6 >> [Python template] -> ports_node key=3D0x11 >> [Python template] ipv6_node: out_edges=3D2, next_proto_info=3D0 >> [Python template] -> tcp_node key=3D0x6 >> [Python template] -> ports_node key=3D0x11 >> [Python template] ports_node: out_edges=3D0, next_proto_info=3D0 >> [Python template] tcp_node: out_edges=3D0, next_proto_info=3D0 >> gcc -I/nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0/inclu= de >> -I/nix/store/33b3bi8wys6p4rk1bwl3adap03v1c0zi-libpcap-1.10.6/include >> -g -L/nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0/lib >> -L/nix/store/j0bn0lp3dlhsa6gsbfmny4waj4g63hjc-libpcap-1.10.6-lib/lib >> -Wl,-rpath,/nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0/= lib >> -Wl,-rpath,/nix/store/j0bn0lp3dlhsa6gsbfmny4waj4g63hjc-libpcap-1.10.6-li= b/lib >> -o parser_notmpl parser_notmpl.p.c -lpcap -lxdp2 -lcli -lsiphash >> >> PASS: parser_notmpl binary created >> PASS: parser_tmpl binary created >> >> --- Test 1: parser_notmpl basic --- >> PASS: parser_notmpl produced IPv6 output >> PASS: parser_notmpl parsed TCP timestamps >> PASS: parser_notmpl computed hash values >> >> --- Test 2: parser_notmpl optimized --- >> PASS: parser_notmpl -O produced IPv6 output >> PASS: parser_notmpl -O parsed TCP timestamps >> PASS: parser_notmpl -O computed hash values >> PASS: parser_notmpl basic and optimized modes produce identical output >> >> --- Test 3: parser_tmpl basic --- >> PASS: parser_tmpl produced IPv6 output >> PASS: parser_tmpl computed hash values >> >> --- Test 4: parser_tmpl optimized --- >> PASS: parser_tmpl -O produced IPv6 output >> PASS: parser_tmpl -O computed hash values >> PASS: parser_tmpl basic and optimized modes produce identical output >> >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> TEST SUMMARY >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> >> Tests passed: 14 >> Tests failed: 0 >> >> =E2=9C=93 All simple_parser tests passed! >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> >> [das@l:~/Downloads/xdp2]$ >> >> On Wed, Feb 11, 2026 at 9:45=E2=80=AFAM dave seddon <dave.seddon.ca@gmai= l.com> wrote: >> > >> > Woot woot! I finally got the simple_parser working after updating the >> > xdp2 API and a few other changes >> > >> > To debug this I added some "asserts" into the C++ code. I wasn't >> > really sure the "best" way to do this, so I used the boost assert >> > stuff, given xdp2 already uses boost libraries. Please let me know if >> > that sounds like a bad idea. :) >> > >> > I'm also thinking I'll extract the embedded Python from the .cpp fils, >> > so that we can independently test the python, rather than getting the >> > python evaluation at compile time. Should have zero functionality >> > impact. >> > >> > [XDP2-GCC] [das@l:~/Downloads/xdp2/samples/parser/simple_parser]$ >> > ./parser_notmpl ../../../data/pcaps/tcp_ipv6.pcap >> > IPv6: ::1:51648->::1:631 >> > TCP timestamps value: 1887522685, echo 0 >> > Hash d3f87531 >> > IPv6: ::1:631->::1:51648 >> > TCP timestamps value: 1887522685, echo 1887522685 >> > Hash ca63a2de >> > IPv6: ::1:51648->::1:631 >> > TCP timestamps value: 1887522685, echo 1887522685 >> > Hash d3f87531 >> > IPv6: ::1:51648->::1:631 >> > TCP timestamps value: 1887522685, echo 1887522685 >> > Hash d3f87531 >> > IPv6: ::1:631->::1:51648 >> > TCP timestamps value: 1887522685, echo 1887522685 >> > Hash ca63a2de >> > IPv6: ::1:631->::1:51648 >> > TCP timestamps value: 1887522688, echo 1887522685 >> > Hash ca63a2de >> > IPv6: ::1:51650->::1:631 >> > TCP timestamps value: 1887523538, echo 0 >> > Hash 512a939c >> > IPv6: ::1:631->::1:51650 >> > TCP timestamps value: 1887523538, echo 1887523538 >> > Hash b857973f >> > IPv6: ::1:51650->::1:631 >> > TCP timestamps value: 1887523538, echo 1887523538 >> > Hash 512a939c >> > IPv6: ::1:51650->::1:631 >> > TCP timestamps value: 1887523538, echo 1887523538 >> > Hash 512a939c >> > IPv6: ::1:631->::1:51650 >> > TCP timestamps value: 1887523538, echo 1887523538 >> > Hash b857973f >> > IPv6: ::1:631->::1:51650 >> > TCP timestamps value: 1887523541, echo 1887523538 >> > Hash b857973f >> > [XDP2-GCC] [das@l:~/Downloads/xdp2/samples/parser/simple_parser]$ >> > ./parser_notmpl -O ../../../data/pcaps/tcp_ipv6.pcap >> > IPv6: ::1:51648->::1:631 >> > TCP timestamps value: 1887522685, echo 0 >> > Hash d3f87531 >> > IPv6: ::1:631->::1:51648 >> > TCP timestamps value: 1887522685, echo 1887522685 >> > Hash ca63a2de >> > IPv6: ::1:51648->::1:631 >> > TCP timestamps value: 1887522685, echo 1887522685 >> > Hash d3f87531 >> > IPv6: ::1:51648->::1:631 >> > TCP timestamps value: 1887522685, echo 1887522685 >> > Hash d3f87531 >> > IPv6: ::1:631->::1:51648 >> > TCP timestamps value: 1887522685, echo 1887522685 >> > Hash ca63a2de >> > IPv6: ::1:631->::1:51648 >> > TCP timestamps value: 1887522688, echo 1887522685 >> > Hash ca63a2de >> > IPv6: ::1:51650->::1:631 >> > TCP timestamps value: 1887523538, echo 0 >> > Hash 512a939c >> > IPv6: ::1:631->::1:51650 >> > TCP timestamps value: 1887523538, echo 1887523538 >> > Hash b857973f >> > IPv6: ::1:51650->::1:631 >> > TCP timestamps value: 1887523538, echo 1887523538 >> > Hash 512a939c >> > IPv6: ::1:51650->::1:631 >> > TCP timestamps value: 1887523538, echo 1887523538 >> > Hash 512a939c >> > IPv6: ::1:631->::1:51650 >> > TCP timestamps value: 1887523538, echo 1887523538 >> > Hash b857973f >> > IPv6: ::1:631->::1:51650 >> > TCP timestamps value: 1887523541, echo 1887523538 >> > Hash b857973f >> > [XDP2-GCC] [das@l:~/Downloads/xdp2/samples/parser/simple_parser]$ >> > >> > On Tue, Feb 10, 2026 at 8:56=E2=80=AFAM dave seddon <dave.seddon.ca@gm= ail.com> wrote: >> > > >> > > Sorry. I need to update the pull request. >> > > >> > > I was trying to update the simple_parser to the new API, and I've >> > > discovered during testing that the Nix isn't quite working as >> > > expected. >> > > >> > > I'll add testing, so it's easy to verify everything. >> > > >> > > On Mon, Feb 9, 2026 at 12:04=E2=80=AFPM dave seddon <dave.seddon.ca@= gmail.com> wrote: >> > > > >> > > > G'day, >> > > > >> > > > I hope you are doing well. >> > > > >> > > > Yay! I finally fixed the segfault! >> > > > >> > > > I also refactored the nix, so it should be much easier to understa= nd. >> > > > >> > > > https://github.com/xdp2-dev/xdp2/pull/12 >> > > > >> > > > -- >> > > > Regards, >> > > > Dave Seddon >> > > > +1 415 857 5102 >> > > >> > > >> > > >> > > -- >> > > Regards, >> > > Dave Seddon >> > > +1 415 857 5102 >> > >> > >> > >> > -- >> > Regards, >> > Dave Seddon >> > +1 415 857 5102 >> >> >> >> -- >> Regards, >> Dave Seddon >> +1 415 857 5102 >> --=20 Regards, Dave Seddon +1 415 857 5102