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