On Wed, Oct 28, 2015 at 06:19:48PM +0100, Alexandr Nedvedicky wrote: > The idea has been proposed by Claudio at Varazdin.
I guess the idea is to eliminate the workq. Or is ther naother reason to change it? Comments inline > Index: sbin/pfctl/pfctl_radix.c > =================================================================== > RCS file: /cvs/src/sbin/pfctl/pfctl_radix.c,v > retrieving revision 1.32 > diff -u -p -r1.32 pfctl_radix.c > --- sbin/pfctl/pfctl_radix.c 21 Jan 2015 21:50:33 -0000 1.32 > +++ sbin/pfctl/pfctl_radix.c 27 Oct 2015 23:24:59 -0000 > @@ -184,6 +184,7 @@ pfr_add_addrs(struct pfr_table *tbl, str > int *nadd, int flags) > { > struct pfioc_table io; > + int i, rv, add = 0; > > if (tbl == NULL || size < 0 || (size && addr == NULL)) { > errno = EINVAL; > @@ -192,14 +193,18 @@ pfr_add_addrs(struct pfr_table *tbl, str > bzero(&io, sizeof io); > io.pfrio_flags = flags; > io.pfrio_table = *tbl; > - io.pfrio_buffer = addr; > io.pfrio_esize = sizeof(*addr); > - io.pfrio_size = size; > - if (ioctl(dev, DIOCRADDADDRS, &io)) > - return (-1); > - if (nadd != NULL) > - *nadd = io.pfrio_nadd; > - return (0); > + io.pfrio_size = 1; /* TODO: check .pfrio_size is needed */ > + for (i = 0; (i < size) && (rv == 0); i++) { rv is unitialized in the first interation > + io.pfrio_buffer = addr++; > + rv = ioctl(dev, DIOCRADDADDR, &io); I would suggest to return (-1) if ioctl fails... > + add++; > + } > + > + if ((rv == 0) && (nadd != NULL)) > + *nadd = add; > + > + return (rv); ... then you can return (0) here and don't need the rv variable. > } > > int > Index: sys/net/pf_ioctl.c > =================================================================== > RCS file: /cvs/src/sys/net/pf_ioctl.c,v > retrieving revision 1.291 > diff -u -p -r1.291 pf_ioctl.c > --- sys/net/pf_ioctl.c 13 Oct 2015 19:32:31 -0000 1.291 > +++ sys/net/pf_ioctl.c 27 Oct 2015 23:25:23 -0000 > @@ -834,7 +834,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a > case DIOCRGETTSTATS: > case DIOCRCLRTSTATS: > case DIOCRCLRADDRS: > - case DIOCRADDADDRS: > + case DIOCRADDADDR: > case DIOCRDELADDRS: > case DIOCRSETADDRS: > case DIOCRGETASTATS: > @@ -887,7 +887,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a > case DIOCRDELTABLES: > case DIOCRCLRTSTATS: > case DIOCRCLRADDRS: > - case DIOCRADDADDRS: > + case DIOCRADDADDR: > case DIOCRDELADDRS: > case DIOCRSETADDRS: > case DIOCRSETTFLAGS: > @@ -1816,16 +1816,15 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a > break; > } > > - case DIOCRADDADDRS: { > + case DIOCRADDADDR: { > struct pfioc_table *io = (struct pfioc_table *)addr; > > if (io->pfrio_esize != sizeof(struct pfr_addr)) { > error = ENODEV; > break; > } > - error = pfr_add_addrs(&io->pfrio_table, io->pfrio_buffer, > - io->pfrio_size, &io->pfrio_nadd, io->pfrio_flags | > - PFR_FLAG_USERIOCTL); > + error = pfr_add_addr(&io->pfrio_table, io->pfrio_buffer, > + io->pfrio_size, io->pfrio_flags | PFR_FLAG_USERIOCTL); pfr_add_addr() handles exactly 1 address, don't pass io->pfrio_size. > break; > } > > Index: sys/net/pf_table.c > =================================================================== > RCS file: /cvs/src/sys/net/pf_table.c,v > retrieving revision 1.115 > diff -u -p -r1.115 pf_table.c > --- sys/net/pf_table.c 7 Oct 2015 11:57:44 -0000 1.115 > +++ sys/net/pf_table.c 27 Oct 2015 23:25:26 -0000 > @@ -266,6 +266,54 @@ pfr_clr_addrs(struct pfr_table *tbl, int > } > > int > +pfr_add_addr(struct pfr_table *tbl, struct pfr_addr *addr, int size, int > flags) Do not pass size. > +{ > + struct pfr_ktable *kt; > + struct pfr_kentry *p; > + struct pfr_addr ad; > + int rv; > + time_t tzero = time_second; > + > + ACCEPT_FLAGS(flags, PFR_FLAG_DUMMY | PFR_FLAG_FEEDBACK); > + if (pfr_validate_table(tbl, 0, flags & PFR_FLAG_USERIOCTL)) > + return (EINVAL); > + kt = pfr_lookup_table(tbl); > + if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE)) > + return (ESRCH); > + if (kt->pfrkt_flags & PFR_TFLAG_CONST) > + return (EPERM); > + if (COPYIN(addr, &ad, sizeof(ad), flags)) > + senderr(EFAULT); > + if (pfr_validate_addr(&ad)) > + senderr(EINVAL); > + p = pfr_lookup_addr(kt, &ad, 1); > + if (p == NULL) { Should you check for !(flags & PFR_FLAG_DUMMY) here? It was done in the old code before pfr_insert_kentries(). > + rv = pfr_insert_kentry(kt, &ad, tzero); The old code ignored wether pfr_insert_kentries() succeeded. > + } No { } for one line if block. > + > + if (flags & PFR_FLAG_FEEDBACK) { > + if (p != NULL) { > + if ((p->pfrke_flags & PFRKE_FLAG_NOT) != ad.pfra_not) > + ad.pfra_fback = PFR_FB_CONFLICT; > + else > + ad.pfra_fback = PFR_FB_DUPLICATE; PFR_FB_DUPLICATE was used when there were two identical addresses in the passed list. This cannot happen anymore. It should be PFR_FB_NONE in this case. > + } else if (rv != 0) { > + ad.pfra_fback = PFR_FB_NONE; > + } else { > + ad.pfra_fback = PFR_FB_ADDED; > + } Perhaps write this block as if (p == NULL) ad.pfra_fback = PFR_FB_ADDED; else if ((p->pfrke_flags & PFRKE_FLAG_NOT) != ad.pfra_not)) ad.pfra_fback = PFR_FB_CONFLICT; else ad.pfra_fback = PFR_FB_NONE; > + if (COPYOUT(&ad, addr, sizeof(ad), flags)) > + senderr(EFAULT); > + } > + > + return (0); > +_bad: > + if (flags & PFR_FLAG_FEEDBACK) > + pfr_reset_feedback(addr, size, flags); Don't use size, it must be 1. > + return (rv); rv may be unitialized > +} > + > +int > pfr_add_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size, > int *nadd, int flags) pfr_add_addrs() is not used anymore, remove it. > { > Index: sys/net/pfvar.h > =================================================================== > RCS file: /cvs/src/sys/net/pfvar.h,v > retrieving revision 1.421 > diff -u -p -r1.421 pfvar.h > --- sys/net/pfvar.h 13 Oct 2015 19:32:32 -0000 1.421 > +++ sys/net/pfvar.h 27 Oct 2015 23:25:29 -0000 > @@ -1613,7 +1613,7 @@ struct pfioc_iface { > #define DIOCRGETTSTATS _IOWR('D', 64, struct pfioc_table) > #define DIOCRCLRTSTATS _IOWR('D', 65, struct pfioc_table) > #define DIOCRCLRADDRS _IOWR('D', 66, struct pfioc_table) > -#define DIOCRADDADDRS _IOWR('D', 67, struct pfioc_table) > +#define DIOCRADDADDR _IOWR('D', 67, struct pfioc_table) > #define DIOCRDELADDRS _IOWR('D', 68, struct pfioc_table) > #define DIOCRSETADDRS _IOWR('D', 69, struct pfioc_table) > #define DIOCRGETADDRS _IOWR('D', 70, struct pfioc_table) > @@ -1789,8 +1789,7 @@ int pfr_clr_tstats(struct pfr_table *, i > int pfr_set_tflags(struct pfr_table *, int, int, int, int *, int *, int); > int pfr_clr_addrs(struct pfr_table *, int *, int); > int pfr_insert_kentry(struct pfr_ktable *, struct pfr_addr *, time_t); > -int pfr_add_addrs(struct pfr_table *, struct pfr_addr *, int, int *, > - int); > +int pfr_add_addr(struct pfr_table *, struct pfr_addr *, int, int); > int pfr_del_addrs(struct pfr_table *, struct pfr_addr *, int, int *, > int); > int pfr_set_addrs(struct pfr_table *, struct pfr_addr *, int, int *, > Index: sbin/pfctl/pfctl_radix.c > =================================================================== > RCS file: /cvs/src/sbin/pfctl/pfctl_radix.c,v > retrieving revision 1.32 > diff -u -p -r1.32 pfctl_radix.c > --- sbin/pfctl/pfctl_radix.c 21 Jan 2015 21:50:33 -0000 1.32 > +++ sbin/pfctl/pfctl_radix.c 27 Oct 2015 23:27:32 -0000 This file is twice in the diff. > @@ -184,6 +184,7 @@ pfr_add_addrs(struct pfr_table *tbl, str > int *nadd, int flags) > { > struct pfioc_table io; > + int i, rv, add = 0; > > if (tbl == NULL || size < 0 || (size && addr == NULL)) { > errno = EINVAL; > @@ -192,14 +193,18 @@ pfr_add_addrs(struct pfr_table *tbl, str > bzero(&io, sizeof io); > io.pfrio_flags = flags; > io.pfrio_table = *tbl; > - io.pfrio_buffer = addr; > io.pfrio_esize = sizeof(*addr); > - io.pfrio_size = size; > - if (ioctl(dev, DIOCRADDADDRS, &io)) > - return (-1); > - if (nadd != NULL) > - *nadd = io.pfrio_nadd; > - return (0); > + io.pfrio_size = 1; /* TODO: check .pfrio_size is needed */ > + for (i = 0; (i < size) && (rv == 0); i++) { > + io.pfrio_buffer = addr++; > + rv = ioctl(dev, DIOCRADDADDR, &io); > + add++; > + } > + > + if ((rv == 0) && (nadd != NULL)) > + *nadd = add; > + > + return (rv); > } > > int bluhm