MT#55283 pull down skb_copy past get_target

Make the skb copy only once we know that it's for a known target.
Implies a rework of some of the early-return gotos.

No functional change.

Change-Id: Ibf5d09c0df2a91cfb50f3181e80114539e4f50a6
pull/2149/head
Richard Fuchs 3 weeks ago
parent b0eafb2fed
commit 81572a7d86

@ -7010,31 +7010,34 @@ static int rtpengine46(struct sk_buff *oskb,
unsigned int output_group_idx = 0;
struct rtpengine_output_group *output_group;
skb = skb_copy_expand(oskb, MAX_HEADER, MAX_SKB_TAIL_ROOM, GFP_ATOMIC);
if (!skb)
return NFT_CONTINUE;
uh = udp_hdr(oskb);
skb_gso_reset(skb);
src->port = ntohs(uh->source);
dst->port = ntohs(uh->dest);
// pull to transport (UDP) header
skb_pull(skb, skb->transport_header - skb->network_header);
g = get_target(t, dst);
if (!g)
return NFT_CONTINUE;
uh = udp_hdr(skb);
skb_pull(skb, sizeof(*uh));
DBG("target found, local " MIPF "\n", MIPP(g->target.local));
DBG("target decrypt RTP hmac and cipher are %s and %s", g->decrypt_rtp.hmac->name,
g->decrypt_rtp.cipher->name);
datalen = ntohs(uh->len);
if (datalen < sizeof(*uh))
goto out_no_target;
goto out_target;
datalen -= sizeof(*uh);
DBG("udp payload = %u\n", datalen);
skb_trim(skb, datalen);
src->port = ntohs(uh->source);
dst->port = ntohs(uh->dest);
skb = skb_copy_expand(oskb, MAX_HEADER, MAX_SKB_TAIL_ROOM, GFP_ATOMIC);
if (!skb)
goto out_target;
g = get_target(t, dst);
if (!g)
goto out_no_target;
skb_gso_reset(skb);
// pull and trim to data
skb_pull(skb, skb->transport_header - skb->network_header + sizeof(*uh));
skb_trim(skb, datalen);
// all our outputs filled?
_r_lock(&g->outputs_lock, flags);
@ -7045,10 +7048,6 @@ static int rtpengine46(struct sk_buff *oskb,
}
_r_unlock(&g->outputs_lock, flags);
DBG("target found, local " MIPF "\n", MIPP(g->target.local));
DBG("target decrypt RTP hmac and cipher are %s and %s", g->decrypt_rtp.hmac->name,
g->decrypt_rtp.cipher->name);
if (is_stun(g, datalen, skb->data))
goto out;
@ -7289,9 +7288,9 @@ out_error:
out:
error_nf_action = ring_buffer_insert(error_nf_action, t, g, &g->raw_ring_buf,
g->target.raw_ring_buf.num, src, &g->target.local, skb, ktime_to_us(oskb->tstamp));
target_put(g);
out_no_target:
kfree_skb(skb);
out_target:
target_put(g);
return error_nf_action;
}

Loading…
Cancel
Save