diff options
author | Patrick McHardy <kaber@trash.net> | 2010-02-11 06:30:21 -0500 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2010-02-11 06:30:21 -0500 |
commit | 9d288dffe3a276e1f06ba556845c456d696c5a4f (patch) | |
tree | 770d2f3aa755fa6c834e8ce3f21ebb3f19a051f4 /net | |
parent | 48f8ac26537c1b7b1a2422f5232f45d06c945348 (diff) |
netfilter: nf_conntrack_sip: add T.38 FAX support
Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/netfilter/nf_conntrack_sip.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/net/netfilter/nf_conntrack_sip.c b/net/netfilter/nf_conntrack_sip.c index 3bb3aaff76e9..fbe8ff5a420a 100644 --- a/net/netfilter/nf_conntrack_sip.c +++ b/net/netfilter/nf_conntrack_sip.c | |||
@@ -907,6 +907,7 @@ err1: | |||
907 | static const struct sdp_media_type sdp_media_types[] = { | 907 | static const struct sdp_media_type sdp_media_types[] = { |
908 | SDP_MEDIA_TYPE("audio ", SIP_EXPECT_AUDIO), | 908 | SDP_MEDIA_TYPE("audio ", SIP_EXPECT_AUDIO), |
909 | SDP_MEDIA_TYPE("video ", SIP_EXPECT_VIDEO), | 909 | SDP_MEDIA_TYPE("video ", SIP_EXPECT_VIDEO), |
910 | SDP_MEDIA_TYPE("image ", SIP_EXPECT_IMAGE), | ||
910 | }; | 911 | }; |
911 | 912 | ||
912 | static const struct sdp_media_type *sdp_media_type(const char *dptr, | 913 | static const struct sdp_media_type *sdp_media_type(const char *dptr, |
@@ -932,7 +933,6 @@ static int process_sdp(struct sk_buff *skb, unsigned int dataoff, | |||
932 | { | 933 | { |
933 | enum ip_conntrack_info ctinfo; | 934 | enum ip_conntrack_info ctinfo; |
934 | struct nf_conn *ct = nf_ct_get(skb, &ctinfo); | 935 | struct nf_conn *ct = nf_ct_get(skb, &ctinfo); |
935 | struct nf_conn_help *help = nfct_help(ct); | ||
936 | unsigned int matchoff, matchlen; | 936 | unsigned int matchoff, matchlen; |
937 | unsigned int mediaoff, medialen; | 937 | unsigned int mediaoff, medialen; |
938 | unsigned int sdpoff; | 938 | unsigned int sdpoff; |
@@ -1024,9 +1024,6 @@ static int process_sdp(struct sk_buff *skb, unsigned int dataoff, | |||
1024 | ret = nf_nat_sdp_session(skb, dataoff, dptr, datalen, sdpoff, | 1024 | ret = nf_nat_sdp_session(skb, dataoff, dptr, datalen, sdpoff, |
1025 | &rtp_addr); | 1025 | &rtp_addr); |
1026 | 1026 | ||
1027 | if (ret == NF_ACCEPT && i > 0) | ||
1028 | help->help.ct_sip_info.invite_cseq = cseq; | ||
1029 | |||
1030 | return ret; | 1027 | return ret; |
1031 | } | 1028 | } |
1032 | static int process_invite_response(struct sk_buff *skb, unsigned int dataoff, | 1029 | static int process_invite_response(struct sk_buff *skb, unsigned int dataoff, |
@@ -1077,6 +1074,22 @@ static int process_prack_response(struct sk_buff *skb, unsigned int dataoff, | |||
1077 | return NF_ACCEPT; | 1074 | return NF_ACCEPT; |
1078 | } | 1075 | } |
1079 | 1076 | ||
1077 | static int process_invite_request(struct sk_buff *skb, unsigned int dataoff, | ||
1078 | const char **dptr, unsigned int *datalen, | ||
1079 | unsigned int cseq) | ||
1080 | { | ||
1081 | enum ip_conntrack_info ctinfo; | ||
1082 | struct nf_conn *ct = nf_ct_get(skb, &ctinfo); | ||
1083 | struct nf_conn_help *help = nfct_help(ct); | ||
1084 | unsigned int ret; | ||
1085 | |||
1086 | flush_expectations(ct, true); | ||
1087 | ret = process_sdp(skb, dataoff, dptr, datalen, cseq); | ||
1088 | if (ret == NF_ACCEPT) | ||
1089 | help->help.ct_sip_info.invite_cseq = cseq; | ||
1090 | return ret; | ||
1091 | } | ||
1092 | |||
1080 | static int process_bye_request(struct sk_buff *skb, unsigned int dataoff, | 1093 | static int process_bye_request(struct sk_buff *skb, unsigned int dataoff, |
1081 | const char **dptr, unsigned int *datalen, | 1094 | const char **dptr, unsigned int *datalen, |
1082 | unsigned int cseq) | 1095 | unsigned int cseq) |
@@ -1257,7 +1270,7 @@ flush: | |||
1257 | } | 1270 | } |
1258 | 1271 | ||
1259 | static const struct sip_handler sip_handlers[] = { | 1272 | static const struct sip_handler sip_handlers[] = { |
1260 | SIP_HANDLER("INVITE", process_sdp, process_invite_response), | 1273 | SIP_HANDLER("INVITE", process_invite_request, process_invite_response), |
1261 | SIP_HANDLER("UPDATE", process_sdp, process_update_response), | 1274 | SIP_HANDLER("UPDATE", process_sdp, process_update_response), |
1262 | SIP_HANDLER("ACK", process_sdp, NULL), | 1275 | SIP_HANDLER("ACK", process_sdp, NULL), |
1263 | SIP_HANDLER("PRACK", process_sdp, process_prack_response), | 1276 | SIP_HANDLER("PRACK", process_sdp, process_prack_response), |
@@ -1473,6 +1486,11 @@ static const struct nf_conntrack_expect_policy sip_exp_policy[SIP_EXPECT_MAX + 1 | |||
1473 | .max_expected = 2 * IP_CT_DIR_MAX, | 1486 | .max_expected = 2 * IP_CT_DIR_MAX, |
1474 | .timeout = 3 * 60, | 1487 | .timeout = 3 * 60, |
1475 | }, | 1488 | }, |
1489 | [SIP_EXPECT_IMAGE] = { | ||
1490 | .name = "image", | ||
1491 | .max_expected = IP_CT_DIR_MAX, | ||
1492 | .timeout = 3 * 60, | ||
1493 | }, | ||
1476 | }; | 1494 | }; |
1477 | 1495 | ||
1478 | static void nf_conntrack_sip_fini(void) | 1496 | static void nf_conntrack_sip_fini(void) |