int tcf_hash_search(struct tc_action *a, u32 index) { struct tcf_hashinfo *hinfo = a->ops->hinfo; struct tcf_common *p = tcf_hash_lookup(index, hinfo); if (p) { a->priv = p; return 1; } return 0; }
u32 tcf_hash_new_index(u32 *idx_gen, struct tcf_hashinfo *hinfo) { u32 val = *idx_gen; do { if (++val == 0) val = 1; } while (tcf_hash_lookup(val, hinfo)); return (*idx_gen = val); }
struct tcf_common *tcf_hash_check(u32 index, struct tc_action *a, int bind, struct tcf_hashinfo *hinfo) { struct tcf_common *p = NULL; if (index && (p = tcf_hash_lookup(index, hinfo)) != NULL) { if (bind) p->tcfc_bindcnt++; p->tcfc_refcnt++; a->priv = p; } return p; }
static int tcf_act_police_locate(struct rtattr *rta, struct rtattr *est, struct tc_action *a, int ovr, int bind) { unsigned h; int ret = 0, err; struct rtattr *tb[TCA_POLICE_MAX]; struct tc_police *parm; struct tcf_police *police; struct qdisc_rate_table *R_tab = NULL, *P_tab = NULL; int size; if (rta == NULL || rtattr_parse_nested(tb, TCA_POLICE_MAX, rta) < 0) return -EINVAL; if (tb[TCA_POLICE_TBF-1] == NULL) return -EINVAL; size = RTA_PAYLOAD(tb[TCA_POLICE_TBF-1]); if (size != sizeof(*parm) && size != sizeof(struct tc_police_compat)) return -EINVAL; parm = RTA_DATA(tb[TCA_POLICE_TBF-1]); if (tb[TCA_POLICE_RESULT-1] != NULL && RTA_PAYLOAD(tb[TCA_POLICE_RESULT-1]) != sizeof(u32)) return -EINVAL; if (tb[TCA_POLICE_RESULT-1] != NULL && RTA_PAYLOAD(tb[TCA_POLICE_RESULT-1]) != sizeof(u32)) return -EINVAL; if (parm->index) { struct tcf_common *pc; pc = tcf_hash_lookup(parm->index, &police_hash_info); if (pc != NULL) { a->priv = pc; police = to_police(pc); if (bind) { police->tcf_bindcnt += 1; police->tcf_refcnt += 1; } if (ovr) goto override; return ret; } }
static int tcf_act_police_locate(struct nlattr *nla, struct nlattr *est, struct tc_action *a, int ovr, int bind) { unsigned h; int ret = 0, err; struct nlattr *tb[TCA_POLICE_MAX + 1]; struct tc_police *parm; struct tcf_police *police; struct qdisc_rate_table *R_tab = NULL, *P_tab = NULL; int size; if (nla == NULL) return -EINVAL; err = nla_parse_nested(tb, TCA_POLICE_MAX, nla, police_policy); if (err < 0) return err; if (tb[TCA_POLICE_TBF] == NULL) return -EINVAL; size = nla_len(tb[TCA_POLICE_TBF]); if (size != sizeof(*parm) && size != sizeof(struct tc_police_compat)) return -EINVAL; parm = nla_data(tb[TCA_POLICE_TBF]); if (parm->index) { struct tcf_common *pc; pc = tcf_hash_lookup(parm->index, &police_hash_info); if (pc != NULL) { a->priv = pc; police = to_police(pc); if (bind) { police->tcf_bindcnt += 1; police->tcf_refcnt += 1; } if (ovr) goto override; return ret; } }
static int tcf_ipt_init(struct rtattr *rta, struct rtattr *est, struct tc_action *a, int ovr, int bind) { struct ipt_entry_target *t; unsigned h; struct rtattr *tb[TCA_IPT_MAX]; struct tcf_ipt *p; int ret = 0; u32 index = 0; u32 hook = 0; if (NULL == a || NULL == rta || (rtattr_parse(tb, TCA_IPT_MAX, RTA_DATA(rta), RTA_PAYLOAD(rta)) < 0)) { return -1; } if (tb[TCA_IPT_INDEX - 1]) { index = *(u32 *) RTA_DATA(tb[TCA_IPT_INDEX - 1]); DPRINTK("ipt index %d\n", index); } if (index && (p = tcf_hash_lookup(index)) != NULL) { a->priv = (void *) p; spin_lock(&p->lock); if (bind) { p->bindcnt += 1; p->refcnt += 1; } if (ovr) { goto override; } spin_unlock(&p->lock); return ret; }