forked from Minki/linux
Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf
Pablo Neira Ayuso says: ==================== Netfilter fixes for net 1) Update debugging in IPVS tcp protocol handler to make it easier to understand, from longguang.yue 2) Update TCP tracker to deal with keepalive packet after re-registration, from Franceso Ruggeri. 3) Missing IP6SKB_FRAGMENTED from netfilter fragment reassembly, from Georg Kohmann. 4) Fix bogus packet drop in ebtables nat extensions, from Thimothee Cocault. 5) Fix typo in flowtable documentation. 6) Reset skb timestamp in nft_fwd_netdev. ==================== Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
594850ca43
@ -109,7 +109,7 @@ More reading
|
||||
This documentation is based on the LWN.net articles [1]_\ [2]_. Rafal Milecki
|
||||
also made a very complete and comprehensive summary called "A state of network
|
||||
acceleration" that describes how things were before this infrastructure was
|
||||
mailined [3]_ and it also makes a rough summary of this work [4]_.
|
||||
mainlined [3]_ and it also makes a rough summary of this work [4]_.
|
||||
|
||||
.. [1] https://lwn.net/Articles/738214/
|
||||
.. [2] https://lwn.net/Articles/742164/
|
||||
|
@ -891,6 +891,12 @@ static inline struct nft_expr *nft_expr_last(const struct nft_rule *rule)
|
||||
return (struct nft_expr *)&rule->data[rule->dlen];
|
||||
}
|
||||
|
||||
static inline bool nft_expr_more(const struct nft_rule *rule,
|
||||
const struct nft_expr *expr)
|
||||
{
|
||||
return expr != nft_expr_last(rule) && expr->ops;
|
||||
}
|
||||
|
||||
static inline struct nft_userdata *nft_userdata(const struct nft_rule *rule)
|
||||
{
|
||||
return (void *)&rule->data[rule->dlen];
|
||||
|
@ -21,7 +21,7 @@ ebt_dnat_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct ebt_nat_info *info = par->targinfo;
|
||||
|
||||
if (skb_ensure_writable(skb, ETH_ALEN))
|
||||
if (skb_ensure_writable(skb, 0))
|
||||
return EBT_DROP;
|
||||
|
||||
ether_addr_copy(eth_hdr(skb)->h_dest, info->mac);
|
||||
|
@ -21,7 +21,7 @@ ebt_redirect_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct ebt_redirect_info *info = par->targinfo;
|
||||
|
||||
if (skb_ensure_writable(skb, ETH_ALEN))
|
||||
if (skb_ensure_writable(skb, 0))
|
||||
return EBT_DROP;
|
||||
|
||||
if (xt_hooknum(par) != NF_BR_BROUTING)
|
||||
|
@ -22,7 +22,7 @@ ebt_snat_tg(struct sk_buff *skb, const struct xt_action_param *par)
|
||||
{
|
||||
const struct ebt_nat_info *info = par->targinfo;
|
||||
|
||||
if (skb_ensure_writable(skb, ETH_ALEN * 2))
|
||||
if (skb_ensure_writable(skb, 0))
|
||||
return EBT_DROP;
|
||||
|
||||
ether_addr_copy(eth_hdr(skb)->h_source, info->mac);
|
||||
|
@ -355,6 +355,7 @@ static int nf_ct_frag6_reasm(struct frag_queue *fq, struct sk_buff *skb,
|
||||
ipv6_hdr(skb)->payload_len = htons(payload_len);
|
||||
ipv6_change_dsfield(ipv6_hdr(skb), 0xff, ecn);
|
||||
IP6CB(skb)->frag_max_size = sizeof(struct ipv6hdr) + fq->q.max_size;
|
||||
IP6CB(skb)->flags |= IP6SKB_FRAGMENTED;
|
||||
|
||||
/* Yes, and fold redundant checksum back. 8) */
|
||||
if (skb->ip_summed == CHECKSUM_COMPLETE)
|
||||
|
@ -539,8 +539,8 @@ set_tcp_state(struct ip_vs_proto_data *pd, struct ip_vs_conn *cp,
|
||||
if (new_state != cp->state) {
|
||||
struct ip_vs_dest *dest = cp->dest;
|
||||
|
||||
IP_VS_DBG_BUF(8, "%s %s [%c%c%c%c] %s:%d->"
|
||||
"%s:%d state: %s->%s conn->refcnt:%d\n",
|
||||
IP_VS_DBG_BUF(8, "%s %s [%c%c%c%c] c:%s:%d v:%s:%d "
|
||||
"d:%s:%d state: %s->%s conn->refcnt:%d\n",
|
||||
pd->pp->name,
|
||||
((state_off == TCP_DIR_OUTPUT) ?
|
||||
"output " : "input "),
|
||||
@ -548,10 +548,12 @@ set_tcp_state(struct ip_vs_proto_data *pd, struct ip_vs_conn *cp,
|
||||
th->fin ? 'F' : '.',
|
||||
th->ack ? 'A' : '.',
|
||||
th->rst ? 'R' : '.',
|
||||
IP_VS_DBG_ADDR(cp->daf, &cp->daddr),
|
||||
ntohs(cp->dport),
|
||||
IP_VS_DBG_ADDR(cp->af, &cp->caddr),
|
||||
ntohs(cp->cport),
|
||||
IP_VS_DBG_ADDR(cp->af, &cp->vaddr),
|
||||
ntohs(cp->vport),
|
||||
IP_VS_DBG_ADDR(cp->daf, &cp->daddr),
|
||||
ntohs(cp->dport),
|
||||
tcp_state_name(cp->state),
|
||||
tcp_state_name(new_state),
|
||||
refcount_read(&cp->refcnt));
|
||||
|
@ -541,13 +541,20 @@ static bool tcp_in_window(const struct nf_conn *ct,
|
||||
swin = win << sender->td_scale;
|
||||
sender->td_maxwin = (swin == 0 ? 1 : swin);
|
||||
sender->td_maxend = end + sender->td_maxwin;
|
||||
/*
|
||||
* We haven't seen traffic in the other direction yet
|
||||
* but we have to tweak window tracking to pass III
|
||||
* and IV until that happens.
|
||||
*/
|
||||
if (receiver->td_maxwin == 0)
|
||||
if (receiver->td_maxwin == 0) {
|
||||
/* We haven't seen traffic in the other
|
||||
* direction yet but we have to tweak window
|
||||
* tracking to pass III and IV until that
|
||||
* happens.
|
||||
*/
|
||||
receiver->td_end = receiver->td_maxend = sack;
|
||||
} else if (sack == receiver->td_end + 1) {
|
||||
/* Likely a reply to a keepalive.
|
||||
* Needed for III.
|
||||
*/
|
||||
receiver->td_end++;
|
||||
}
|
||||
|
||||
}
|
||||
} else if (((state->state == TCP_CONNTRACK_SYN_SENT
|
||||
&& dir == IP_CT_DIR_ORIGINAL)
|
||||
|
@ -19,6 +19,7 @@ static void nf_do_netdev_egress(struct sk_buff *skb, struct net_device *dev)
|
||||
skb_push(skb, skb->mac_len);
|
||||
|
||||
skb->dev = dev;
|
||||
skb->tstamp = 0;
|
||||
dev_queue_xmit(skb);
|
||||
}
|
||||
|
||||
|
@ -302,7 +302,7 @@ static void nft_rule_expr_activate(const struct nft_ctx *ctx,
|
||||
struct nft_expr *expr;
|
||||
|
||||
expr = nft_expr_first(rule);
|
||||
while (expr != nft_expr_last(rule) && expr->ops) {
|
||||
while (nft_expr_more(rule, expr)) {
|
||||
if (expr->ops->activate)
|
||||
expr->ops->activate(ctx, expr);
|
||||
|
||||
@ -317,7 +317,7 @@ static void nft_rule_expr_deactivate(const struct nft_ctx *ctx,
|
||||
struct nft_expr *expr;
|
||||
|
||||
expr = nft_expr_first(rule);
|
||||
while (expr != nft_expr_last(rule) && expr->ops) {
|
||||
while (nft_expr_more(rule, expr)) {
|
||||
if (expr->ops->deactivate)
|
||||
expr->ops->deactivate(ctx, expr, phase);
|
||||
|
||||
@ -3080,7 +3080,7 @@ static void nf_tables_rule_destroy(const struct nft_ctx *ctx,
|
||||
* is called on error from nf_tables_newrule().
|
||||
*/
|
||||
expr = nft_expr_first(rule);
|
||||
while (expr != nft_expr_last(rule) && expr->ops) {
|
||||
while (nft_expr_more(rule, expr)) {
|
||||
next = nft_expr_next(expr);
|
||||
nf_tables_expr_destroy(ctx, expr);
|
||||
expr = next;
|
||||
|
@ -37,7 +37,7 @@ struct nft_flow_rule *nft_flow_rule_create(struct net *net,
|
||||
struct nft_expr *expr;
|
||||
|
||||
expr = nft_expr_first(rule);
|
||||
while (expr->ops && expr != nft_expr_last(rule)) {
|
||||
while (nft_expr_more(rule, expr)) {
|
||||
if (expr->ops->offload_flags & NFT_OFFLOAD_F_ACTION)
|
||||
num_actions++;
|
||||
|
||||
@ -61,7 +61,7 @@ struct nft_flow_rule *nft_flow_rule_create(struct net *net,
|
||||
ctx->net = net;
|
||||
ctx->dep.type = NFT_OFFLOAD_DEP_UNSPEC;
|
||||
|
||||
while (expr->ops && expr != nft_expr_last(rule)) {
|
||||
while (nft_expr_more(rule, expr)) {
|
||||
if (!expr->ops->offload) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto err_out;
|
||||
|
@ -138,6 +138,7 @@ static void nft_fwd_neigh_eval(const struct nft_expr *expr,
|
||||
return;
|
||||
|
||||
skb->dev = dev;
|
||||
skb->tstamp = 0;
|
||||
neigh_xmit(neigh_table, dev, addr, skb);
|
||||
out:
|
||||
regs->verdict.code = verdict;
|
||||
|
Loading…
Reference in New Issue
Block a user