netfilter: xtables: move extension arguments into compound structure (2/6)
This patch does this for match extensions' checkentry functions. Signed-off-by: Jan Engelhardt <jengelh@medozas.de> Signed-off-by: Patrick McHardy <kaber@trash.net>
Этот коммит содержится в:

коммит произвёл
Patrick McHardy

родитель
f7108a20de
Коммит
9b4fce7a35
@@ -36,12 +36,9 @@ ebt_802_3_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
ebt_802_3_mt_check(const char *table, const void *entry,
|
||||
const struct xt_match *match, void *data,
|
||||
unsigned int hook_mask)
|
||||
static bool ebt_802_3_mt_check(const struct xt_mtchk_param *par)
|
||||
{
|
||||
const struct ebt_802_3_info *info = data;
|
||||
const struct ebt_802_3_info *info = par->matchinfo;
|
||||
|
||||
if (info->bitmask & ~EBT_802_3_MASK || info->invflags & ~EBT_802_3_MASK)
|
||||
return false;
|
||||
|
@@ -171,14 +171,11 @@ ebt_among_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
ebt_among_mt_check(const char *table, const void *entry,
|
||||
const struct xt_match *match, void *data,
|
||||
unsigned int hook_mask)
|
||||
static bool ebt_among_mt_check(const struct xt_mtchk_param *par)
|
||||
{
|
||||
const struct ebt_among_info *info = par->matchinfo;
|
||||
const struct ebt_entry_match *em =
|
||||
container_of(data, const struct ebt_entry_match, data);
|
||||
const struct ebt_among_info *info = data;
|
||||
container_of(par->matchinfo, const struct ebt_entry_match, data);
|
||||
int expected_length = sizeof(struct ebt_among_info);
|
||||
const struct ebt_mac_wormhash *wh_dst, *wh_src;
|
||||
int err;
|
||||
|
@@ -100,13 +100,10 @@ ebt_arp_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
ebt_arp_mt_check(const char *table, const void *entry,
|
||||
const struct xt_match *match, void *data,
|
||||
unsigned int hook_mask)
|
||||
static bool ebt_arp_mt_check(const struct xt_mtchk_param *par)
|
||||
{
|
||||
const struct ebt_arp_info *info = data;
|
||||
const struct ebt_entry *e = entry;
|
||||
const struct ebt_arp_info *info = par->matchinfo;
|
||||
const struct ebt_entry *e = par->entryinfo;
|
||||
|
||||
if ((e->ethproto != htons(ETH_P_ARP) &&
|
||||
e->ethproto != htons(ETH_P_RARP)) ||
|
||||
|
@@ -77,13 +77,10 @@ ebt_ip_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
ebt_ip_mt_check(const char *table, const void *entry,
|
||||
const struct xt_match *match, void *data,
|
||||
unsigned int hook_mask)
|
||||
static bool ebt_ip_mt_check(const struct xt_mtchk_param *par)
|
||||
{
|
||||
const struct ebt_ip_info *info = data;
|
||||
const struct ebt_entry *e = entry;
|
||||
const struct ebt_ip_info *info = par->matchinfo;
|
||||
const struct ebt_entry *e = par->entryinfo;
|
||||
|
||||
if (e->ethproto != htons(ETH_P_IP) ||
|
||||
e->invflags & EBT_IPROTO)
|
||||
|
@@ -90,13 +90,10 @@ ebt_ip6_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
ebt_ip6_mt_check(const char *table, const void *entry,
|
||||
const struct xt_match *match, void *data,
|
||||
unsigned int hook_mask)
|
||||
static bool ebt_ip6_mt_check(const struct xt_mtchk_param *par)
|
||||
{
|
||||
const struct ebt_entry *e = entry;
|
||||
struct ebt_ip6_info *info = data;
|
||||
const struct ebt_entry *e = par->entryinfo;
|
||||
struct ebt_ip6_info *info = par->matchinfo;
|
||||
|
||||
if (e->ethproto != htons(ETH_P_IPV6) || e->invflags & EBT_IPROTO)
|
||||
return false;
|
||||
|
@@ -64,12 +64,9 @@ user2credits(u_int32_t user)
|
||||
return (user * HZ * CREDITS_PER_JIFFY) / EBT_LIMIT_SCALE;
|
||||
}
|
||||
|
||||
static bool
|
||||
ebt_limit_mt_check(const char *table, const void *e,
|
||||
const struct xt_match *match, void *data,
|
||||
unsigned int hook_mask)
|
||||
static bool ebt_limit_mt_check(const struct xt_mtchk_param *par)
|
||||
{
|
||||
struct ebt_limit_info *info = data;
|
||||
struct ebt_limit_info *info = par->matchinfo;
|
||||
|
||||
/* Check for overflow. */
|
||||
if (info->burst == 0 ||
|
||||
|
@@ -22,12 +22,9 @@ ebt_mark_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
return ((skb->mark & info->mask) == info->mark) ^ info->invert;
|
||||
}
|
||||
|
||||
static bool
|
||||
ebt_mark_mt_check(const char *table, const void *e,
|
||||
const struct xt_match *match, void *data,
|
||||
unsigned int hook_mask)
|
||||
static bool ebt_mark_mt_check(const struct xt_mtchk_param *par)
|
||||
{
|
||||
const struct ebt_mark_m_info *info = data;
|
||||
const struct ebt_mark_m_info *info = par->matchinfo;
|
||||
|
||||
if (info->bitmask & ~EBT_MARK_MASK)
|
||||
return false;
|
||||
|
@@ -20,12 +20,9 @@ ebt_pkttype_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
return (skb->pkt_type == info->pkt_type) ^ info->invert;
|
||||
}
|
||||
|
||||
static bool
|
||||
ebt_pkttype_mt_check(const char *table, const void *e,
|
||||
const struct xt_match *match, void *data,
|
||||
unsigned int hook_mask)
|
||||
static bool ebt_pkttype_mt_check(const struct xt_mtchk_param *par)
|
||||
{
|
||||
const struct ebt_pkttype_info *info = data;
|
||||
const struct ebt_pkttype_info *info = par->matchinfo;
|
||||
|
||||
if (info->invert != 0 && info->invert != 1)
|
||||
return false;
|
||||
|
@@ -153,15 +153,12 @@ ebt_stp_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
ebt_stp_mt_check(const char *table, const void *entry,
|
||||
const struct xt_match *match, void *data,
|
||||
unsigned int hook_mask)
|
||||
static bool ebt_stp_mt_check(const struct xt_mtchk_param *par)
|
||||
{
|
||||
const struct ebt_stp_info *info = data;
|
||||
const struct ebt_stp_info *info = par->matchinfo;
|
||||
const uint8_t bridge_ula[6] = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x00};
|
||||
const uint8_t msk[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
|
||||
const struct ebt_entry *e = entry;
|
||||
const struct ebt_entry *e = par->entryinfo;
|
||||
|
||||
if (info->bitmask & ~EBT_STP_MASK || info->invflags & ~EBT_STP_MASK ||
|
||||
!(info->bitmask & EBT_STP_MASK))
|
||||
|
@@ -84,13 +84,10 @@ ebt_vlan_mt(const struct sk_buff *skb, const struct xt_match_param *par)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
ebt_vlan_mt_check(const char *table, const void *entry,
|
||||
const struct xt_match *match, void *data,
|
||||
unsigned int hook_mask)
|
||||
static bool ebt_vlan_mt_check(const struct xt_mtchk_param *par)
|
||||
{
|
||||
struct ebt_vlan_info *info = data;
|
||||
const struct ebt_entry *e = entry;
|
||||
struct ebt_vlan_info *info = par->matchinfo;
|
||||
const struct ebt_entry *e = par->entryinfo;
|
||||
|
||||
/* Is it 802.1Q frame checked? */
|
||||
if (e->ethproto != htons(ETH_P_8021Q)) {
|
||||
|
@@ -324,9 +324,10 @@ find_table_lock(const char *name, int *error, struct mutex *mutex)
|
||||
}
|
||||
|
||||
static inline int
|
||||
ebt_check_match(struct ebt_entry_match *m, struct ebt_entry *e,
|
||||
const char *name, unsigned int hookmask, unsigned int *cnt)
|
||||
ebt_check_match(struct ebt_entry_match *m, struct xt_mtchk_param *par,
|
||||
unsigned int *cnt)
|
||||
{
|
||||
const struct ebt_entry *e = par->entryinfo;
|
||||
struct xt_match *match;
|
||||
size_t left = ((char *)e + e->watchers_offset) - (char *)m;
|
||||
int ret;
|
||||
@@ -343,9 +344,10 @@ ebt_check_match(struct ebt_entry_match *m, struct ebt_entry *e,
|
||||
return -ENOENT;
|
||||
m->u.match = match;
|
||||
|
||||
ret = xt_check_match(match, NFPROTO_BRIDGE, m->match_size,
|
||||
name, hookmask, e->ethproto, e->invflags & EBT_IPROTO,
|
||||
e, m->data);
|
||||
par->match = match;
|
||||
par->matchinfo = m->data;
|
||||
ret = xt_check_match(par, NFPROTO_BRIDGE, m->match_size,
|
||||
e->ethproto, e->invflags & EBT_IPROTO);
|
||||
if (ret < 0) {
|
||||
module_put(match->me);
|
||||
return ret;
|
||||
@@ -607,6 +609,7 @@ ebt_check_entry(struct ebt_entry *e, struct ebt_table_info *newinfo,
|
||||
unsigned int i, j, hook = 0, hookmask = 0;
|
||||
size_t gap;
|
||||
int ret;
|
||||
struct xt_mtchk_param par;
|
||||
|
||||
/* don't mess with the struct ebt_entries */
|
||||
if (e->bitmask == 0)
|
||||
@@ -647,7 +650,11 @@ ebt_check_entry(struct ebt_entry *e, struct ebt_table_info *newinfo,
|
||||
hookmask = cl_s[i - 1].hookmask;
|
||||
}
|
||||
i = 0;
|
||||
ret = EBT_MATCH_ITERATE(e, ebt_check_match, e, name, hookmask, &i);
|
||||
|
||||
par.table = name;
|
||||
par.entryinfo = e;
|
||||
par.hook_mask = hookmask;
|
||||
ret = EBT_MATCH_ITERATE(e, ebt_check_match, &par, &i);
|
||||
if (ret != 0)
|
||||
goto cleanup_matches;
|
||||
j = 0;
|
||||
|
Ссылка в новой задаче
Block a user