idset
static struct idset *slow_subchannel_set;
struct idset *set;
struct idset *set = data;
struct idset *set = data;
struct idset *set;
static struct idset *idset_new(int num_ssid, int num_id)
struct idset *set;
set = vmalloc(sizeof(struct idset) +
void idset_free(struct idset *set)
void idset_fill(struct idset *set)
static inline void idset_add(struct idset *set, int ssid, int id)
static inline void idset_del(struct idset *set, int ssid, int id)
static inline int idset_contains(struct idset *set, int ssid, int id)
struct idset *idset_sch_new(void)
void idset_sch_add(struct idset *set, struct subchannel_id schid)
void idset_sch_del(struct idset *set, struct subchannel_id schid)
void idset_sch_del_subseq(struct idset *set, struct subchannel_id schid)
int idset_sch_contains(struct idset *set, struct subchannel_id schid)
int idset_is_empty(struct idset *set)
void idset_add_set(struct idset *to, struct idset *from)
struct idset;
void idset_free(struct idset *set);
void idset_fill(struct idset *set);
struct idset *idset_sch_new(void);
void idset_sch_add(struct idset *set, struct subchannel_id id);
void idset_sch_del(struct idset *set, struct subchannel_id id);
void idset_sch_del_subseq(struct idset *set, struct subchannel_id schid);
int idset_sch_contains(struct idset *set, struct subchannel_id id);
int idset_is_empty(struct idset *set);
void idset_add_set(struct idset *to, struct idset *from);
static void idset_cnt_inc(struct bpf_idset *idset, u32 id)
for (i = 0; i < idset->num_ids; i++) {
if (idset->entries[i].id == id) {
idset->entries[i].cnt++;
if (idset->num_ids < BPF_ID_MAP_SIZE) {
idset->entries[idset->num_ids].id = id;
idset->entries[idset->num_ids].cnt = 1;
idset->num_ids++;
static u32 idset_cnt_get(struct bpf_idset *idset, u32 id)
for (i = 0; i < idset->num_ids; i++) {
if (idset->entries[i].id == id)
return idset->entries[i].cnt;
struct bpf_idset *idset = &env->idset_scratch;
idset->num_ids = 0;
idset_cnt_inc(idset, reg->id & ~BPF_ADD_CONST);
if (idset_cnt_get(idset, reg->id & ~BPF_ADD_CONST) == 1) {