Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 92eec78d authored by Jesper Dangaard Brouer's avatar Jesper Dangaard Brouer Committed by Simon Horman
Browse files

ipvs: SIP fragment handling



Use the nfct_reasm SKB if available.

Based on part of a patch from: Hans Schillstrom
I have left Hans'es comment in the patch (marked /HS)

Signed-off-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
Acked-by: default avatarJulian Anastasov <ja@ssi.bg>
[ horms@verge.net.au: Fix comment style ]
Signed-off-by: default avatarSimon Horman <horms@verge.net.au>
parent d4383f04
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -68,6 +68,7 @@ static int get_callid(const char *dptr, unsigned int dataoff,
static int
ip_vs_sip_fill_param(struct ip_vs_conn_param *p, struct sk_buff *skb)
{
	struct sk_buff *reasm = skb_nfct_reasm(skb);
	struct ip_vs_iphdr iph;
	unsigned int dataoff, datalen, matchoff, matchlen;
	const char *dptr;
@@ -78,13 +79,20 @@ ip_vs_sip_fill_param(struct ip_vs_conn_param *p, struct sk_buff *skb)
	/* Only useful with UDP */
	if (iph.protocol != IPPROTO_UDP)
		return -EINVAL;

	/* No Data ? */
	/* todo: IPv6 fragments:
	 *       I think this only should be done for the first fragment. /HS
	 */
	if (reasm) {
		skb = reasm;
		dataoff = iph.thoff_reasm + sizeof(struct udphdr);
	} else
		dataoff = iph.len + sizeof(struct udphdr);

	if (dataoff >= skb->len)
		return -EINVAL;

	if ((retc=skb_linearize(skb)) < 0)
	/* todo: Check if this will mess-up the reasm skb !!! /HS */
	retc = skb_linearize(skb);
	if (retc < 0)
		return retc;
	dptr = skb->data + dataoff;
	datalen = skb->len - dataoff;