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