fltrinfo
LIST_HEAD(, fltrinfo) fltrlist; /* filters for this class */
LIST_ENTRY(fltrinfo) next; /* next entry on fltrlist
LIST_ENTRY(fltrinfo) nextrule; /* next entry on fltr_rules
int qop_add_filter(struct fltrinfo **rp,
struct fltrinfo **conflict);
int qop_delete_filter(struct fltrinfo *fltr);
struct fltrinfo *flname2flinfo(const struct classinfo *clinfo,
struct fltrinfo *flhandle2fltrinfo(struct ifinfo *ifinfo, u_long handle);
struct fltrinfo;
int (*add_filter)(struct fltrinfo *);
int (*delete_filter)(struct fltrinfo *);
LIST_HEAD(, fltrinfo) fltr_rules; /* filter rule list */
add_filter_rule(struct ifinfo *ifinfo, struct fltrinfo *fltrinfo,
struct fltrinfo **conflict)
struct fltrinfo *fp, *front, *back, *prev = NULL;
if (fp->fltr.ff_ruleno > fltrinfo->fltr.ff_ruleno) {
back = fltrinfo;
front = fltrinfo;
LIST_INSERT_HEAD(&ifinfo->fltr_rules, fltrinfo, nextrule);
LIST_INSERT_AFTER(prev, fltrinfo, nextrule);
remove_filter_rule(struct ifinfo *ifinfo, struct fltrinfo *fltrinfo)
LIST_REMOVE(fltrinfo, nextrule);
struct fltrinfo *fltrinfo = NULL;
(fltrinfo = flname2flinfo(clinfo, flname)) == NULL)
error = qop_delete_filter(fltrinfo);
qop_add_filter(struct fltrinfo **rp, struct classinfo *clinfo,
struct fltrinfo **conflict)
struct fltrinfo *fltrinfo;
if ((fltrinfo = calloc(1, sizeof(*fltrinfo))) == NULL)
fltrinfo->clinfo = clinfo;
fltrinfo->fltr = *fltr;
fltrinfo->line_no = line_no; /* XXX */
fltrinfo->dontwarn = filter_dontwarn; /* XXX */
fltrinfo->flname = strdup(flname);
fltrinfo->flname = strdup("(null)"); /* dummy name */
if ((error = add_filter_rule(ifinfo, fltrinfo, conflict)) != 0)
if ((error = (*ifinfo->qdisc->add_filter)(fltrinfo)) != 0) {
remove_filter_rule(ifinfo, fltrinfo);
LIST_INSERT_HEAD(&clinfo->fltrlist, fltrinfo, next);
*rp = fltrinfo;
if (fltrinfo != NULL) {
if (fltrinfo->flname != NULL)
free(fltrinfo->flname);
free(fltrinfo);
qop_delete_filter(struct fltrinfo *fltrinfo)
clinfo = fltrinfo->clinfo;
LIST_REMOVE(fltrinfo, next);
remove_filter_rule(ifinfo, fltrinfo);
if ((error = (*ifinfo->qdisc->delete_filter)(fltrinfo)) != 0)
if (fltrinfo->flname)
free(fltrinfo->flname);
free(fltrinfo);
struct fltrinfo *
struct fltrinfo *fltrinfo;
LIST_FOREACH(fltrinfo, &clinfo->fltrlist, next)
if (fltrinfo->flname != NULL &&
strcmp(fltrinfo->flname, flname) == 0)
return (fltrinfo);
struct fltrinfo *
struct fltrinfo *fltrinfo;
LIST_FOREACH(fltrinfo, &ifinfo->fltr_rules, nextrule)
if (fltrinfo->handle == handle)
return (fltrinfo);
static int add_filter_rule(struct ifinfo *, struct fltrinfo *,
struct fltrinfo **);
struct fltrinfo *);
cbq_add_filter(struct fltrinfo *fltrinfo)
fltrinfo->clinfo->ifinfo->ifname, IFNAMSIZ);
fltr_add.cbq_class_handle = fltrinfo->clinfo->handle;
fltr_add.cbq_filter = fltrinfo->fltr;
fltrinfo->handle = fltr_add.cbq_filter_handle;
cbq_delete_filter(struct fltrinfo *fltrinfo)
fltrinfo->clinfo->ifinfo->ifname, IFNAMSIZ);
fltr_del.cbq_filter_handle = fltrinfo->handle;
static int cbq_add_filter(struct fltrinfo *);
static int cbq_delete_filter(struct fltrinfo *);
static int cdnr_add_filter(struct fltrinfo *);
static int cdnr_delete_filter(struct fltrinfo *);
cdnr_add_filter(struct fltrinfo *fltrinfo)
fltrinfo->clinfo->ifinfo->ifname+1, IFNAMSIZ);
fltr_add.cdnr_handle = fltrinfo->clinfo->handle;
fltr_add.filter = fltrinfo->fltr;
fltrinfo->handle = fltr_add.filter_handle;
cdnr_delete_filter(struct fltrinfo *fltrinfo)
fltrinfo->clinfo->ifinfo->ifname+1, IFNAMSIZ);
fltr_del.filter_handle = fltrinfo->handle;
static int nop_add_filter(struct fltrinfo *fltrinfo)
static int nop_delete_filter(struct fltrinfo *fltrinfo)
static int nop_add_filter(struct fltrinfo *);
static int nop_delete_filter(struct fltrinfo *);
hfsc_add_filter(struct fltrinfo *fltrinfo)
strncpy(fltr_add.iface.hfsc_ifname, fltrinfo->clinfo->ifinfo->ifname,
fltr_add.class_handle = fltrinfo->clinfo->handle;
fltr_add.filter = fltrinfo->fltr;
fltrinfo->handle = fltr_add.filter_handle;
hfsc_delete_filter(struct fltrinfo *fltrinfo)
strncpy(fltr_del.iface.hfsc_ifname, fltrinfo->clinfo->ifinfo->ifname,
fltr_del.filter_handle = fltrinfo->handle;
static int hfsc_add_filter(struct fltrinfo *);
static int hfsc_delete_filter(struct fltrinfo *);
static int jobs_add_filter(struct fltrinfo *);
static int jobs_delete_filter(struct fltrinfo *);
jobs_add_filter(struct fltrinfo *fltrinfo)
strncpy(fltr_add.iface.jobs_ifname, fltrinfo->clinfo->ifinfo->ifname,
fltr_add.class_handle = fltrinfo->clinfo->handle;
fltr_add.filter = fltrinfo->fltr;
fltrinfo->handle = fltr_add.filter_handle;
jobs_delete_filter(struct fltrinfo *fltrinfo)
strncpy(fltr_del.iface.jobs_ifname, fltrinfo->clinfo->ifinfo->ifname,
fltr_del.filter_handle = fltrinfo->handle;
priq_add_filter(struct fltrinfo *fltrinfo)
strncpy(fltr_add.iface.ifname, fltrinfo->clinfo->ifinfo->ifname,
fltr_add.class_handle = fltrinfo->clinfo->handle;
fltr_add.filter = fltrinfo->fltr;
fltrinfo->handle = fltr_add.filter_handle;
priq_delete_filter(struct fltrinfo *fltrinfo)
strncpy(fltr_del.iface.ifname, fltrinfo->clinfo->ifinfo->ifname,
fltr_del.filter_handle = fltrinfo->handle;
static int priq_add_filter(struct fltrinfo *);
static int priq_delete_filter(struct fltrinfo *);
expand_filtername(struct fltrinfo *fltrinfo, char *name, size_t maxname)
len = expand_classname(fltrinfo->clinfo, name, maxname);
snprintf(name + len, maxname - len, ":%s", fltrinfo->flname);
struct fltrinfo *fltrinfo;
if ((fltrinfo = flhandle2fltrinfo(ifinfo, handle)) == NULL)
(void)expand_filtername(fltrinfo, msg, maxmsg);
struct fltrinfo *fltrinfo;
if ((fltrinfo = flhandle2fltrinfo(ifinfo, handle)) == NULL)
filt = &fltrinfo->fltr;
filt6 = (struct flow_filter6 *)&fltrinfo->fltr;
struct fltrinfo *fltrinfo;
LIST_FOREACH(fltrinfo, &clinfo->fltrlist, next) {
expand_filtername(fltrinfo, tmp, sizeof(tmp));
fltrinfo->handle, tmp);