1/* 2 * src/lib/ct.c CLI Conntrack Helpers 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation version 2.1 7 * of the License. 8 * 9 * Copyright (c) 2008-2009 Thomas Graf <tgraf@suug.ch> 10 */ 11 12/** 13 * @ingroup cli 14 * @defgroup cli_ct Connection Tracking 15 * 16 * @{ 17 */ 18 19#include <netlink/cli/utils.h> 20#include <netlink/cli/ct.h> 21 22struct nfnl_ct *nl_cli_ct_alloc(void) 23{ 24 struct nfnl_ct *ct; 25 26 ct = nfnl_ct_alloc(); 27 if (!ct) 28 nl_cli_fatal(ENOMEM, "Unable to allocate conntrack object"); 29 30 return ct; 31} 32 33struct nl_cache *nl_cli_ct_alloc_cache(struct nl_sock *sk) 34{ 35 return nl_cli_alloc_cache(sk, "conntrack", nfnl_ct_alloc_cache); 36} 37 38void nl_cli_ct_parse_family(struct nfnl_ct *ct, char *arg) 39{ 40 int family; 41 42 if ((family = nl_str2af(arg)) == AF_UNSPEC) 43 nl_cli_fatal(EINVAL, 44 "Unable to nl_cli_ct_parse family \"%s\": %s", 45 arg, nl_geterror(NLE_INVAL)); 46 47 nfnl_ct_set_family(ct, family); 48} 49 50void nl_cli_ct_parse_protocol(struct nfnl_ct *ct, char *arg) 51{ 52 int proto; 53 54 if ((proto = nl_str2ip_proto(arg)) < 0) 55 nl_cli_fatal(proto, 56 "Unable to nl_cli_ct_parse protocol \"%s\": %s", 57 arg, nl_geterror(proto)); 58 59 nfnl_ct_set_proto(ct, proto); 60} 61 62void nl_cli_ct_parse_mark(struct nfnl_ct *ct, char *arg) 63{ 64 uint32_t mark = nl_cli_parse_u32(arg); 65 nfnl_ct_set_mark(ct, mark); 66} 67 68void nl_cli_ct_parse_timeout(struct nfnl_ct *ct, char *arg) 69{ 70 uint32_t timeout = nl_cli_parse_u32(arg); 71 nfnl_ct_set_timeout(ct, timeout); 72} 73 74void nl_cli_ct_parse_id(struct nfnl_ct *ct, char *arg) 75{ 76 uint32_t id = nl_cli_parse_u32(arg); 77 nfnl_ct_set_id(ct, id); 78} 79 80void nl_cli_ct_parse_use(struct nfnl_ct *ct, char *arg) 81{ 82 uint32_t use = nl_cli_parse_u32(arg); 83 nfnl_ct_set_use(ct, use); 84} 85 86void nl_cli_ct_parse_src(struct nfnl_ct *ct, int reply, char *arg) 87{ 88 int err; 89 struct nl_addr *a = nl_cli_addr_parse(arg, nfnl_ct_get_family(ct)); 90 if ((err = nfnl_ct_set_src(ct, reply, a)) < 0) 91 nl_cli_fatal(err, "Unable to set source address: %s", 92 nl_geterror(err)); 93} 94 95void nl_cli_ct_parse_dst(struct nfnl_ct *ct, int reply, char *arg) 96{ 97 int err; 98 struct nl_addr *a = nl_cli_addr_parse(arg, nfnl_ct_get_family(ct)); 99 if ((err = nfnl_ct_set_dst(ct, reply, a)) < 0) 100 nl_cli_fatal(err, "Unable to set destination address: %s", 101 nl_geterror(err)); 102} 103 104void nl_cli_ct_parse_src_port(struct nfnl_ct *ct, int reply, char *arg) 105{ 106 uint32_t port = nl_cli_parse_u32(arg); 107 nfnl_ct_set_src_port(ct, reply, port); 108} 109 110void nl_cli_ct_parse_dst_port(struct nfnl_ct *ct, int reply, char *arg) 111{ 112 uint32_t port = nl_cli_parse_u32(arg); 113 nfnl_ct_set_dst_port(ct, reply, port); 114} 115 116void nl_cli_ct_parse_tcp_state(struct nfnl_ct *ct, char *arg) 117{ 118 int state; 119 120 if ((state = nfnl_ct_str2tcp_state(arg)) < 0) 121 nl_cli_fatal(state, 122 "Unable to nl_cli_ct_parse tcp state \"%s\": %s", 123 arg, nl_geterror(state)); 124 125 nfnl_ct_set_tcp_state(ct, state); 126} 127 128void nl_cli_ct_parse_status(struct nfnl_ct *ct, char *arg) 129{ 130 int status; 131 132 if ((status = nfnl_ct_str2status(arg)) < 0) 133 nl_cli_fatal(status, 134 "Unable to nl_cli_ct_parse flags \"%s\": %s", 135 arg, nl_geterror(status)); 136 137 nfnl_ct_set_status(ct, status); 138} 139 140#if 0 141 } else if (arg_match("origicmpid")) { 142 if (argc > ++idx) 143 nfnl_ct_set_icmp_id(ct, 0, strtoul(argv[idx++], NULL, 0)); 144 } else if (arg_match("origicmptype")) { 145 if (argc > ++idx) 146 nfnl_ct_set_icmp_type(ct, 0, strtoul(argv[idx++], NULL, 0)); 147 } else if (arg_match("origicmpcode")) { 148 if (argc > ++idx) 149 nfnl_ct_set_icmp_code(ct, 0, strtoul(argv[idx++], NULL, 0)); 150 } else if (arg_match("replyicmpid")) { 151 if (argc > ++idx) 152 nfnl_ct_set_icmp_id(ct, 1, strtoul(argv[idx++], NULL, 0)); 153 } else if (arg_match("replyicmptype")) { 154 if (argc > ++idx) 155 nfnl_ct_set_icmp_type(ct, 1, strtoul(argv[idx++], NULL, 0)); 156 } else if (arg_match("replyicmpcode")) { 157 if (argc > ++idx) 158 nfnl_ct_set_icmp_code(ct, 1, strtoul(argv[idx++], NULL, 0)); 159 } 160#endif 161 162/** @} */ 163