18a44513648da0c5f5551f96b329cf56b66f5b303pkanwar/*
28a44513648da0c5f5551f96b329cf56b66f5b303pkanwar * (C) 2005-2011 by Pablo Neira Ayuso <pablo@netfilter.org>
38a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *
48a44513648da0c5f5551f96b329cf56b66f5b303pkanwar * This program is free software; you can redistribute it and/or modify it
58a44513648da0c5f5551f96b329cf56b66f5b303pkanwar * under the terms of the GNU General Public License as published by
68a44513648da0c5f5551f96b329cf56b66f5b303pkanwar * the Free Software Foundation; either version 2 of the License, or
78a44513648da0c5f5551f96b329cf56b66f5b303pkanwar * (at your option) any later version.
88a44513648da0c5f5551f96b329cf56b66f5b303pkanwar */
98a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
108a44513648da0c5f5551f96b329cf56b66f5b303pkanwar#include "internal/internal.h"
118a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
128a44513648da0c5f5551f96b329cf56b66f5b303pkanwar/*
138a44513648da0c5f5551f96b329cf56b66f5b303pkanwar * XML output sample:
148a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *
158a44513648da0c5f5551f96b329cf56b66f5b303pkanwar * <flow type="new">
168a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *	<layer3 protonum="2" protoname="IPv4">
178a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *		<expected>
188a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *			<src>192.168.0.2</src>
198a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *			<dst>192.168.1.2</dst>
208a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *		</expected>
218a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *		<mask>
228a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *			<src>255.255.255.255</src>
238a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *			<dst>255.255.255.255</dst>
248a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *		</mask>
258a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *		<master>
268a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *			<src>192.168.0.2</src>
278a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *			<dst>192.168.1.2</dst>
288a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *		</master>
298a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *	</layer3>
308a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *	<layer4 protonum="6" protoname="tcp">
318a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *		<expected>
328a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *			<sport>0</sport>
338a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *			<dport>41739</dport>
348a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *		</expected>
358a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *		<mask>
368a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *			<sport>0</sport>
378a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *			<dport>65535</dport>
388a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *		</mask>
398a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *		<master>
408a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *			<sport>36390</sport>
418a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *			<dport>21</dport>
428a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *		</master>
438a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *	</layer4>
448a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *	<meta>
458a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *		<helper-name>ftp</helper-name>
468a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *		<timeout>300</timeout>
478a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *		<zone>0</zone>
488a44513648da0c5f5551f96b329cf56b66f5b303pkanwar *	</meta>
498a44513648da0c5f5551f96b329cf56b66f5b303pkanwar * </flow>
508a44513648da0c5f5551f96b329cf56b66f5b303pkanwar */
518a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
528a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic int
538a44513648da0c5f5551f96b329cf56b66f5b303pkanwarsnprintf_expect_meta_xml(char *buf, size_t len,
548a44513648da0c5f5551f96b329cf56b66f5b303pkanwar			 const struct nf_expect *exp, unsigned int flags)
558a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
568a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	int ret;
578a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	unsigned int size = 0, offset = 0;
588a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
598a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	ret = snprintf(buf, len, "<meta>");
608a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	BUFFER_SIZE(ret, size, len, offset);
618a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
628a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	if (test_bit(ATTR_EXP_HELPER_NAME, exp->set)) {
638a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		ret = snprintf(buf+offset, len,
648a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				"<helper-name>%s</helper-name>",
658a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				exp->helper_name);
668a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		BUFFER_SIZE(ret, size, len, offset);
678a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	}
688a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	if (test_bit(ATTR_EXP_TIMEOUT, exp->set)) {
698a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		ret = snprintf(buf+offset, len, "<timeout>%u</timeout>",
708a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				exp->timeout);
718a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		BUFFER_SIZE(ret, size, len, offset);
728a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	}
738a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	if (test_bit(ATTR_EXP_CLASS, exp->set)) {
748a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		ret = snprintf(buf+offset, len, "<class>%u</class>",
758a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				exp->class);
768a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		BUFFER_SIZE(ret, size, len, offset);
778a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	}
788a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	if (test_bit(ATTR_EXP_ZONE, exp->set)) {
798a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		ret = snprintf(buf+offset, len, "<zone>%u</zone>", exp->zone);
808a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		BUFFER_SIZE(ret, size, len, offset);
818a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	}
828a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        if (flags & NFCT_OF_TIME) {
838a44513648da0c5f5551f96b329cf56b66f5b303pkanwar                time_t t;
848a44513648da0c5f5551f96b329cf56b66f5b303pkanwar                struct tm tm;
858a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
868a44513648da0c5f5551f96b329cf56b66f5b303pkanwar                t = time(NULL);
878a44513648da0c5f5551f96b329cf56b66f5b303pkanwar                if (localtime_r(&t, &tm) == NULL)
888a44513648da0c5f5551f96b329cf56b66f5b303pkanwar                        goto err_out;
898a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
908a44513648da0c5f5551f96b329cf56b66f5b303pkanwar                ret = snprintf(buf+offset, len, "<when>");
918a44513648da0c5f5551f96b329cf56b66f5b303pkanwar                BUFFER_SIZE(ret, size, len, offset);
928a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
938a44513648da0c5f5551f96b329cf56b66f5b303pkanwar                ret = __snprintf_localtime_xml(buf+offset, len, &tm);
948a44513648da0c5f5551f96b329cf56b66f5b303pkanwar                BUFFER_SIZE(ret, size, len, offset);
958a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
968a44513648da0c5f5551f96b329cf56b66f5b303pkanwar                ret = snprintf(buf+offset, len, "</when>");
978a44513648da0c5f5551f96b329cf56b66f5b303pkanwar                BUFFER_SIZE(ret, size, len, offset);
988a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        }
998a44513648da0c5f5551f96b329cf56b66f5b303pkanwarerr_out:
1008a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	if (exp->flags & NF_CT_EXPECT_PERMANENT) {
1018a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		ret = snprintf(buf+offset, len, "<permanent/>");
1028a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		BUFFER_SIZE(ret, size, len, offset);
1038a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	}
1048a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	if (exp->flags & NF_CT_EXPECT_INACTIVE) {
1058a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		ret = snprintf(buf+offset, len, "<inactive/>");
1068a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		BUFFER_SIZE(ret, size, len, offset);
1078a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	}
1088a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	if (exp->flags & NF_CT_EXPECT_USERSPACE) {
1098a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		ret = snprintf(buf+offset, len, "<userspace/>");
1108a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		BUFFER_SIZE(ret, size, len, offset);
1118a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	}
1128a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1138a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	ret = snprintf(buf+offset, len, "</meta>");
1148a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	BUFFER_SIZE(ret, size, len, offset);
1158a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1168a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	return size;
1178a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
1188a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1198a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic int
1208a44513648da0c5f5551f96b329cf56b66f5b303pkanwarsnprintf_expect_layer3_xml(char *buf, size_t len, const struct nf_expect *exp)
1218a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
1228a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	int ret;
1238a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	unsigned int size = 0, offset = 0;
1248a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1258a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = snprintf(buf+offset, len,
1268a44513648da0c5f5551f96b329cf56b66f5b303pkanwar                       "<layer3 protonum=\"%d\" protoname=\"%s\">",
1278a44513648da0c5f5551f96b329cf56b66f5b303pkanwar			exp->expected.orig.l3protonum,
1288a44513648da0c5f5551f96b329cf56b66f5b303pkanwar			__l3proto2str(exp->expected.orig.l3protonum));
1298a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1308a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1318a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = snprintf(buf+offset, len, "<expected>");
1328a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1338a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1348a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = __snprintf_addr_xml(buf+offset, len, &exp->expected.orig,
1358a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				__ADDR_SRC);
1368a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1378a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1388a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = __snprintf_addr_xml(buf+offset, len, &exp->expected.orig,
1398a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				__ADDR_DST);
1408a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1418a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1428a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = snprintf(buf+offset, len, "</expected>");
1438a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1448a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1458a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = snprintf(buf+offset, len, "<mask>");
1468a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1478a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1488a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = __snprintf_addr_xml(buf+offset, len, &exp->mask.orig,
1498a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				__ADDR_SRC);
1508a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1518a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1528a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = __snprintf_addr_xml(buf+offset, len, &exp->mask.orig,
1538a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				__ADDR_DST);
1548a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1558a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1568a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = snprintf(buf+offset, len, "</mask>");
1578a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1588a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1598a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = snprintf(buf+offset, len, "<master>");
1608a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1618a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1628a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = __snprintf_addr_xml(buf+offset, len, &exp->master.orig,
1638a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				__ADDR_SRC);
1648a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1658a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1668a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = __snprintf_addr_xml(buf+offset, len, &exp->master.orig,
1678a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				__ADDR_DST);
1688a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1698a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1708a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = snprintf(buf+offset, len, "</master>");
1718a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1728a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1738a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = snprintf(buf+offset, len, "</layer3>");
1748a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1758a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1768a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	return size;
1778a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
1788a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1798a44513648da0c5f5551f96b329cf56b66f5b303pkanwarstatic int
1808a44513648da0c5f5551f96b329cf56b66f5b303pkanwarsnprintf_expect_layer4_xml(char *buf, size_t len, const struct nf_expect *exp)
1818a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
1828a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	int ret;
1838a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	unsigned int size = 0, offset = 0;
1848a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1858a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = snprintf(buf+offset, len,
1868a44513648da0c5f5551f96b329cf56b66f5b303pkanwar                       "<layer4 protonum=\"%d\" protoname=\"%s\">",
1878a44513648da0c5f5551f96b329cf56b66f5b303pkanwar			exp->expected.orig.protonum,
1888a44513648da0c5f5551f96b329cf56b66f5b303pkanwar			__proto2str(exp->expected.orig.protonum));
1898a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1908a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1918a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = snprintf(buf+offset, len, "<expected>");
1928a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1938a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1948a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	ret = __snprintf_proto_xml(buf+offset, len, &exp->expected.orig,
1958a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				__ADDR_SRC);
1968a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
1978a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
1988a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	ret = __snprintf_proto_xml(buf+offset, len, &exp->expected.orig,
1998a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				__ADDR_DST);
2008a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
2018a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2028a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = snprintf(buf+offset, len, "</expected>");
2038a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
2048a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2058a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = snprintf(buf+offset, len, "<mask>");
2068a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
2078a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2088a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	ret = __snprintf_proto_xml(buf+offset, len, &exp->mask.orig,
2098a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				__ADDR_SRC);
2108a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
2118a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2128a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	ret = __snprintf_proto_xml(buf+offset, len, &exp->mask.orig,
2138a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				__ADDR_DST);
2148a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
2158a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2168a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = snprintf(buf+offset, len, "</mask>");
2178a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
2188a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2198a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = snprintf(buf+offset, len, "<master>");
2208a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
2218a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2228a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	ret = __snprintf_proto_xml(buf+offset, len, &exp->master.orig,
2238a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				__ADDR_SRC);
2248a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
2258a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2268a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	ret = __snprintf_proto_xml(buf+offset, len, &exp->master.orig,
2278a44513648da0c5f5551f96b329cf56b66f5b303pkanwar				__ADDR_DST);
2288a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
2298a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2308a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        ret = snprintf(buf+offset, len, "</master>");
2318a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset);
2328a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2338a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	ret = snprintf(buf+offset, len, "</layer4>");
2348a44513648da0c5f5551f96b329cf56b66f5b303pkanwar        BUFFER_SIZE(ret, size, len, offset)
2358a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2368a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	return size;
2378a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
2388a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2398a44513648da0c5f5551f96b329cf56b66f5b303pkanwarint __snprintf_expect_xml(char *buf, unsigned int len,
2408a44513648da0c5f5551f96b329cf56b66f5b303pkanwar			  const struct nf_expect *exp,
2418a44513648da0c5f5551f96b329cf56b66f5b303pkanwar			  unsigned int msg_type, unsigned int flags)
2428a44513648da0c5f5551f96b329cf56b66f5b303pkanwar{
2438a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	int ret = 0, size = 0, offset = 0;
2448a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2458a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	switch(msg_type) {
2468a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		case NFCT_T_NEW:
2478a44513648da0c5f5551f96b329cf56b66f5b303pkanwar			ret = snprintf(buf, len, "<flow type=\"new\">");
2488a44513648da0c5f5551f96b329cf56b66f5b303pkanwar			break;
2498a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		case NFCT_T_UPDATE:
2508a44513648da0c5f5551f96b329cf56b66f5b303pkanwar			ret = snprintf(buf, len, "<flow type=\"update\">");
2518a44513648da0c5f5551f96b329cf56b66f5b303pkanwar			break;
2528a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		case NFCT_T_DESTROY:
2538a44513648da0c5f5551f96b329cf56b66f5b303pkanwar			ret = snprintf(buf, len, "<flow type=\"destroy\">");
2548a44513648da0c5f5551f96b329cf56b66f5b303pkanwar			break;
2558a44513648da0c5f5551f96b329cf56b66f5b303pkanwar		default:
2568a44513648da0c5f5551f96b329cf56b66f5b303pkanwar			ret = snprintf(buf, len, "<flow>");
2578a44513648da0c5f5551f96b329cf56b66f5b303pkanwar			break;
2588a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	}
2598a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	BUFFER_SIZE(ret, size, len, offset);
2608a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2618a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	ret = snprintf_expect_layer3_xml(buf+offset, len, exp);
2628a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	BUFFER_SIZE(ret, size, len, offset);
2638a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2648a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	ret = snprintf_expect_layer4_xml(buf+offset, len, exp);
2658a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	BUFFER_SIZE(ret, size, len, offset);
2668a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2678a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	ret = snprintf_expect_meta_xml(buf+offset, len, exp, flags);
2688a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	BUFFER_SIZE(ret, size, len, offset);
2698a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2708a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	ret = snprintf(buf+offset, len, "</flow>");
2718a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	BUFFER_SIZE(ret, size, len, offset);
2728a44513648da0c5f5551f96b329cf56b66f5b303pkanwar
2738a44513648da0c5f5551f96b329cf56b66f5b303pkanwar	return size;
2748a44513648da0c5f5551f96b329cf56b66f5b303pkanwar}
275