diff --git a/src/Makefile.am b/src/Makefile.am index e196b58..5b47866 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -21,6 +21,7 @@ noinst_PROGRAMS = \ nl-link-ifindex2name nl-link-name2ifindex \ nl-neigh-add nl-neigh-delete nl-neigh-list \ nl-rule-list \ + nl-rule-add \ nl-neightbl-list \ nl-monitor \ nl-tctree-list \ diff --git a/src/nl-rule-add.c b/src/nl-rule-add.c new file mode 100644 index 0000000..2c9ce07 --- /dev/null +++ b/src/nl-rule-add.c @@ -0,0 +1,70 @@ +/* + * src/nl-rule-add.c Add rule attributes + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * Copyright (c) 2003-2009 Thomas Graf + */ + +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + + int resultcode=0; + struct nl_sock *nlsk; + struct rtnl_rule *rule; + + if((nlsk = nl_socket_alloc())==NULL){ + return 1; + } + + if (nl_connect(nlsk, NETLINK_ROUTE) < 0 ){ + resultcode=1; + goto nl_socket_free_nlsk; + } + + if((rule = rtnl_rule_alloc())==NULL){ + resultcode=1; + goto nl_socket_free_nlsk; + } + + rtnl_rule_set_family(rule, AF_INET); + rtnl_rule_set_prio(rule, 100); + rtnl_rule_set_table(rule, 10); + rtnl_rule_set_action(rule, FR_ACT_TO_TBL); + + //setfrom address + + struct nl_addr *a; + if(nl_addr_parse("127.0.0.1", AF_INET, &a)<0){ + resultcode=1; + goto rtnl_rule_put_rule; + } + + if(rtnl_rule_set_src(rule, a)<0){ + nl_addr_put(a); + resultcode=1; + goto rtnl_rule_put_rule; + } + + nl_addr_put(a); + if ( rtnl_rule_add(nlsk, rule, 0) < 0){ + resultcode=1; + goto rtnl_rule_put_rule; + } + +rtnl_rule_put_rule: + rtnl_rule_put(rule); +nl_socket_free_nlsk: + nl_socket_free(nlsk); + + + return resultcode; +}