{.name = "and-mark", .has_arg = true, .val = '&'},
{.name = "or-mark", .has_arg = true, .val = '|'},
{.name = "xor-mark", .has_arg = true, .val = '^'},
+ {.name = "copy-xid", .has_arg = true, .val = '%'},
{ .name = NULL }
};
" --set-mark value[/mask] Clear bits in mask and OR value into nfmark\n"
" --and-mark bits Binary AND the nfmark with bits\n"
" --or-mark bits Binary OR the nfmark with bits\n"
+" --copy-xid Set nfmark to be the connection xid (PlanetLab specific)\n"
" --xor-mask bits Binary XOR the nfmark with bits\n"
"\n");
}
info->mask = 0;
break;
+ case '%': /* --copy-xid */
+ param_act(P_ONE_ACTION, "MARK", *flags & F_MARK);
+ info->mark = ~0U; /* Consistency check */
+ info->mask = mask;
+ break;
+
default:
return false;
}
{
if (flags == 0)
exit_error(PARAMETER_PROBLEM, "MARK: One of the --set-xmark, "
- "--{and,or,xor,set}-mark options is required");
+ "--{and,or,xor,set}-mark, or --copy-xid options is required");
}
static void
}
static void mark_tg_print(const void *ip, const struct xt_entry_target *target,
- int numeric)
+ int numeric)
{
- const struct xt_mark_tginfo2 *info = (const void *)target->data;
-
- if (info->mark == 0)
- printf("MARK and 0x%x ", (unsigned int)(u_int32_t)~info->mask);
- else if (info->mark == info->mask)
- printf("MARK or 0x%x ", info->mark);
- else if (info->mask == 0)
- printf("MARK xor 0x%x ", info->mark);
- else
- printf("MARK xset 0x%x/0x%x ", info->mark, info->mask);
+ const struct xt_mark_tginfo2 *info = (const void *)target->data;
+
+ if (info->mark == ~0U)
+ printf("MARK copy-xid");
+ else if (info->mark == 0)
+ printf("MARK and 0x%x ", (unsigned int)(u_int32_t)~info->mask);
+ else if (info->mark == info->mask)
+ printf("MARK or 0x%x ", info->mark);
+ else if (info->mask == 0)
+ printf("MARK xor 0x%x ", info->mark);
+ else
+ printf("MARK xset 0x%x/0x%x ", info->mark, info->mask);
}
/* Saves the union ipt_targinfo in parsable form to stdout. */
{
const struct xt_mark_tginfo2 *info = (const void *)target->data;
- printf("--set-xmark 0x%x/0x%x ", info->mark, info->mask);
+ if (info->mark==~0U)
+ printf("--copy-xid 0x0");
+ else
+ printf("--set-xmark 0x%x/0x%x ", info->mark, info->mask);
}
static struct xtables_target mark_target_v0 = {