Re: xdp2 nix refactor - fixed!

dave seddon <[email protected]> Wed, 11 Feb 2026 10:41:32 -0800
Newsgroups dev.linux.lists.xdp2
Message-ID <CANypexR6+pK94XoYcTijtj4Syd3dGxRzp-XZruQ17z3kGRMd1w@mail.gmail.com>
Sorry for the spam, but I'm very excited!  Woot woot!

Test for simple parser works!

[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/store=
/j0bn0lp3dlhsa6gsbfmny4waj4g63hjc-libpcap-1.10.6-lib/lib:/nix/store/ibmksxc=
skm802fk7dj03m90y4mx385hq-libdrm-2.4.131/lib

--- Building simple_parser ---
gcc -I/nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0/include
-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-compi=
ler
-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_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 __attribute__((aligned(64))) __attribute__((packed)) xdp2_parse_nod=
e {
    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_nod=
e {
    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_nod=
e {
    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_nod=
e {
    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] Graph
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/include
-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-lib/l=
ib
-o parser_tmpl parser_tmpl.p.c -lpcap -lxdp2 -lcli -lsiphash
gcc -I/nix/store/r1z42jwx0p10j1apdpvhblwqh08h590q-xdp2-debug-0.1.0/include
-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-compi=
ler
-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_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 __attribute__((aligned(64))) __attribute__((packed)) xdp2_parse_nod=
e {
    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_nod=
e {
    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_nod=
e {
    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_nod=
e {
    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] Graph
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/include
-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-lib/l=
ib
-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 <[email protected]=
om> 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@gmail=
.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@gma=
il.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 understand.
> > >
> > > 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



--=20
Regards,
Dave Seddon
+1 415 857 5102