static int parse_ip6_class(int *argc_p, char ***argv_p, struct tc_u32_sel *sel) { int res = -1; int argc = *argc_p; char **argv = *argv_p; __u32 key; __u32 mask; int off = 0; int offmask = 0; if (argc < 2) return -1; if (get_u32(&key, *argv, 0)) return -1; argc--; argv++; if (get_u32(&mask, *argv, 16)) return -1; argc--; argv++; if (key > 0xFF || mask > 0xFF) return -1; key <<= 20; mask <<= 20; key = htonl(key); mask = htonl(mask); res = pack_key(sel, key, mask, off, offmask); if (res < 0) return -1; *argc_p = argc; *argv_p = argv; return 0; }
int pack_key8(__u32 retain, struct m_pedit_sel *sel, struct m_pedit_key *tkey) { int ind, stride; __u32 m[4] = { 0x00FFFFFF, 0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00 }; if (tkey->val > 0xFF || tkey->mask > 0xFF) { fprintf(stderr, "pack_key8 bad value (val %x mask %x\n", tkey->val, tkey->mask); return -1; } ind = tkey->off & 3; stride = 8 * (3 - ind); tkey->val = htonl((tkey->val & retain) << stride); tkey->mask = htonl(((tkey->mask | ~retain) << stride) | m[ind]); tkey->off &= ~3; if (pedit_debug) printf("pack_key8: Final word off %d val %08x mask %08x\n", tkey->off, tkey->val, tkey->mask); return pack_key(sel, tkey); }
static int pack_key32(struct tc_u32_sel *sel, __u32 key, __u32 mask, int off, int offmask) { key = htonl(key); mask = htonl(mask); return pack_key(sel, key, mask, off, offmask, 0); }