Beispiel #1
0
static int mangle_content_len(struct sk_buff *skb, unsigned int dataoff,
			      const char **dptr, unsigned int *datalen)
{
	enum ip_conntrack_info ctinfo;
	struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
	unsigned int matchoff, matchlen;
	char buffer[sizeof("65536")];
	int buflen, c_len;

	/* Get actual SDP length */
	if (ct_sip_get_sdp_header(ct, *dptr, 0, *datalen,
				  SDP_HDR_VERSION, SDP_HDR_UNSPEC,
				  &matchoff, &matchlen) <= 0)
		return 0;
	c_len = *datalen - matchoff + strlen("v=");

	/* Now, update SDP length */
	if (ct_sip_get_header(ct, *dptr, 0, *datalen, SIP_HDR_CONTENT_LENGTH,
			      &matchoff, &matchlen) <= 0)
		return 0;

	buflen = sprintf(buffer, "%u", c_len);
	return mangle_packet(skb, dataoff, dptr, datalen, matchoff, matchlen,
			     buffer, buflen);
}
Beispiel #2
0
static unsigned mangle_sdp_packet(struct sk_buff *skb, const char **dptr,
                  unsigned int dataoff, unsigned int *datalen,
                  enum sdp_header_types type,
                  enum sdp_header_types term,
                  char *buffer, int buflen)
{
    enum ip_conntrack_info ctinfo;
    struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
    unsigned int matchlen, matchoff;

    if (ct_sip_get_sdp_header(ct, *dptr, dataoff, *datalen, type, term,
                  &matchoff, &matchlen) <= 0)
        return 0;
    return mangle_packet(skb, dptr, datalen, matchoff, matchlen,
                 buffer, buflen);
}