On Tue, Apr 18, 2023 at 12:52:00PM +0200, Theo Buehler wrote: > On Tue, Apr 18, 2023 at 11:29:26AM +0200, Claudio Jeker wrote: > > This diff adds the parse.y and config.c bits for flowspec. > > I tried to make flowspec rules as similar to pf rules (even though > > flowspec is more flexible). > > > > Now this diff does nothing in itself but is already large enough to not > > add more to it. In parse.y the individual flowspec components are built up > > in a flowspec context and then at the end converted into a struct flowspec > > object. I wrapped that into a struct flowspec_config so that all the > > parent config bits can be kept together. (For struct network this is > > currently the other way around but I plan to change this at a later > > point). > > ok tb > > Couple of nits and comments inline. Apart from two copy-paste errors > (s/4/6) nothing important > > > +flowspec_alloc(uint8_t aid, int len) > > +{ > > + struct flowspec_config *conf; > > + struct flowspec *flow; > > + > > + flow = malloc(FLOWSPEC_SIZE + len); > > + if (flow == NULL) > > + return NULL; > > + memset(flow, 0, FLOWSPEC_SIZE); > > I assume not zeroing len bytes is worth this extra dance as opposed > to using calloc(). I went back and for between the two versions. I want to use zero the start of struct flowspec because of the pad but it feels wasteful to zero everything and then set all but 1 byte.
> > + /* > > + * merge the flowspec statements, but first mark the old ones > > + * for deletion. Which happens when the flowspec is sent to the RDE. > > + */ > > This comment is a bit awkward. Maybe split the sentence differently like this: > > /* > * Merge the flowspec statements. Mark the old ones for deletion > * which happens when the flowspec is sent to the RDE. > */ Thanks, I used your version. > > +parse_flags(char *s) > > +{ > > + const char *flags = FLOWSPEC_TCP_FLAG_STRING; > > + char *p, *q; > > + uint8_t f = 0; > > + > > + if (curflow->type == FLOWSPEC_TYPE_FRAG) { > > + if (curflow->aid == AID_INET) > > + flags = FLOWSPEC_FRAG_STRING4; > > + else > > + flags = FLOWSPEC_FRAG_STRING4; > > s/4/6 > > flags = FLOWSPEC_FRAG_STRING6; Thanks for finding this and the other 6 vs 4 copy paste errors > > +static int > > +geticmptypebyname(char *w, uint8_t aid) > > +{ > > + unsigned int i; > > + > > + switch (aid) { > > + case AID_INET: > > + for (i=0; i < (sizeof (icmp_type) / sizeof(icmp_type[0])); > > No space after sizeof, I'd drop the extra parens. Might also be worth it > to add a local version of nitems() to this file. This and the others are IIRC streight from pfctl. So if someone wants a free commit :) -- :wq Claudio