104#include <sys/param.h>
105#include <sys/systm.h>
106#include <sys/kernel.h>
107#include <sys/module.h>
110#include <sys/types.h>
129#define RTSP_CONTROL_PORT_NUMBER_1 554
130#define RTSP_CONTROL_PORT_NUMBER_2 7070
131#define TFTP_PORT_NUMBER 69
142 if (ah->
dport == NULL || ah->
sport == NULL || ah->
lnk == NULL ||
207#define RTSP_CONTROL_PORT_NUMBER_1 554
208#define RTSP_CONTROL_PORT_NUMBER_2 7070
209#define RTSP_PORT_GROUP 2
211#define ISDIGIT(a) (((a) >= '0') && ((a) <= '9'))
219 search_str_len = strlen(search_str);
220 for (i = 0; i < dlen - search_str_len; i++) {
221 for (j = i, k = 0; j < dlen - search_str_len; j++, k++) {
222 if (data[j] != search_str[k] &&
223 data[j] != search_str[k] - (
'a' -
'A'))
225 if (k == search_str_len - 1)
236 const char *port_str)
238 int hlen, tlen, dlen;
240 int i, j, pos,
state, port_dlen, new_dlen, delta;
241 u_short p[2], new_len;
242 u_short sport, eport, base_port;
243 u_short salias = 0, ealias = 0, base_alias = 0;
244 const char *transport_str =
"transport:";
245 char newdata[2048], *port_data, *port_newdata, stemp[80];
246 int links_created = 0, pkt_updated = 0;
251 tc = (
struct tcphdr *)ip_next(pip);
252 hlen = (pip->
ip_hl + tc->th_off) << 2;
253 tlen = ntohs(pip->
ip_len);
261 port_data = data + pos;
262 port_dlen = dlen - pos;
264 memcpy(newdata, data, pos);
265 port_newdata = newdata + pos;
267 while (port_dlen > (
int)strlen(port_str)) {
273 memcpy(port_newdata, port_data, pos + 1);
274 port_newdata += (pos + 1);
279 for (i = pos; i < port_dlen; i++) {
282 if (port_data[i] ==
'=')
287 p[0] = p[0] * 10 + port_data[i] -
'0';
288 else if (port_data[i] ==
';')
290 else if (port_data[i] ==
'-')
295 p[1] = p[1] * 10 + port_data[i] -
'0';
304 if (!links_created) {
320 "PacketAlias/RTSP: Cannot find contiguous RTSP data ports\n");
323 base_alias = ntohs(salias);
331 htons(base_port + j), htons(base_alias + j),
333 if (rtsp_lnk != NULL) {
345 "PacketAlias/RTSP: Cannot allocate RTSP data ports\n");
353 if (salias && rtsp_lnk) {
357 sprintf(stemp,
"%d", ntohs(salias));
358 memcpy(port_newdata, stemp, strlen(stemp));
359 port_newdata += strlen(stemp);
366 sprintf(stemp,
"%d", ntohs(ealias));
367 memcpy(port_newdata, stemp, strlen(stemp));
368 port_newdata += strlen(stemp);
387 memcpy(port_newdata, port_data, port_dlen);
388 port_newdata += port_dlen;
389 *port_newdata =
'\0';
392 new_dlen = port_newdata - newdata;
393 memcpy(data, newdata, new_dlen);
396 tc = (
struct tcphdr *)ip_next(pip);
399 tc->th_seq, tc->th_off);
401 new_len = htons(hlen + new_dlen);
409 tc->th_sum = TcpChecksum(pip);
423 u_short msg_id, msg_len;
430 while (work + 4 < data + dlen) {
431 memcpy(&msg_id, work, 2);
433 memcpy(&msg_len, work, 2);
435 if (ntohs(msg_id) == 0)
438 if ((ntohs(msg_id) == 1) || (ntohs(msg_id) == 7)) {
439 memcpy(&port, work, 2);
442 if (pna_links != NULL) {
447 tc = (
struct tcphdr *)ip_next(pip);
449 memcpy(work, &alias_port, 2);
456 tc->th_sum = TcpChecksum(pip);
460 work += ntohs(msg_len);
469 int hlen, tlen, dlen;
472 const char *setup =
"SETUP", *pna =
"PNA", *str200 =
"200";
473 const char *okstr =
"OK", *client_port_str =
"client_port";
474 const char *server_port_str =
"server_port";
479 tc = (
struct tcphdr *)ip_next(pip);
480 hlen = (pip->
ip_hl + tc->th_off) << 2;
481 tlen = ntohs(pip->
ip_len);
490 if (dlen >= (
int)strlen(setup) &&
491 memcmp(data, setup, strlen(setup)) == 0) {
496 if (dlen >= (
int)strlen(pna) &&
497 memcmp(data, pna, strlen(pna)) == 0)
505 if (dlen >= (
int)strlen(str200)) {
506 for (parseOk = 0, i = 0;
507 i <= dlen - (int)strlen(str200);
509 if (memcmp(&data[i], str200, strlen(str200)) == 0) {
516 while (data[i] ==
' ')
519 if ((dlen - i) >= (
int)strlen(okstr))
520 if (memcmp(&data[i], okstr, strlen(okstr)) == 0)
u_short GetAliasPort(struct alias_link *lnk)
void PunchFWHole(struct alias_link *lnk)
struct in_addr GetDestAddress(struct alias_link *lnk)
struct in_addr FindAliasAddress(struct libalias *la, struct in_addr original_addr)
struct alias_link * FindRtspOut(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, u_short src_port, u_short alias_port, u_char proto)
struct in_addr GetOriginalAddress(struct alias_link *lnk)
void SetAckModified(struct alias_link *lnk)
int FindNewPortGroup(struct libalias *la, struct in_addr dst_addr, struct in_addr alias_addr, u_short src_port, u_short dst_port, u_short port_count, u_char proto, u_char align)
void AddSeq(struct alias_link *lnk, int delta, u_int ip_hl, u_short ip_len, u_long th_seq, u_int th_off)
int GetDeltaSeqOut(u_long seq, struct alias_link *lnk)
struct alias_link * FindUdpTcpOut(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr, u_short src_port, u_short dst_port, u_char proto, int create)
void DifferentialChecksum(u_short *_cksum, void *_new, void *_old, int _n)
int LibAliasAttachHandlers(struct proto_handler *p)
int LibAliasDetachHandlers(struct proto_handler *p)
struct in_addr ip_src ip_dst