diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/tc.c | 17 | ||||
-rw-r--r-- | src/nl-class-add.c | 9 | ||||
-rw-r--r-- | src/nl-class-delete.c | 2 | ||||
-rw-r--r-- | src/nl-class-list.c | 2 | ||||
-rw-r--r-- | src/nl-cls-add.c | 9 | ||||
-rw-r--r-- | src/nl-cls-delete.c | 2 | ||||
-rw-r--r-- | src/nl-cls-list.c | 2 | ||||
-rw-r--r-- | src/nl-qdisc-add.c | 9 | ||||
-rw-r--r-- | src/nl-qdisc-delete.c | 2 | ||||
-rw-r--r-- | src/nl-qdisc-list.c | 2 |
10 files changed, 39 insertions, 17 deletions
diff --git a/src/lib/tc.c b/src/lib/tc.c index 5f39498..72407cf 100644 --- a/src/lib/tc.c +++ b/src/lib/tc.c @@ -42,14 +42,21 @@ void nl_cli_tc_parse_parent(struct rtnl_tc *tc, char *arg) rtnl_tc_set_parent(tc, parent); } -void nl_cli_tc_parse_handle(struct rtnl_tc *tc, char *arg) +void nl_cli_tc_parse_handle(struct rtnl_tc *tc, char *arg, int create) { - uint32_t handle; + uint32_t handle, parent; int err; - if ((err = rtnl_tc_str2handle(arg, &handle)) < 0) - nl_cli_fatal(err, "Unable to parse handle \"%s\": %s", - arg, nl_geterror(err)); + parent = rtnl_tc_get_parent(tc); + + if ((err = rtnl_tc_str2handle(arg, &handle)) < 0) { + if (err == -NLE_OBJ_NOTFOUND && create) + err = rtnl_classid_generate(arg, &handle, parent); + + if (err < 0) + nl_cli_fatal(err, "Unable to parse handle \"%s\": %s", + arg, nl_geterror(err)); + } rtnl_tc_set_handle(tc, handle); } diff --git a/src/nl-class-add.c b/src/nl-class-add.c index 553dec1..80ea826 100644 --- a/src/nl-class-add.c +++ b/src/nl-class-add.c @@ -59,7 +59,7 @@ int main(int argc, char *argv[]) struct nl_cli_qdisc_module *qm; struct rtnl_class_ops *ops; int err, flags = NLM_F_CREATE | NLM_F_EXCL; - char *kind; + char *kind, *id = NULL; sock = nl_cli_alloc_socket(); nl_cli_connect(sock, NETLINK_ROUTE); @@ -106,7 +106,7 @@ int main(int argc, char *argv[]) case 'v': nl_cli_print_version(); break; case 'd': nl_cli_tc_parse_dev(tc, link_cache, optarg); break; case 'p': nl_cli_tc_parse_parent(tc, optarg); break; - case 'i': nl_cli_tc_parse_handle(tc, optarg); break; + case 'i': id = strdup(optarg); break; case ARG_UPDATE: flags = NLM_F_CREATE; break; case ARG_UPDATE_ONLY: flags = 0; break; case ARG_MTU: nl_cli_tc_parse_mtu(tc, optarg); break; @@ -125,6 +125,11 @@ int main(int argc, char *argv[]) if (!rtnl_tc_get_parent(tc)) nl_cli_fatal(EINVAL, "You must specify a parent (--parent=XXX)"); + if (id) { + nl_cli_tc_parse_handle(tc, id, 1); + free(id); + } + kind = argv[optind++]; rtnl_class_set_kind(class, kind); diff --git a/src/nl-class-delete.c b/src/nl-class-delete.c index 94a6ab4..3c5cdc1 100644 --- a/src/nl-class-delete.c +++ b/src/nl-class-delete.c @@ -109,7 +109,7 @@ int main(int argc, char *argv[]) case 'v': nl_cli_print_version(); break; case 'd': nl_cli_tc_parse_dev(tc, link_cache, optarg); break; case 'p': nl_cli_tc_parse_parent(tc, optarg); break; - case 'i': nl_cli_tc_parse_handle(tc, optarg); break; + case 'i': nl_cli_tc_parse_handle(tc, optarg, 0); break; case 'k': nl_cli_class_parse_kind(class, optarg); break; } } diff --git a/src/nl-class-list.c b/src/nl-class-list.c index 3a38555..fccc512 100644 --- a/src/nl-class-list.c +++ b/src/nl-class-list.c @@ -103,7 +103,7 @@ int main(int argc, char *argv[]) case 'v': nl_cli_print_version(); break; case 'd': nl_cli_tc_parse_dev(tc, link_cache, optarg); break; case 'p': nl_cli_tc_parse_parent(tc, optarg); break; - case 'i': nl_cli_tc_parse_handle(tc, optarg); break; + case 'i': nl_cli_tc_parse_handle(tc, optarg, 0); break; case 'k': nl_cli_class_parse_kind(class, optarg); break; } } diff --git a/src/nl-cls-add.c b/src/nl-cls-add.c index 5e2c2dc..fad9313 100644 --- a/src/nl-cls-add.c +++ b/src/nl-cls-add.c @@ -59,7 +59,7 @@ int main(int argc, char *argv[]) struct nl_cli_cls_module *cm; struct rtnl_cls_ops *ops; int err, flags = NLM_F_CREATE | NLM_F_EXCL; - char *kind; + char *kind, *id = NULL; sock = nl_cli_alloc_socket(); nl_cli_connect(sock, NETLINK_ROUTE); @@ -110,7 +110,7 @@ int main(int argc, char *argv[]) case 'v': nl_cli_print_version(); break; case 'd': nl_cli_tc_parse_dev(tc, link_cache, optarg); break; case 'p': nl_cli_tc_parse_parent(tc, optarg); break; - case 'i': nl_cli_tc_parse_handle(tc, optarg); break; + case 'i': id = strdup(optarg); break; case ARG_UPDATE: flags = NLM_F_CREATE; break; case ARG_UPDATE_ONLY: flags = 0; break; case ARG_MTU: nl_cli_tc_parse_mtu(tc, optarg); break; @@ -133,6 +133,11 @@ int main(int argc, char *argv[]) if (!rtnl_tc_get_parent(tc)) nl_cli_fatal(EINVAL, "You must specify a parent (--parent=XXX)"); + if (id) { + nl_cli_tc_parse_handle(tc, id, 1); + free(id); + } + kind = argv[optind++]; rtnl_cls_set_kind(cls, kind); diff --git a/src/nl-cls-delete.c b/src/nl-cls-delete.c index 0ffffb2..359d15e 100644 --- a/src/nl-cls-delete.c +++ b/src/nl-cls-delete.c @@ -134,7 +134,7 @@ int main(int argc, char *argv[]) case 'v': nl_cli_print_version(); break; case 'd': nl_cli_tc_parse_dev(tc, link_cache, optarg); break; case 'p': nl_cli_tc_parse_parent(tc, optarg); break; - case 'i': nl_cli_tc_parse_handle(tc, optarg); break; + case 'i': nl_cli_tc_parse_handle(tc, optarg, 0); break; case 'k': nl_cli_cls_parse_kind(cls, optarg); break; case ARG_PROTO: nl_cli_cls_parse_proto(cls, optarg); break; case ARG_PRIO: diff --git a/src/nl-cls-list.c b/src/nl-cls-list.c index a0220f8..e7c9a12 100644 --- a/src/nl-cls-list.c +++ b/src/nl-cls-list.c @@ -111,7 +111,7 @@ int main(int argc, char *argv[]) case 'v': nl_cli_print_version(); break; case 'd': nl_cli_tc_parse_dev(tc, link_cache, optarg); break; case 'p': nl_cli_tc_parse_parent(tc, optarg); break; - case 'i': nl_cli_tc_parse_handle(tc, optarg); break; + case 'i': nl_cli_tc_parse_handle(tc, optarg, 0); break; case 'k': nl_cli_cls_parse_kind(cls, optarg); break; case ARG_PROTO: nl_cli_cls_parse_proto(cls, optarg); break; case ARG_PRIO: diff --git a/src/nl-qdisc-add.c b/src/nl-qdisc-add.c index 57603b0..9da0f18 100644 --- a/src/nl-qdisc-add.c +++ b/src/nl-qdisc-add.c @@ -56,7 +56,7 @@ int main(int argc, char *argv[]) struct nl_cli_qdisc_module *qm; struct rtnl_qdisc_ops *ops; int err, flags = NLM_F_CREATE | NLM_F_EXCL; - char *kind; + char *kind, *id = NULL; sock = nl_cli_alloc_socket(); nl_cli_connect(sock, NETLINK_ROUTE); @@ -99,7 +99,7 @@ int main(int argc, char *argv[]) case 'v': nl_cli_print_version(); break; case 'd': nl_cli_tc_parse_dev(tc, link_cache, optarg); break; case 'p': nl_cli_tc_parse_parent(tc, optarg); break; - case 'i': nl_cli_tc_parse_handle(tc, optarg); break; + case 'i': id = strdup(optarg); break; case ARG_UPDATE: flags = NLM_F_CREATE; break; case ARG_REPLACE: flags = NLM_F_CREATE | NLM_F_REPLACE; break; case ARG_UPDATE_ONLY: flags = 0; break; @@ -116,6 +116,11 @@ int main(int argc, char *argv[]) if (!rtnl_tc_get_parent(tc)) nl_cli_fatal(EINVAL, "You must specify a parent"); + if (id) { + nl_cli_tc_parse_handle(tc, id, 1); + free(id); + } + kind = argv[optind++]; rtnl_qdisc_set_kind(qdisc, kind); diff --git a/src/nl-qdisc-delete.c b/src/nl-qdisc-delete.c index e91b054..943d5ae 100644 --- a/src/nl-qdisc-delete.c +++ b/src/nl-qdisc-delete.c @@ -115,7 +115,7 @@ int main(int argc, char *argv[]) break; case 'i': nfilter++; - nl_cli_tc_parse_handle(tc, optarg); + nl_cli_tc_parse_handle(tc, optarg, 0); break; case 'k': nfilter++; diff --git a/src/nl-qdisc-list.c b/src/nl-qdisc-list.c index 1ecb9a4..de24fde 100644 --- a/src/nl-qdisc-list.c +++ b/src/nl-qdisc-list.c @@ -85,7 +85,7 @@ int main(int argc, char *argv[]) case 'v': nl_cli_print_version(); break; case 'd': nl_cli_tc_parse_dev(tc, link_cache, optarg); break; case 'p': nl_cli_tc_parse_parent(tc, optarg); break; - case 'i': nl_cli_tc_parse_handle(tc, optarg); break; + case 'i': nl_cli_tc_parse_handle(tc, optarg, 0); break; case 'k': nl_cli_qdisc_parse_kind(qdisc, optarg); break; } } |