On Fri, 5 Feb 2016, Marco Angaroni wrote:
> the IPVS SIP persistence engine is not able to parse the SIP header
> “Call-ID” when such header is inserted in the first positions of the
> SIP message.
> When IPVS is configured with '--pe sip' option (ex. ipvsadm -A -u
> 10.0.2.15:5060 -s rr --pe sip -p 120 -o), you can verify that messages
> like this one do not create entries in the connection template table
> (ipvsadm -Lcn --persistent-conn), .
> SIP/2.0 200 OK
> Call-ID: a84b4c76e66710@xxxxxxxxxxxxxxxx
> Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds
> Max-Forwards: 70
> To: Bob <sip:bob@xxxxxxxxxx>
> From: Alice <sip:alice@xxxxxxxxxxx>;tag=1928301774
> CSeq: 314159 INVITE
> Contact: <sip:alice@xxxxxxxxxxxxxxxx>
> Content-Length: 0
> Instead when the “Call-ID” is positioned down (after “From” header for
> example), the header is recognized.
> This is due to the data offset used in get_callid function call inside
> ip_vs_pe_sip.c file: since dptr already points to the start of the SIP
> message, the value of dataoff should be initially 0. Otherwise the
> header is searched starting from some bytes after the first character
> of the SIP message.
> This patch , in my tests, solved the problem. I'm using the sources of
> kernel 3.10.0-229.20.1.el7.x86_64 (RH7).
> --- a/ip_vs_pe_sip.c 2015-09-24 17:47:25.000000000 +0200
> +++ b/ip_vs_pe_sip.c 2016-01-28 15:08:34.309934600 +0100
> @@ -88,7 +88,7 @@
> dptr = skb->data + dataoff;
> datalen = skb->len - dataoff;
> - if (get_callid(dptr, dataoff, datalen, &matchoff, &matchlen))
> + if (get_callid(dptr, 0, datalen, &matchoff, &matchlen))
> return -EINVAL;
Your fix looks correct but you have to provide
well formed patch for recent kernel source according to
- correct Subject with "ipvs: " prefix
- Signed-off-by line
- diff created in linux/ dir (for net/netfilter/ipvs/ip_vs_pe_sip.c)
You can browse the mailing list for good examples:
Julian Anastasov <ja@xxxxxx>