nf_conntrack_sip.c 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683
  1. /* SIP extension for IP connection tracking.
  2. *
  3. * (C) 2005 by Christian Hentschel <chentschel@arnet.com.ar>
  4. * based on RR's ip_conntrack_ftp.c and other modules.
  5. * (C) 2007 United Security Providers
  6. * (C) 2007, 2008 Patrick McHardy <kaber@trash.net>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include <linux/module.h>
  13. #include <linux/ctype.h>
  14. #include <linux/skbuff.h>
  15. #include <linux/inet.h>
  16. #include <linux/in.h>
  17. #include <linux/udp.h>
  18. #include <linux/tcp.h>
  19. #include <linux/netfilter.h>
  20. #include <net/netfilter/nf_conntrack.h>
  21. #include <net/netfilter/nf_conntrack_core.h>
  22. #include <net/netfilter/nf_conntrack_expect.h>
  23. #include <net/netfilter/nf_conntrack_helper.h>
  24. #include <net/netfilter/nf_conntrack_zones.h>
  25. #include <linux/netfilter/nf_conntrack_sip.h>
  26. MODULE_LICENSE("GPL");
  27. MODULE_AUTHOR("Christian Hentschel <chentschel@arnet.com.ar>");
  28. MODULE_DESCRIPTION("SIP connection tracking helper");
  29. MODULE_ALIAS("ip_conntrack_sip");
  30. MODULE_ALIAS_NFCT_HELPER("sip");
  31. #define MAX_PORTS 8
  32. static unsigned short ports[MAX_PORTS];
  33. static unsigned int ports_c;
  34. module_param_array(ports, ushort, &ports_c, 0400);
  35. MODULE_PARM_DESC(ports, "port numbers of SIP servers");
  36. static unsigned int sip_timeout __read_mostly = SIP_TIMEOUT;
  37. module_param(sip_timeout, uint, 0600);
  38. MODULE_PARM_DESC(sip_timeout, "timeout for the master SIP session");
  39. static int sip_direct_signalling __read_mostly = 1;
  40. module_param(sip_direct_signalling, int, 0600);
  41. MODULE_PARM_DESC(sip_direct_signalling, "expect incoming calls from registrar "
  42. "only (default 1)");
  43. static int sip_direct_media __read_mostly = 1;
  44. module_param(sip_direct_media, int, 0600);
  45. MODULE_PARM_DESC(sip_direct_media, "Expect Media streams between signalling "
  46. "endpoints only (default 1)");
  47. const struct nf_nat_sip_hooks *nf_nat_sip_hooks;
  48. EXPORT_SYMBOL_GPL(nf_nat_sip_hooks);
  49. static int string_len(const struct nf_conn *ct, const char *dptr,
  50. const char *limit, int *shift)
  51. {
  52. int len = 0;
  53. while (dptr < limit && isalpha(*dptr)) {
  54. dptr++;
  55. len++;
  56. }
  57. return len;
  58. }
  59. static int digits_len(const struct nf_conn *ct, const char *dptr,
  60. const char *limit, int *shift)
  61. {
  62. int len = 0;
  63. while (dptr < limit && isdigit(*dptr)) {
  64. dptr++;
  65. len++;
  66. }
  67. return len;
  68. }
  69. static int iswordc(const char c)
  70. {
  71. if (isalnum(c) || c == '!' || c == '"' || c == '%' ||
  72. (c >= '(' && c <= '/') || c == ':' || c == '<' || c == '>' ||
  73. c == '?' || (c >= '[' && c <= ']') || c == '_' || c == '`' ||
  74. c == '{' || c == '}' || c == '~')
  75. return 1;
  76. return 0;
  77. }
  78. static int word_len(const char *dptr, const char *limit)
  79. {
  80. int len = 0;
  81. while (dptr < limit && iswordc(*dptr)) {
  82. dptr++;
  83. len++;
  84. }
  85. return len;
  86. }
  87. static int callid_len(const struct nf_conn *ct, const char *dptr,
  88. const char *limit, int *shift)
  89. {
  90. int len, domain_len;
  91. len = word_len(dptr, limit);
  92. dptr += len;
  93. if (!len || dptr == limit || *dptr != '@')
  94. return len;
  95. dptr++;
  96. len++;
  97. domain_len = word_len(dptr, limit);
  98. if (!domain_len)
  99. return 0;
  100. return len + domain_len;
  101. }
  102. /* get media type + port length */
  103. static int media_len(const struct nf_conn *ct, const char *dptr,
  104. const char *limit, int *shift)
  105. {
  106. int len = string_len(ct, dptr, limit, shift);
  107. dptr += len;
  108. if (dptr >= limit || *dptr != ' ')
  109. return 0;
  110. len++;
  111. dptr++;
  112. return len + digits_len(ct, dptr, limit, shift);
  113. }
  114. static int sip_parse_addr(const struct nf_conn *ct, const char *cp,
  115. const char **endp, union nf_inet_addr *addr,
  116. const char *limit, bool delim)
  117. {
  118. const char *end;
  119. int ret;
  120. if (!ct)
  121. return 0;
  122. memset(addr, 0, sizeof(*addr));
  123. switch (nf_ct_l3num(ct)) {
  124. case AF_INET:
  125. ret = in4_pton(cp, limit - cp, (u8 *)&addr->ip, -1, &end);
  126. if (ret == 0)
  127. return 0;
  128. break;
  129. case AF_INET6:
  130. if (cp < limit && *cp == '[')
  131. cp++;
  132. else if (delim)
  133. return 0;
  134. ret = in6_pton(cp, limit - cp, (u8 *)&addr->ip6, -1, &end);
  135. if (ret == 0)
  136. return 0;
  137. if (end < limit && *end == ']')
  138. end++;
  139. else if (delim)
  140. return 0;
  141. break;
  142. default:
  143. BUG();
  144. }
  145. if (endp)
  146. *endp = end;
  147. return 1;
  148. }
  149. /* skip ip address. returns its length. */
  150. static int epaddr_len(const struct nf_conn *ct, const char *dptr,
  151. const char *limit, int *shift)
  152. {
  153. union nf_inet_addr addr;
  154. const char *aux = dptr;
  155. if (!sip_parse_addr(ct, dptr, &dptr, &addr, limit, true)) {
  156. pr_debug("ip: %s parse failed.!\n", dptr);
  157. return 0;
  158. }
  159. /* Port number */
  160. if (*dptr == ':') {
  161. dptr++;
  162. dptr += digits_len(ct, dptr, limit, shift);
  163. }
  164. return dptr - aux;
  165. }
  166. /* get address length, skiping user info. */
  167. static int skp_epaddr_len(const struct nf_conn *ct, const char *dptr,
  168. const char *limit, int *shift)
  169. {
  170. const char *start = dptr;
  171. int s = *shift;
  172. /* Search for @, but stop at the end of the line.
  173. * We are inside a sip: URI, so we don't need to worry about
  174. * continuation lines. */
  175. while (dptr < limit &&
  176. *dptr != '@' && *dptr != '\r' && *dptr != '\n') {
  177. (*shift)++;
  178. dptr++;
  179. }
  180. if (dptr < limit && *dptr == '@') {
  181. dptr++;
  182. (*shift)++;
  183. } else {
  184. dptr = start;
  185. *shift = s;
  186. }
  187. return epaddr_len(ct, dptr, limit, shift);
  188. }
  189. /* Parse a SIP request line of the form:
  190. *
  191. * Request-Line = Method SP Request-URI SP SIP-Version CRLF
  192. *
  193. * and return the offset and length of the address contained in the Request-URI.
  194. */
  195. int ct_sip_parse_request(const struct nf_conn *ct,
  196. const char *dptr, unsigned int datalen,
  197. unsigned int *matchoff, unsigned int *matchlen,
  198. union nf_inet_addr *addr, __be16 *port)
  199. {
  200. const char *start = dptr, *limit = dptr + datalen, *end;
  201. unsigned int mlen;
  202. unsigned int p;
  203. int shift = 0;
  204. /* Skip method and following whitespace */
  205. mlen = string_len(ct, dptr, limit, NULL);
  206. if (!mlen)
  207. return 0;
  208. dptr += mlen;
  209. if (++dptr >= limit)
  210. return 0;
  211. /* Find SIP URI */
  212. for (; dptr < limit - strlen("sip:"); dptr++) {
  213. if (*dptr == '\r' || *dptr == '\n')
  214. return -1;
  215. if (strncasecmp(dptr, "sip:", strlen("sip:")) == 0) {
  216. dptr += strlen("sip:");
  217. break;
  218. }
  219. }
  220. if (!skp_epaddr_len(ct, dptr, limit, &shift))
  221. return 0;
  222. dptr += shift;
  223. if (!sip_parse_addr(ct, dptr, &end, addr, limit, true))
  224. return -1;
  225. if (end < limit && *end == ':') {
  226. end++;
  227. p = simple_strtoul(end, (char **)&end, 10);
  228. if (p < 1024 || p > 65535)
  229. return -1;
  230. *port = htons(p);
  231. } else
  232. *port = htons(SIP_PORT);
  233. if (end == dptr)
  234. return 0;
  235. *matchoff = dptr - start;
  236. *matchlen = end - dptr;
  237. return 1;
  238. }
  239. EXPORT_SYMBOL_GPL(ct_sip_parse_request);
  240. /* SIP header parsing: SIP headers are located at the beginning of a line, but
  241. * may span several lines, in which case the continuation lines begin with a
  242. * whitespace character. RFC 2543 allows lines to be terminated with CR, LF or
  243. * CRLF, RFC 3261 allows only CRLF, we support both.
  244. *
  245. * Headers are followed by (optionally) whitespace, a colon, again (optionally)
  246. * whitespace and the values. Whitespace in this context means any amount of
  247. * tabs, spaces and continuation lines, which are treated as a single whitespace
  248. * character.
  249. *
  250. * Some headers may appear multiple times. A comma separated list of values is
  251. * equivalent to multiple headers.
  252. */
  253. static const struct sip_header ct_sip_hdrs[] = {
  254. [SIP_HDR_CSEQ] = SIP_HDR("CSeq", NULL, NULL, digits_len),
  255. [SIP_HDR_FROM] = SIP_HDR("From", "f", "sip:", skp_epaddr_len),
  256. [SIP_HDR_TO] = SIP_HDR("To", "t", "sip:", skp_epaddr_len),
  257. [SIP_HDR_CONTACT] = SIP_HDR("Contact", "m", "sip:", skp_epaddr_len),
  258. [SIP_HDR_VIA_UDP] = SIP_HDR("Via", "v", "UDP ", epaddr_len),
  259. [SIP_HDR_VIA_TCP] = SIP_HDR("Via", "v", "TCP ", epaddr_len),
  260. [SIP_HDR_EXPIRES] = SIP_HDR("Expires", NULL, NULL, digits_len),
  261. [SIP_HDR_CONTENT_LENGTH] = SIP_HDR("Content-Length", "l", NULL, digits_len),
  262. [SIP_HDR_CALL_ID] = SIP_HDR("Call-Id", "i", NULL, callid_len),
  263. };
  264. static const char *sip_follow_continuation(const char *dptr, const char *limit)
  265. {
  266. /* Walk past newline */
  267. if (++dptr >= limit)
  268. return NULL;
  269. /* Skip '\n' in CR LF */
  270. if (*(dptr - 1) == '\r' && *dptr == '\n') {
  271. if (++dptr >= limit)
  272. return NULL;
  273. }
  274. /* Continuation line? */
  275. if (*dptr != ' ' && *dptr != '\t')
  276. return NULL;
  277. /* skip leading whitespace */
  278. for (; dptr < limit; dptr++) {
  279. if (*dptr != ' ' && *dptr != '\t')
  280. break;
  281. }
  282. return dptr;
  283. }
  284. static const char *sip_skip_whitespace(const char *dptr, const char *limit)
  285. {
  286. for (; dptr < limit; dptr++) {
  287. if (*dptr == ' ')
  288. continue;
  289. if (*dptr != '\r' && *dptr != '\n')
  290. break;
  291. dptr = sip_follow_continuation(dptr, limit);
  292. if (dptr == NULL)
  293. return NULL;
  294. }
  295. return dptr;
  296. }
  297. /* Search within a SIP header value, dealing with continuation lines */
  298. static const char *ct_sip_header_search(const char *dptr, const char *limit,
  299. const char *needle, unsigned int len)
  300. {
  301. for (limit -= len; dptr < limit; dptr++) {
  302. if (*dptr == '\r' || *dptr == '\n') {
  303. dptr = sip_follow_continuation(dptr, limit);
  304. if (dptr == NULL)
  305. break;
  306. continue;
  307. }
  308. if (strncasecmp(dptr, needle, len) == 0)
  309. return dptr;
  310. }
  311. return NULL;
  312. }
  313. int ct_sip_get_header(const struct nf_conn *ct, const char *dptr,
  314. unsigned int dataoff, unsigned int datalen,
  315. enum sip_header_types type,
  316. unsigned int *matchoff, unsigned int *matchlen)
  317. {
  318. const struct sip_header *hdr = &ct_sip_hdrs[type];
  319. const char *start = dptr, *limit = dptr + datalen;
  320. int shift = 0;
  321. for (dptr += dataoff; dptr < limit; dptr++) {
  322. /* Find beginning of line */
  323. if (*dptr != '\r' && *dptr != '\n')
  324. continue;
  325. if (++dptr >= limit)
  326. break;
  327. if (*(dptr - 1) == '\r' && *dptr == '\n') {
  328. if (++dptr >= limit)
  329. break;
  330. }
  331. /* Skip continuation lines */
  332. if (*dptr == ' ' || *dptr == '\t')
  333. continue;
  334. /* Find header. Compact headers must be followed by a
  335. * non-alphabetic character to avoid mismatches. */
  336. if (limit - dptr >= hdr->len &&
  337. strncasecmp(dptr, hdr->name, hdr->len) == 0)
  338. dptr += hdr->len;
  339. else if (hdr->cname && limit - dptr >= hdr->clen + 1 &&
  340. strncasecmp(dptr, hdr->cname, hdr->clen) == 0 &&
  341. !isalpha(*(dptr + hdr->clen)))
  342. dptr += hdr->clen;
  343. else
  344. continue;
  345. /* Find and skip colon */
  346. dptr = sip_skip_whitespace(dptr, limit);
  347. if (dptr == NULL)
  348. break;
  349. if (*dptr != ':' || ++dptr >= limit)
  350. break;
  351. /* Skip whitespace after colon */
  352. dptr = sip_skip_whitespace(dptr, limit);
  353. if (dptr == NULL)
  354. break;
  355. *matchoff = dptr - start;
  356. if (hdr->search) {
  357. dptr = ct_sip_header_search(dptr, limit, hdr->search,
  358. hdr->slen);
  359. if (!dptr)
  360. return -1;
  361. dptr += hdr->slen;
  362. }
  363. *matchlen = hdr->match_len(ct, dptr, limit, &shift);
  364. if (!*matchlen)
  365. return -1;
  366. *matchoff = dptr - start + shift;
  367. return 1;
  368. }
  369. return 0;
  370. }
  371. EXPORT_SYMBOL_GPL(ct_sip_get_header);
  372. /* Get next header field in a list of comma separated values */
  373. static int ct_sip_next_header(const struct nf_conn *ct, const char *dptr,
  374. unsigned int dataoff, unsigned int datalen,
  375. enum sip_header_types type,
  376. unsigned int *matchoff, unsigned int *matchlen)
  377. {
  378. const struct sip_header *hdr = &ct_sip_hdrs[type];
  379. const char *start = dptr, *limit = dptr + datalen;
  380. int shift = 0;
  381. dptr += dataoff;
  382. dptr = ct_sip_header_search(dptr, limit, ",", strlen(","));
  383. if (!dptr)
  384. return 0;
  385. dptr = ct_sip_header_search(dptr, limit, hdr->search, hdr->slen);
  386. if (!dptr)
  387. return 0;
  388. dptr += hdr->slen;
  389. *matchoff = dptr - start;
  390. *matchlen = hdr->match_len(ct, dptr, limit, &shift);
  391. if (!*matchlen)
  392. return -1;
  393. *matchoff += shift;
  394. return 1;
  395. }
  396. /* Walk through headers until a parsable one is found or no header of the
  397. * given type is left. */
  398. static int ct_sip_walk_headers(const struct nf_conn *ct, const char *dptr,
  399. unsigned int dataoff, unsigned int datalen,
  400. enum sip_header_types type, int *in_header,
  401. unsigned int *matchoff, unsigned int *matchlen)
  402. {
  403. int ret;
  404. if (in_header && *in_header) {
  405. while (1) {
  406. ret = ct_sip_next_header(ct, dptr, dataoff, datalen,
  407. type, matchoff, matchlen);
  408. if (ret > 0)
  409. return ret;
  410. if (ret == 0)
  411. break;
  412. dataoff += *matchoff;
  413. }
  414. *in_header = 0;
  415. }
  416. while (1) {
  417. ret = ct_sip_get_header(ct, dptr, dataoff, datalen,
  418. type, matchoff, matchlen);
  419. if (ret > 0)
  420. break;
  421. if (ret == 0)
  422. return ret;
  423. dataoff += *matchoff;
  424. }
  425. if (in_header)
  426. *in_header = 1;
  427. return 1;
  428. }
  429. /* Locate a SIP header, parse the URI and return the offset and length of
  430. * the address as well as the address and port themselves. A stream of
  431. * headers can be parsed by handing in a non-NULL datalen and in_header
  432. * pointer.
  433. */
  434. int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr,
  435. unsigned int *dataoff, unsigned int datalen,
  436. enum sip_header_types type, int *in_header,
  437. unsigned int *matchoff, unsigned int *matchlen,
  438. union nf_inet_addr *addr, __be16 *port)
  439. {
  440. const char *c, *limit = dptr + datalen;
  441. unsigned int p;
  442. int ret;
  443. ret = ct_sip_walk_headers(ct, dptr, dataoff ? *dataoff : 0, datalen,
  444. type, in_header, matchoff, matchlen);
  445. WARN_ON(ret < 0);
  446. if (ret == 0)
  447. return ret;
  448. if (!sip_parse_addr(ct, dptr + *matchoff, &c, addr, limit, true))
  449. return -1;
  450. if (*c == ':') {
  451. c++;
  452. p = simple_strtoul(c, (char **)&c, 10);
  453. if (p < 1024 || p > 65535)
  454. return -1;
  455. *port = htons(p);
  456. } else
  457. *port = htons(SIP_PORT);
  458. if (dataoff)
  459. *dataoff = c - dptr;
  460. return 1;
  461. }
  462. EXPORT_SYMBOL_GPL(ct_sip_parse_header_uri);
  463. static int ct_sip_parse_param(const struct nf_conn *ct, const char *dptr,
  464. unsigned int dataoff, unsigned int datalen,
  465. const char *name,
  466. unsigned int *matchoff, unsigned int *matchlen)
  467. {
  468. const char *limit = dptr + datalen;
  469. const char *start;
  470. const char *end;
  471. limit = ct_sip_header_search(dptr + dataoff, limit, ",", strlen(","));
  472. if (!limit)
  473. limit = dptr + datalen;
  474. start = ct_sip_header_search(dptr + dataoff, limit, name, strlen(name));
  475. if (!start)
  476. return 0;
  477. start += strlen(name);
  478. end = ct_sip_header_search(start, limit, ";", strlen(";"));
  479. if (!end)
  480. end = limit;
  481. *matchoff = start - dptr;
  482. *matchlen = end - start;
  483. return 1;
  484. }
  485. /* Parse address from header parameter and return address, offset and length */
  486. int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr,
  487. unsigned int dataoff, unsigned int datalen,
  488. const char *name,
  489. unsigned int *matchoff, unsigned int *matchlen,
  490. union nf_inet_addr *addr, bool delim)
  491. {
  492. const char *limit = dptr + datalen;
  493. const char *start, *end;
  494. limit = ct_sip_header_search(dptr + dataoff, limit, ",", strlen(","));
  495. if (!limit)
  496. limit = dptr + datalen;
  497. start = ct_sip_header_search(dptr + dataoff, limit, name, strlen(name));
  498. if (!start)
  499. return 0;
  500. start += strlen(name);
  501. if (!sip_parse_addr(ct, start, &end, addr, limit, delim))
  502. return 0;
  503. *matchoff = start - dptr;
  504. *matchlen = end - start;
  505. return 1;
  506. }
  507. EXPORT_SYMBOL_GPL(ct_sip_parse_address_param);
  508. /* Parse numerical header parameter and return value, offset and length */
  509. int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr,
  510. unsigned int dataoff, unsigned int datalen,
  511. const char *name,
  512. unsigned int *matchoff, unsigned int *matchlen,
  513. unsigned int *val)
  514. {
  515. const char *limit = dptr + datalen;
  516. const char *start;
  517. char *end;
  518. limit = ct_sip_header_search(dptr + dataoff, limit, ",", strlen(","));
  519. if (!limit)
  520. limit = dptr + datalen;
  521. start = ct_sip_header_search(dptr + dataoff, limit, name, strlen(name));
  522. if (!start)
  523. return 0;
  524. start += strlen(name);
  525. *val = simple_strtoul(start, &end, 0);
  526. if (start == end)
  527. return 0;
  528. if (matchoff && matchlen) {
  529. *matchoff = start - dptr;
  530. *matchlen = end - start;
  531. }
  532. return 1;
  533. }
  534. EXPORT_SYMBOL_GPL(ct_sip_parse_numerical_param);
  535. static int ct_sip_parse_transport(struct nf_conn *ct, const char *dptr,
  536. unsigned int dataoff, unsigned int datalen,
  537. u8 *proto)
  538. {
  539. unsigned int matchoff, matchlen;
  540. if (ct_sip_parse_param(ct, dptr, dataoff, datalen, "transport=",
  541. &matchoff, &matchlen)) {
  542. if (!strncasecmp(dptr + matchoff, "TCP", strlen("TCP")))
  543. *proto = IPPROTO_TCP;
  544. else if (!strncasecmp(dptr + matchoff, "UDP", strlen("UDP")))
  545. *proto = IPPROTO_UDP;
  546. else
  547. return 0;
  548. if (*proto != nf_ct_protonum(ct))
  549. return 0;
  550. } else
  551. *proto = nf_ct_protonum(ct);
  552. return 1;
  553. }
  554. static int sdp_parse_addr(const struct nf_conn *ct, const char *cp,
  555. const char **endp, union nf_inet_addr *addr,
  556. const char *limit)
  557. {
  558. const char *end;
  559. int ret;
  560. memset(addr, 0, sizeof(*addr));
  561. switch (nf_ct_l3num(ct)) {
  562. case AF_INET:
  563. ret = in4_pton(cp, limit - cp, (u8 *)&addr->ip, -1, &end);
  564. break;
  565. case AF_INET6:
  566. ret = in6_pton(cp, limit - cp, (u8 *)&addr->ip6, -1, &end);
  567. break;
  568. default:
  569. BUG();
  570. }
  571. if (ret == 0)
  572. return 0;
  573. if (endp)
  574. *endp = end;
  575. return 1;
  576. }
  577. /* skip ip address. returns its length. */
  578. static int sdp_addr_len(const struct nf_conn *ct, const char *dptr,
  579. const char *limit, int *shift)
  580. {
  581. union nf_inet_addr addr;
  582. const char *aux = dptr;
  583. if (!sdp_parse_addr(ct, dptr, &dptr, &addr, limit)) {
  584. pr_debug("ip: %s parse failed.!\n", dptr);
  585. return 0;
  586. }
  587. return dptr - aux;
  588. }
  589. /* SDP header parsing: a SDP session description contains an ordered set of
  590. * headers, starting with a section containing general session parameters,
  591. * optionally followed by multiple media descriptions.
  592. *
  593. * SDP headers always start at the beginning of a line. According to RFC 2327:
  594. * "The sequence CRLF (0x0d0a) is used to end a record, although parsers should
  595. * be tolerant and also accept records terminated with a single newline
  596. * character". We handle both cases.
  597. */
  598. static const struct sip_header ct_sdp_hdrs_v4[] = {
  599. [SDP_HDR_VERSION] = SDP_HDR("v=", NULL, digits_len),
  600. [SDP_HDR_OWNER] = SDP_HDR("o=", "IN IP4 ", sdp_addr_len),
  601. [SDP_HDR_CONNECTION] = SDP_HDR("c=", "IN IP4 ", sdp_addr_len),
  602. [SDP_HDR_MEDIA] = SDP_HDR("m=", NULL, media_len),
  603. };
  604. static const struct sip_header ct_sdp_hdrs_v6[] = {
  605. [SDP_HDR_VERSION] = SDP_HDR("v=", NULL, digits_len),
  606. [SDP_HDR_OWNER] = SDP_HDR("o=", "IN IP6 ", sdp_addr_len),
  607. [SDP_HDR_CONNECTION] = SDP_HDR("c=", "IN IP6 ", sdp_addr_len),
  608. [SDP_HDR_MEDIA] = SDP_HDR("m=", NULL, media_len),
  609. };
  610. /* Linear string search within SDP header values */
  611. static const char *ct_sdp_header_search(const char *dptr, const char *limit,
  612. const char *needle, unsigned int len)
  613. {
  614. for (limit -= len; dptr < limit; dptr++) {
  615. if (*dptr == '\r' || *dptr == '\n')
  616. break;
  617. if (strncmp(dptr, needle, len) == 0)
  618. return dptr;
  619. }
  620. return NULL;
  621. }
  622. /* Locate a SDP header (optionally a substring within the header value),
  623. * optionally stopping at the first occurrence of the term header, parse
  624. * it and return the offset and length of the data we're interested in.
  625. */
  626. int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr,
  627. unsigned int dataoff, unsigned int datalen,
  628. enum sdp_header_types type,
  629. enum sdp_header_types term,
  630. unsigned int *matchoff, unsigned int *matchlen)
  631. {
  632. const struct sip_header *hdrs, *hdr, *thdr;
  633. const char *start = dptr, *limit = dptr + datalen;
  634. int shift = 0;
  635. hdrs = nf_ct_l3num(ct) == NFPROTO_IPV4 ? ct_sdp_hdrs_v4 : ct_sdp_hdrs_v6;
  636. hdr = &hdrs[type];
  637. thdr = &hdrs[term];
  638. for (dptr += dataoff; dptr < limit; dptr++) {
  639. /* Find beginning of line */
  640. if (*dptr != '\r' && *dptr != '\n')
  641. continue;
  642. if (++dptr >= limit)
  643. break;
  644. if (*(dptr - 1) == '\r' && *dptr == '\n') {
  645. if (++dptr >= limit)
  646. break;
  647. }
  648. if (term != SDP_HDR_UNSPEC &&
  649. limit - dptr >= thdr->len &&
  650. strncasecmp(dptr, thdr->name, thdr->len) == 0)
  651. break;
  652. else if (limit - dptr >= hdr->len &&
  653. strncasecmp(dptr, hdr->name, hdr->len) == 0)
  654. dptr += hdr->len;
  655. else
  656. continue;
  657. *matchoff = dptr - start;
  658. if (hdr->search) {
  659. dptr = ct_sdp_header_search(dptr, limit, hdr->search,
  660. hdr->slen);
  661. if (!dptr)
  662. return -1;
  663. dptr += hdr->slen;
  664. }
  665. *matchlen = hdr->match_len(ct, dptr, limit, &shift);
  666. if (!*matchlen)
  667. return -1;
  668. *matchoff = dptr - start + shift;
  669. return 1;
  670. }
  671. return 0;
  672. }
  673. EXPORT_SYMBOL_GPL(ct_sip_get_sdp_header);
  674. static int ct_sip_parse_sdp_addr(const struct nf_conn *ct, const char *dptr,
  675. unsigned int dataoff, unsigned int datalen,
  676. enum sdp_header_types type,
  677. enum sdp_header_types term,
  678. unsigned int *matchoff, unsigned int *matchlen,
  679. union nf_inet_addr *addr)
  680. {
  681. int ret;
  682. ret = ct_sip_get_sdp_header(ct, dptr, dataoff, datalen, type, term,
  683. matchoff, matchlen);
  684. if (ret <= 0)
  685. return ret;
  686. if (!sdp_parse_addr(ct, dptr + *matchoff, NULL, addr,
  687. dptr + *matchoff + *matchlen))
  688. return -1;
  689. return 1;
  690. }
  691. static int refresh_signalling_expectation(struct nf_conn *ct,
  692. union nf_inet_addr *addr,
  693. u8 proto, __be16 port,
  694. unsigned int expires)
  695. {
  696. struct nf_conn_help *help = nfct_help(ct);
  697. struct nf_conntrack_expect *exp;
  698. struct hlist_node *next;
  699. int found = 0;
  700. spin_lock_bh(&nf_conntrack_expect_lock);
  701. hlist_for_each_entry_safe(exp, next, &help->expectations, lnode) {
  702. if (exp->class != SIP_EXPECT_SIGNALLING ||
  703. !nf_inet_addr_cmp(&exp->tuple.dst.u3, addr) ||
  704. exp->tuple.dst.protonum != proto ||
  705. exp->tuple.dst.u.udp.port != port)
  706. continue;
  707. if (!del_timer(&exp->timeout))
  708. continue;
  709. exp->flags &= ~NF_CT_EXPECT_INACTIVE;
  710. exp->timeout.expires = jiffies + expires * HZ;
  711. add_timer(&exp->timeout);
  712. found = 1;
  713. break;
  714. }
  715. spin_unlock_bh(&nf_conntrack_expect_lock);
  716. return found;
  717. }
  718. static void flush_expectations(struct nf_conn *ct, bool media)
  719. {
  720. struct nf_conn_help *help = nfct_help(ct);
  721. struct nf_conntrack_expect *exp;
  722. struct hlist_node *next;
  723. spin_lock_bh(&nf_conntrack_expect_lock);
  724. hlist_for_each_entry_safe(exp, next, &help->expectations, lnode) {
  725. if ((exp->class != SIP_EXPECT_SIGNALLING) ^ media)
  726. continue;
  727. if (!del_timer(&exp->timeout))
  728. continue;
  729. nf_ct_unlink_expect(exp);
  730. nf_ct_expect_put(exp);
  731. if (!media)
  732. break;
  733. }
  734. spin_unlock_bh(&nf_conntrack_expect_lock);
  735. }
  736. static int set_expected_rtp_rtcp(struct sk_buff *skb, unsigned int protoff,
  737. unsigned int dataoff,
  738. const char **dptr, unsigned int *datalen,
  739. union nf_inet_addr *daddr, __be16 port,
  740. enum sip_expectation_classes class,
  741. unsigned int mediaoff, unsigned int medialen)
  742. {
  743. struct nf_conntrack_expect *exp, *rtp_exp, *rtcp_exp;
  744. enum ip_conntrack_info ctinfo;
  745. struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
  746. struct net *net = nf_ct_net(ct);
  747. enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
  748. union nf_inet_addr *saddr;
  749. struct nf_conntrack_tuple tuple;
  750. int direct_rtp = 0, skip_expect = 0, ret = NF_DROP;
  751. u_int16_t base_port;
  752. __be16 rtp_port, rtcp_port;
  753. const struct nf_nat_sip_hooks *hooks;
  754. saddr = NULL;
  755. if (sip_direct_media) {
  756. if (!nf_inet_addr_cmp(daddr, &ct->tuplehash[dir].tuple.src.u3))
  757. return NF_ACCEPT;
  758. saddr = &ct->tuplehash[!dir].tuple.src.u3;
  759. }
  760. /* We need to check whether the registration exists before attempting
  761. * to register it since we can see the same media description multiple
  762. * times on different connections in case multiple endpoints receive
  763. * the same call.
  764. *
  765. * RTP optimization: if we find a matching media channel expectation
  766. * and both the expectation and this connection are SNATed, we assume
  767. * both sides can reach each other directly and use the final
  768. * destination address from the expectation. We still need to keep
  769. * the NATed expectations for media that might arrive from the
  770. * outside, and additionally need to expect the direct RTP stream
  771. * in case it passes through us even without NAT.
  772. */
  773. memset(&tuple, 0, sizeof(tuple));
  774. if (saddr)
  775. tuple.src.u3 = *saddr;
  776. tuple.src.l3num = nf_ct_l3num(ct);
  777. tuple.dst.protonum = IPPROTO_UDP;
  778. tuple.dst.u3 = *daddr;
  779. tuple.dst.u.udp.port = port;
  780. rcu_read_lock();
  781. do {
  782. exp = __nf_ct_expect_find(net, nf_ct_zone(ct), &tuple);
  783. if (!exp || exp->master == ct ||
  784. nfct_help(exp->master)->helper != nfct_help(ct)->helper ||
  785. exp->class != class)
  786. break;
  787. #ifdef CONFIG_NF_NAT_NEEDED
  788. if (!direct_rtp &&
  789. (!nf_inet_addr_cmp(&exp->saved_addr, &exp->tuple.dst.u3) ||
  790. exp->saved_proto.udp.port != exp->tuple.dst.u.udp.port) &&
  791. ct->status & IPS_NAT_MASK) {
  792. *daddr = exp->saved_addr;
  793. tuple.dst.u3 = exp->saved_addr;
  794. tuple.dst.u.udp.port = exp->saved_proto.udp.port;
  795. direct_rtp = 1;
  796. } else
  797. #endif
  798. skip_expect = 1;
  799. } while (!skip_expect);
  800. base_port = ntohs(tuple.dst.u.udp.port) & ~1;
  801. rtp_port = htons(base_port);
  802. rtcp_port = htons(base_port + 1);
  803. if (direct_rtp) {
  804. hooks = rcu_dereference(nf_nat_sip_hooks);
  805. if (hooks &&
  806. !hooks->sdp_port(skb, protoff, dataoff, dptr, datalen,
  807. mediaoff, medialen, ntohs(rtp_port)))
  808. goto err1;
  809. }
  810. if (skip_expect) {
  811. rcu_read_unlock();
  812. return NF_ACCEPT;
  813. }
  814. rtp_exp = nf_ct_expect_alloc(ct);
  815. if (rtp_exp == NULL)
  816. goto err1;
  817. nf_ct_expect_init(rtp_exp, class, nf_ct_l3num(ct), saddr, daddr,
  818. IPPROTO_UDP, NULL, &rtp_port);
  819. rtcp_exp = nf_ct_expect_alloc(ct);
  820. if (rtcp_exp == NULL)
  821. goto err2;
  822. nf_ct_expect_init(rtcp_exp, class, nf_ct_l3num(ct), saddr, daddr,
  823. IPPROTO_UDP, NULL, &rtcp_port);
  824. hooks = rcu_dereference(nf_nat_sip_hooks);
  825. if (hooks && ct->status & IPS_NAT_MASK && !direct_rtp)
  826. ret = hooks->sdp_media(skb, protoff, dataoff, dptr,
  827. datalen, rtp_exp, rtcp_exp,
  828. mediaoff, medialen, daddr);
  829. else {
  830. if (nf_ct_expect_related(rtp_exp) == 0) {
  831. if (nf_ct_expect_related(rtcp_exp) != 0)
  832. nf_ct_unexpect_related(rtp_exp);
  833. else
  834. ret = NF_ACCEPT;
  835. }
  836. }
  837. nf_ct_expect_put(rtcp_exp);
  838. err2:
  839. nf_ct_expect_put(rtp_exp);
  840. err1:
  841. rcu_read_unlock();
  842. return ret;
  843. }
  844. static const struct sdp_media_type sdp_media_types[] = {
  845. SDP_MEDIA_TYPE("audio ", SIP_EXPECT_AUDIO),
  846. SDP_MEDIA_TYPE("video ", SIP_EXPECT_VIDEO),
  847. SDP_MEDIA_TYPE("image ", SIP_EXPECT_IMAGE),
  848. };
  849. static const struct sdp_media_type *sdp_media_type(const char *dptr,
  850. unsigned int matchoff,
  851. unsigned int matchlen)
  852. {
  853. const struct sdp_media_type *t;
  854. unsigned int i;
  855. for (i = 0; i < ARRAY_SIZE(sdp_media_types); i++) {
  856. t = &sdp_media_types[i];
  857. if (matchlen < t->len ||
  858. strncmp(dptr + matchoff, t->name, t->len))
  859. continue;
  860. return t;
  861. }
  862. return NULL;
  863. }
  864. static int process_sdp(struct sk_buff *skb, unsigned int protoff,
  865. unsigned int dataoff,
  866. const char **dptr, unsigned int *datalen,
  867. unsigned int cseq)
  868. {
  869. enum ip_conntrack_info ctinfo;
  870. struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
  871. unsigned int matchoff, matchlen;
  872. unsigned int mediaoff, medialen;
  873. unsigned int sdpoff;
  874. unsigned int caddr_len, maddr_len;
  875. unsigned int i;
  876. union nf_inet_addr caddr, maddr, rtp_addr;
  877. const struct nf_nat_sip_hooks *hooks;
  878. unsigned int port;
  879. const struct sdp_media_type *t;
  880. int ret = NF_ACCEPT;
  881. hooks = rcu_dereference(nf_nat_sip_hooks);
  882. /* Find beginning of session description */
  883. if (ct_sip_get_sdp_header(ct, *dptr, 0, *datalen,
  884. SDP_HDR_VERSION, SDP_HDR_UNSPEC,
  885. &matchoff, &matchlen) <= 0)
  886. return NF_ACCEPT;
  887. sdpoff = matchoff;
  888. /* The connection information is contained in the session description
  889. * and/or once per media description. The first media description marks
  890. * the end of the session description. */
  891. caddr_len = 0;
  892. if (ct_sip_parse_sdp_addr(ct, *dptr, sdpoff, *datalen,
  893. SDP_HDR_CONNECTION, SDP_HDR_MEDIA,
  894. &matchoff, &matchlen, &caddr) > 0)
  895. caddr_len = matchlen;
  896. mediaoff = sdpoff;
  897. for (i = 0; i < ARRAY_SIZE(sdp_media_types); ) {
  898. if (ct_sip_get_sdp_header(ct, *dptr, mediaoff, *datalen,
  899. SDP_HDR_MEDIA, SDP_HDR_UNSPEC,
  900. &mediaoff, &medialen) <= 0)
  901. break;
  902. /* Get media type and port number. A media port value of zero
  903. * indicates an inactive stream. */
  904. t = sdp_media_type(*dptr, mediaoff, medialen);
  905. if (!t) {
  906. mediaoff += medialen;
  907. continue;
  908. }
  909. mediaoff += t->len;
  910. medialen -= t->len;
  911. port = simple_strtoul(*dptr + mediaoff, NULL, 10);
  912. if (port == 0)
  913. continue;
  914. if (port < 1024 || port > 65535) {
  915. nf_ct_helper_log(skb, ct, "wrong port %u", port);
  916. return NF_DROP;
  917. }
  918. /* The media description overrides the session description. */
  919. maddr_len = 0;
  920. if (ct_sip_parse_sdp_addr(ct, *dptr, mediaoff, *datalen,
  921. SDP_HDR_CONNECTION, SDP_HDR_MEDIA,
  922. &matchoff, &matchlen, &maddr) > 0) {
  923. maddr_len = matchlen;
  924. memcpy(&rtp_addr, &maddr, sizeof(rtp_addr));
  925. } else if (caddr_len)
  926. memcpy(&rtp_addr, &caddr, sizeof(rtp_addr));
  927. else {
  928. nf_ct_helper_log(skb, ct, "cannot parse SDP message");
  929. return NF_DROP;
  930. }
  931. ret = set_expected_rtp_rtcp(skb, protoff, dataoff,
  932. dptr, datalen,
  933. &rtp_addr, htons(port), t->class,
  934. mediaoff, medialen);
  935. if (ret != NF_ACCEPT) {
  936. nf_ct_helper_log(skb, ct,
  937. "cannot add expectation for voice");
  938. return ret;
  939. }
  940. /* Update media connection address if present */
  941. if (maddr_len && hooks && ct->status & IPS_NAT_MASK) {
  942. ret = hooks->sdp_addr(skb, protoff, dataoff,
  943. dptr, datalen, mediaoff,
  944. SDP_HDR_CONNECTION,
  945. SDP_HDR_MEDIA,
  946. &rtp_addr);
  947. if (ret != NF_ACCEPT) {
  948. nf_ct_helper_log(skb, ct, "cannot mangle SDP");
  949. return ret;
  950. }
  951. }
  952. i++;
  953. }
  954. /* Update session connection and owner addresses */
  955. hooks = rcu_dereference(nf_nat_sip_hooks);
  956. if (hooks && ct->status & IPS_NAT_MASK)
  957. ret = hooks->sdp_session(skb, protoff, dataoff,
  958. dptr, datalen, sdpoff,
  959. &rtp_addr);
  960. return ret;
  961. }
  962. static int process_invite_response(struct sk_buff *skb, unsigned int protoff,
  963. unsigned int dataoff,
  964. const char **dptr, unsigned int *datalen,
  965. unsigned int cseq, unsigned int code)
  966. {
  967. enum ip_conntrack_info ctinfo;
  968. struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
  969. struct nf_ct_sip_master *ct_sip_info = nfct_help_data(ct);
  970. if ((code >= 100 && code <= 199) ||
  971. (code >= 200 && code <= 299))
  972. return process_sdp(skb, protoff, dataoff, dptr, datalen, cseq);
  973. else if (ct_sip_info->invite_cseq == cseq)
  974. flush_expectations(ct, true);
  975. return NF_ACCEPT;
  976. }
  977. static int process_update_response(struct sk_buff *skb, unsigned int protoff,
  978. unsigned int dataoff,
  979. const char **dptr, unsigned int *datalen,
  980. unsigned int cseq, unsigned int code)
  981. {
  982. enum ip_conntrack_info ctinfo;
  983. struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
  984. struct nf_ct_sip_master *ct_sip_info = nfct_help_data(ct);
  985. if ((code >= 100 && code <= 199) ||
  986. (code >= 200 && code <= 299))
  987. return process_sdp(skb, protoff, dataoff, dptr, datalen, cseq);
  988. else if (ct_sip_info->invite_cseq == cseq)
  989. flush_expectations(ct, true);
  990. return NF_ACCEPT;
  991. }
  992. static int process_prack_response(struct sk_buff *skb, unsigned int protoff,
  993. unsigned int dataoff,
  994. const char **dptr, unsigned int *datalen,
  995. unsigned int cseq, unsigned int code)
  996. {
  997. enum ip_conntrack_info ctinfo;
  998. struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
  999. struct nf_ct_sip_master *ct_sip_info = nfct_help_data(ct);
  1000. if ((code >= 100 && code <= 199) ||
  1001. (code >= 200 && code <= 299))
  1002. return process_sdp(skb, protoff, dataoff, dptr, datalen, cseq);
  1003. else if (ct_sip_info->invite_cseq == cseq)
  1004. flush_expectations(ct, true);
  1005. return NF_ACCEPT;
  1006. }
  1007. static int process_invite_request(struct sk_buff *skb, unsigned int protoff,
  1008. unsigned int dataoff,
  1009. const char **dptr, unsigned int *datalen,
  1010. unsigned int cseq)
  1011. {
  1012. enum ip_conntrack_info ctinfo;
  1013. struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
  1014. struct nf_ct_sip_master *ct_sip_info = nfct_help_data(ct);
  1015. unsigned int ret;
  1016. flush_expectations(ct, true);
  1017. ret = process_sdp(skb, protoff, dataoff, dptr, datalen, cseq);
  1018. if (ret == NF_ACCEPT)
  1019. ct_sip_info->invite_cseq = cseq;
  1020. return ret;
  1021. }
  1022. static int process_bye_request(struct sk_buff *skb, unsigned int protoff,
  1023. unsigned int dataoff,
  1024. const char **dptr, unsigned int *datalen,
  1025. unsigned int cseq)
  1026. {
  1027. enum ip_conntrack_info ctinfo;
  1028. struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
  1029. flush_expectations(ct, true);
  1030. return NF_ACCEPT;
  1031. }
  1032. /* Parse a REGISTER request and create a permanent expectation for incoming
  1033. * signalling connections. The expectation is marked inactive and is activated
  1034. * when receiving a response indicating success from the registrar.
  1035. */
  1036. static int process_register_request(struct sk_buff *skb, unsigned int protoff,
  1037. unsigned int dataoff,
  1038. const char **dptr, unsigned int *datalen,
  1039. unsigned int cseq)
  1040. {
  1041. enum ip_conntrack_info ctinfo;
  1042. struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
  1043. struct nf_ct_sip_master *ct_sip_info = nfct_help_data(ct);
  1044. enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
  1045. unsigned int matchoff, matchlen;
  1046. struct nf_conntrack_expect *exp;
  1047. union nf_inet_addr *saddr, daddr;
  1048. const struct nf_nat_sip_hooks *hooks;
  1049. __be16 port;
  1050. u8 proto;
  1051. unsigned int expires = 0;
  1052. int ret;
  1053. /* Expected connections can not register again. */
  1054. if (ct->status & IPS_EXPECTED)
  1055. return NF_ACCEPT;
  1056. /* We must check the expiration time: a value of zero signals the
  1057. * registrar to release the binding. We'll remove our expectation
  1058. * when receiving the new bindings in the response, but we don't
  1059. * want to create new ones.
  1060. *
  1061. * The expiration time may be contained in Expires: header, the
  1062. * Contact: header parameters or the URI parameters.
  1063. */
  1064. if (ct_sip_get_header(ct, *dptr, 0, *datalen, SIP_HDR_EXPIRES,
  1065. &matchoff, &matchlen) > 0)
  1066. expires = simple_strtoul(*dptr + matchoff, NULL, 10);
  1067. ret = ct_sip_parse_header_uri(ct, *dptr, NULL, *datalen,
  1068. SIP_HDR_CONTACT, NULL,
  1069. &matchoff, &matchlen, &daddr, &port);
  1070. if (ret < 0) {
  1071. nf_ct_helper_log(skb, ct, "cannot parse contact");
  1072. return NF_DROP;
  1073. } else if (ret == 0)
  1074. return NF_ACCEPT;
  1075. /* We don't support third-party registrations */
  1076. if (!nf_inet_addr_cmp(&ct->tuplehash[dir].tuple.src.u3, &daddr))
  1077. return NF_ACCEPT;
  1078. if (ct_sip_parse_transport(ct, *dptr, matchoff + matchlen, *datalen,
  1079. &proto) == 0)
  1080. return NF_ACCEPT;
  1081. if (ct_sip_parse_numerical_param(ct, *dptr,
  1082. matchoff + matchlen, *datalen,
  1083. "expires=", NULL, NULL, &expires) < 0) {
  1084. nf_ct_helper_log(skb, ct, "cannot parse expires");
  1085. return NF_DROP;
  1086. }
  1087. if (expires == 0) {
  1088. ret = NF_ACCEPT;
  1089. goto store_cseq;
  1090. }
  1091. exp = nf_ct_expect_alloc(ct);
  1092. if (!exp) {
  1093. nf_ct_helper_log(skb, ct, "cannot alloc expectation");
  1094. return NF_DROP;
  1095. }
  1096. saddr = NULL;
  1097. if (sip_direct_signalling)
  1098. saddr = &ct->tuplehash[!dir].tuple.src.u3;
  1099. nf_ct_expect_init(exp, SIP_EXPECT_SIGNALLING, nf_ct_l3num(ct),
  1100. saddr, &daddr, proto, NULL, &port);
  1101. exp->timeout.expires = sip_timeout * HZ;
  1102. exp->helper = nfct_help(ct)->helper;
  1103. exp->flags = NF_CT_EXPECT_PERMANENT | NF_CT_EXPECT_INACTIVE;
  1104. hooks = rcu_dereference(nf_nat_sip_hooks);
  1105. if (hooks && ct->status & IPS_NAT_MASK)
  1106. ret = hooks->expect(skb, protoff, dataoff, dptr, datalen,
  1107. exp, matchoff, matchlen);
  1108. else {
  1109. if (nf_ct_expect_related(exp) != 0) {
  1110. nf_ct_helper_log(skb, ct, "cannot add expectation");
  1111. ret = NF_DROP;
  1112. } else
  1113. ret = NF_ACCEPT;
  1114. }
  1115. nf_ct_expect_put(exp);
  1116. store_cseq:
  1117. if (ret == NF_ACCEPT)
  1118. ct_sip_info->register_cseq = cseq;
  1119. return ret;
  1120. }
  1121. static int process_register_response(struct sk_buff *skb, unsigned int protoff,
  1122. unsigned int dataoff,
  1123. const char **dptr, unsigned int *datalen,
  1124. unsigned int cseq, unsigned int code)
  1125. {
  1126. enum ip_conntrack_info ctinfo;
  1127. struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
  1128. struct nf_ct_sip_master *ct_sip_info = nfct_help_data(ct);
  1129. enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
  1130. union nf_inet_addr addr;
  1131. __be16 port;
  1132. u8 proto;
  1133. unsigned int matchoff, matchlen, coff = 0;
  1134. unsigned int expires = 0;
  1135. int in_contact = 0, ret;
  1136. /* According to RFC 3261, "UAs MUST NOT send a new registration until
  1137. * they have received a final response from the registrar for the
  1138. * previous one or the previous REGISTER request has timed out".
  1139. *
  1140. * However, some servers fail to detect retransmissions and send late
  1141. * responses, so we store the sequence number of the last valid
  1142. * request and compare it here.
  1143. */
  1144. if (ct_sip_info->register_cseq != cseq)
  1145. return NF_ACCEPT;
  1146. if (code >= 100 && code <= 199)
  1147. return NF_ACCEPT;
  1148. if (code < 200 || code > 299)
  1149. goto flush;
  1150. if (ct_sip_get_header(ct, *dptr, 0, *datalen, SIP_HDR_EXPIRES,
  1151. &matchoff, &matchlen) > 0)
  1152. expires = simple_strtoul(*dptr + matchoff, NULL, 10);
  1153. while (1) {
  1154. unsigned int c_expires = expires;
  1155. ret = ct_sip_parse_header_uri(ct, *dptr, &coff, *datalen,
  1156. SIP_HDR_CONTACT, &in_contact,
  1157. &matchoff, &matchlen,
  1158. &addr, &port);
  1159. if (ret < 0) {
  1160. nf_ct_helper_log(skb, ct, "cannot parse contact");
  1161. return NF_DROP;
  1162. } else if (ret == 0)
  1163. break;
  1164. /* We don't support third-party registrations */
  1165. if (!nf_inet_addr_cmp(&ct->tuplehash[dir].tuple.dst.u3, &addr))
  1166. continue;
  1167. if (ct_sip_parse_transport(ct, *dptr, matchoff + matchlen,
  1168. *datalen, &proto) == 0)
  1169. continue;
  1170. ret = ct_sip_parse_numerical_param(ct, *dptr,
  1171. matchoff + matchlen,
  1172. *datalen, "expires=",
  1173. NULL, NULL, &c_expires);
  1174. if (ret < 0) {
  1175. nf_ct_helper_log(skb, ct, "cannot parse expires");
  1176. return NF_DROP;
  1177. }
  1178. if (c_expires == 0)
  1179. break;
  1180. if (refresh_signalling_expectation(ct, &addr, proto, port,
  1181. c_expires))
  1182. return NF_ACCEPT;
  1183. }
  1184. flush:
  1185. flush_expectations(ct, false);
  1186. return NF_ACCEPT;
  1187. }
  1188. static const struct sip_handler sip_handlers[] = {
  1189. SIP_HANDLER("INVITE", process_invite_request, process_invite_response),
  1190. SIP_HANDLER("UPDATE", process_sdp, process_update_response),
  1191. SIP_HANDLER("ACK", process_sdp, NULL),
  1192. SIP_HANDLER("PRACK", process_sdp, process_prack_response),
  1193. SIP_HANDLER("BYE", process_bye_request, NULL),
  1194. SIP_HANDLER("REGISTER", process_register_request, process_register_response),
  1195. };
  1196. static int process_sip_response(struct sk_buff *skb, unsigned int protoff,
  1197. unsigned int dataoff,
  1198. const char **dptr, unsigned int *datalen)
  1199. {
  1200. enum ip_conntrack_info ctinfo;
  1201. struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
  1202. unsigned int matchoff, matchlen, matchend;
  1203. unsigned int code, cseq, i;
  1204. if (*datalen < strlen("SIP/2.0 200"))
  1205. return NF_ACCEPT;
  1206. code = simple_strtoul(*dptr + strlen("SIP/2.0 "), NULL, 10);
  1207. if (!code) {
  1208. nf_ct_helper_log(skb, ct, "cannot get code");
  1209. return NF_DROP;
  1210. }
  1211. if (ct_sip_get_header(ct, *dptr, 0, *datalen, SIP_HDR_CSEQ,
  1212. &matchoff, &matchlen) <= 0) {
  1213. nf_ct_helper_log(skb, ct, "cannot parse cseq");
  1214. return NF_DROP;
  1215. }
  1216. cseq = simple_strtoul(*dptr + matchoff, NULL, 10);
  1217. if (!cseq) {
  1218. nf_ct_helper_log(skb, ct, "cannot get cseq");
  1219. return NF_DROP;
  1220. }
  1221. matchend = matchoff + matchlen + 1;
  1222. for (i = 0; i < ARRAY_SIZE(sip_handlers); i++) {
  1223. const struct sip_handler *handler;
  1224. handler = &sip_handlers[i];
  1225. if (handler->response == NULL)
  1226. continue;
  1227. if (*datalen < matchend + handler->len ||
  1228. strncasecmp(*dptr + matchend, handler->method, handler->len))
  1229. continue;
  1230. return handler->response(skb, protoff, dataoff, dptr, datalen,
  1231. cseq, code);
  1232. }
  1233. return NF_ACCEPT;
  1234. }
  1235. static int process_sip_request(struct sk_buff *skb, unsigned int protoff,
  1236. unsigned int dataoff,
  1237. const char **dptr, unsigned int *datalen)
  1238. {
  1239. enum ip_conntrack_info ctinfo;
  1240. struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
  1241. struct nf_ct_sip_master *ct_sip_info = nfct_help_data(ct);
  1242. enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
  1243. unsigned int matchoff, matchlen;
  1244. unsigned int cseq, i;
  1245. union nf_inet_addr addr;
  1246. __be16 port;
  1247. /* Many Cisco IP phones use a high source port for SIP requests, but
  1248. * listen for the response on port 5060. If we are the local
  1249. * router for one of these phones, save the port number from the
  1250. * Via: header so that nf_nat_sip can redirect the responses to
  1251. * the correct port.
  1252. */
  1253. if (ct_sip_parse_header_uri(ct, *dptr, NULL, *datalen,
  1254. SIP_HDR_VIA_UDP, NULL, &matchoff,
  1255. &matchlen, &addr, &port) > 0 &&
  1256. port != ct->tuplehash[dir].tuple.src.u.udp.port &&
  1257. nf_inet_addr_cmp(&addr, &ct->tuplehash[dir].tuple.src.u3))
  1258. ct_sip_info->forced_dport = port;
  1259. for (i = 0; i < ARRAY_SIZE(sip_handlers); i++) {
  1260. const struct sip_handler *handler;
  1261. handler = &sip_handlers[i];
  1262. if (handler->request == NULL)
  1263. continue;
  1264. if (*datalen < handler->len + 2 ||
  1265. strncasecmp(*dptr, handler->method, handler->len))
  1266. continue;
  1267. if ((*dptr)[handler->len] != ' ' ||
  1268. !isalpha((*dptr)[handler->len+1]))
  1269. continue;
  1270. if (ct_sip_get_header(ct, *dptr, 0, *datalen, SIP_HDR_CSEQ,
  1271. &matchoff, &matchlen) <= 0) {
  1272. nf_ct_helper_log(skb, ct, "cannot parse cseq");
  1273. return NF_DROP;
  1274. }
  1275. cseq = simple_strtoul(*dptr + matchoff, NULL, 10);
  1276. if (!cseq) {
  1277. nf_ct_helper_log(skb, ct, "cannot get cseq");
  1278. return NF_DROP;
  1279. }
  1280. return handler->request(skb, protoff, dataoff, dptr, datalen,
  1281. cseq);
  1282. }
  1283. return NF_ACCEPT;
  1284. }
  1285. static int process_sip_msg(struct sk_buff *skb, struct nf_conn *ct,
  1286. unsigned int protoff, unsigned int dataoff,
  1287. const char **dptr, unsigned int *datalen)
  1288. {
  1289. const struct nf_nat_sip_hooks *hooks;
  1290. int ret;
  1291. if (strncasecmp(*dptr, "SIP/2.0 ", strlen("SIP/2.0 ")) != 0)
  1292. ret = process_sip_request(skb, protoff, dataoff, dptr, datalen);
  1293. else
  1294. ret = process_sip_response(skb, protoff, dataoff, dptr, datalen);
  1295. if (ret == NF_ACCEPT && ct->status & IPS_NAT_MASK) {
  1296. hooks = rcu_dereference(nf_nat_sip_hooks);
  1297. if (hooks && !hooks->msg(skb, protoff, dataoff,
  1298. dptr, datalen)) {
  1299. nf_ct_helper_log(skb, ct, "cannot NAT SIP message");
  1300. ret = NF_DROP;
  1301. }
  1302. }
  1303. return ret;
  1304. }
  1305. static int sip_help_tcp(struct sk_buff *skb, unsigned int protoff,
  1306. struct nf_conn *ct, enum ip_conntrack_info ctinfo)
  1307. {
  1308. struct tcphdr *th, _tcph;
  1309. unsigned int dataoff, datalen;
  1310. unsigned int matchoff, matchlen, clen;
  1311. unsigned int msglen, origlen;
  1312. const char *dptr, *end;
  1313. s16 diff, tdiff = 0;
  1314. int ret = NF_ACCEPT;
  1315. bool term;
  1316. if (ctinfo != IP_CT_ESTABLISHED &&
  1317. ctinfo != IP_CT_ESTABLISHED_REPLY)
  1318. return NF_ACCEPT;
  1319. /* No Data ? */
  1320. th = skb_header_pointer(skb, protoff, sizeof(_tcph), &_tcph);
  1321. if (th == NULL)
  1322. return NF_ACCEPT;
  1323. dataoff = protoff + th->doff * 4;
  1324. if (dataoff >= skb->len)
  1325. return NF_ACCEPT;
  1326. nf_ct_refresh(ct, skb, sip_timeout * HZ);
  1327. if (unlikely(skb_linearize(skb)))
  1328. return NF_DROP;
  1329. dptr = skb->data + dataoff;
  1330. datalen = skb->len - dataoff;
  1331. if (datalen < strlen("SIP/2.0 200"))
  1332. return NF_ACCEPT;
  1333. while (1) {
  1334. if (ct_sip_get_header(ct, dptr, 0, datalen,
  1335. SIP_HDR_CONTENT_LENGTH,
  1336. &matchoff, &matchlen) <= 0)
  1337. break;
  1338. clen = simple_strtoul(dptr + matchoff, (char **)&end, 10);
  1339. if (dptr + matchoff == end)
  1340. break;
  1341. term = false;
  1342. for (; end + strlen("\r\n\r\n") <= dptr + datalen; end++) {
  1343. if (end[0] == '\r' && end[1] == '\n' &&
  1344. end[2] == '\r' && end[3] == '\n') {
  1345. term = true;
  1346. break;
  1347. }
  1348. }
  1349. if (!term)
  1350. break;
  1351. end += strlen("\r\n\r\n") + clen;
  1352. msglen = origlen = end - dptr;
  1353. if (msglen > datalen)
  1354. return NF_ACCEPT;
  1355. ret = process_sip_msg(skb, ct, protoff, dataoff,
  1356. &dptr, &msglen);
  1357. /* process_sip_* functions report why this packet is dropped */
  1358. if (ret != NF_ACCEPT)
  1359. break;
  1360. diff = msglen - origlen;
  1361. tdiff += diff;
  1362. dataoff += msglen;
  1363. dptr += msglen;
  1364. datalen = datalen + diff - msglen;
  1365. }
  1366. if (ret == NF_ACCEPT && ct->status & IPS_NAT_MASK) {
  1367. const struct nf_nat_sip_hooks *hooks;
  1368. hooks = rcu_dereference(nf_nat_sip_hooks);
  1369. if (hooks)
  1370. hooks->seq_adjust(skb, protoff, tdiff);
  1371. }
  1372. return ret;
  1373. }
  1374. static int sip_help_udp(struct sk_buff *skb, unsigned int protoff,
  1375. struct nf_conn *ct, enum ip_conntrack_info ctinfo)
  1376. {
  1377. unsigned int dataoff, datalen;
  1378. const char *dptr;
  1379. /* No Data ? */
  1380. dataoff = protoff + sizeof(struct udphdr);
  1381. if (dataoff >= skb->len)
  1382. return NF_ACCEPT;
  1383. nf_ct_refresh(ct, skb, sip_timeout * HZ);
  1384. if (unlikely(skb_linearize(skb)))
  1385. return NF_DROP;
  1386. dptr = skb->data + dataoff;
  1387. datalen = skb->len - dataoff;
  1388. if (datalen < strlen("SIP/2.0 200"))
  1389. return NF_ACCEPT;
  1390. return process_sip_msg(skb, ct, protoff, dataoff, &dptr, &datalen);
  1391. }
  1392. static struct nf_conntrack_helper sip[MAX_PORTS][4] __read_mostly;
  1393. static const struct nf_conntrack_expect_policy sip_exp_policy[SIP_EXPECT_MAX + 1] = {
  1394. [SIP_EXPECT_SIGNALLING] = {
  1395. .name = "signalling",
  1396. .max_expected = 1,
  1397. .timeout = 3 * 60,
  1398. },
  1399. [SIP_EXPECT_AUDIO] = {
  1400. .name = "audio",
  1401. .max_expected = 2 * IP_CT_DIR_MAX,
  1402. .timeout = 3 * 60,
  1403. },
  1404. [SIP_EXPECT_VIDEO] = {
  1405. .name = "video",
  1406. .max_expected = 2 * IP_CT_DIR_MAX,
  1407. .timeout = 3 * 60,
  1408. },
  1409. [SIP_EXPECT_IMAGE] = {
  1410. .name = "image",
  1411. .max_expected = IP_CT_DIR_MAX,
  1412. .timeout = 3 * 60,
  1413. },
  1414. };
  1415. static void nf_conntrack_sip_fini(void)
  1416. {
  1417. int i, j;
  1418. for (i = 0; i < ports_c; i++) {
  1419. for (j = 0; j < ARRAY_SIZE(sip[i]); j++) {
  1420. if (sip[i][j].me == NULL)
  1421. continue;
  1422. nf_conntrack_helper_unregister(&sip[i][j]);
  1423. }
  1424. }
  1425. }
  1426. static int __init nf_conntrack_sip_init(void)
  1427. {
  1428. int i, j, ret;
  1429. if (ports_c == 0)
  1430. ports[ports_c++] = SIP_PORT;
  1431. for (i = 0; i < ports_c; i++) {
  1432. memset(&sip[i], 0, sizeof(sip[i]));
  1433. sip[i][0].tuple.src.l3num = AF_INET;
  1434. sip[i][0].tuple.dst.protonum = IPPROTO_UDP;
  1435. sip[i][0].help = sip_help_udp;
  1436. sip[i][1].tuple.src.l3num = AF_INET;
  1437. sip[i][1].tuple.dst.protonum = IPPROTO_TCP;
  1438. sip[i][1].help = sip_help_tcp;
  1439. sip[i][2].tuple.src.l3num = AF_INET6;
  1440. sip[i][2].tuple.dst.protonum = IPPROTO_UDP;
  1441. sip[i][2].help = sip_help_udp;
  1442. sip[i][3].tuple.src.l3num = AF_INET6;
  1443. sip[i][3].tuple.dst.protonum = IPPROTO_TCP;
  1444. sip[i][3].help = sip_help_tcp;
  1445. for (j = 0; j < ARRAY_SIZE(sip[i]); j++) {
  1446. sip[i][j].data_len = sizeof(struct nf_ct_sip_master);
  1447. sip[i][j].tuple.src.u.udp.port = htons(ports[i]);
  1448. sip[i][j].expect_policy = sip_exp_policy;
  1449. sip[i][j].expect_class_max = SIP_EXPECT_MAX;
  1450. sip[i][j].me = THIS_MODULE;
  1451. if (ports[i] == SIP_PORT)
  1452. sprintf(sip[i][j].name, "sip");
  1453. else
  1454. sprintf(sip[i][j].name, "sip-%u", i);
  1455. pr_debug("port #%u: %u\n", i, ports[i]);
  1456. ret = nf_conntrack_helper_register(&sip[i][j]);
  1457. if (ret) {
  1458. printk(KERN_ERR "nf_ct_sip: failed to register"
  1459. " helper for pf: %u port: %u\n",
  1460. sip[i][j].tuple.src.l3num, ports[i]);
  1461. nf_conntrack_sip_fini();
  1462. return ret;
  1463. }
  1464. }
  1465. }
  1466. return 0;
  1467. }
  1468. module_init(nf_conntrack_sip_init);
  1469. module_exit(nf_conntrack_sip_fini);