static int
add_entry(const char *chain,
	  const char *table,
	  struct iptables_command_state *cs,
	  int rulenum, int family,
	  const struct addr_mask s,
	  const struct addr_mask d,
	  bool verbose, struct nft_handle *h, bool append)
{
	unsigned int i, j;
	int ret = 1;

	for (i = 0; i < s.naddrs; i++) {
		if (family == AF_INET) {
			cs->fw.ip.src.s_addr = s.addr.v4[i].s_addr;
			cs->fw.ip.smsk.s_addr = s.mask.v4[i].s_addr;
			for (j = 0; j < d.naddrs; j++) {
				cs->fw.ip.dst.s_addr = d.addr.v4[j].s_addr;
				cs->fw.ip.dmsk.s_addr = d.mask.v4[j].s_addr;

				if (append) {
					ret = nft_rule_append(h, chain, table,
							      cs, 0,
							      verbose);
				} else {
					ret = nft_rule_insert(h, chain, table,
							      cs, rulenum,
							      verbose);
				}
			}
		} else if (family == AF_INET6) {
			memcpy(&cs->fw6.ipv6.src,
			       &s.addr.v6[i], sizeof(struct in6_addr));
			memcpy(&cs->fw6.ipv6.smsk,
			       &s.mask.v6[i], sizeof(struct in6_addr));
			for (j = 0; j < d.naddrs; j++) {
				memcpy(&cs->fw6.ipv6.dst,
				       &d.addr.v6[j], sizeof(struct in6_addr));
				memcpy(&cs->fw6.ipv6.dmsk,
				       &d.mask.v6[j], sizeof(struct in6_addr));
				if (append) {
					ret = nft_rule_append(h, chain, table,
							      cs, 0,
							      verbose);
				} else {
					ret = nft_rule_insert(h, chain, table,
							      cs, rulenum,
							      verbose);
				}
			}
		}
	}

	return ret;
}
Ejemplo n.º 2
0
static int
append_entry(struct nft_handle *h,
	     const char *chain,
	     const char *table,
	     struct arptables_command_state *cs,
	     int rulenum,
	     unsigned int nsaddrs,
	     const struct in_addr saddrs[],
	     unsigned int ndaddrs,
	     const struct in_addr daddrs[],
	     bool verbose, bool append)
{
	unsigned int i, j;
	int ret = 1;

	for (i = 0; i < nsaddrs; i++) {
		cs->fw.arp.src.s_addr = saddrs[i].s_addr;
		for (j = 0; j < ndaddrs; j++) {
			cs->fw.arp.tgt.s_addr = daddrs[j].s_addr;
			if (append) {
				ret = nft_rule_append(h, chain, table, cs, 0,
						      verbose);
			} else {
				ret = nft_rule_insert(h, chain, table, cs,
						      rulenum, verbose);
			}
		}
	}

	return ret;
}
Ejemplo n.º 3
0
static int
append_entry(struct nft_handle *h,
	     const char *chain,
	     const char *table,
	     struct ebtables_command_state *cs,
	     int rule_nr,
	     bool verbose, bool append)
{
	int ret = 1;

	if (append)
		ret = nft_rule_append(h, chain, table, cs, 0, verbose);
	else
		ret = nft_rule_insert(h, chain, table, cs, rule_nr, verbose);

	return ret;
}