summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/tc.c17
-rw-r--r--src/nl-class-add.c9
-rw-r--r--src/nl-class-delete.c2
-rw-r--r--src/nl-class-list.c2
-rw-r--r--src/nl-cls-add.c9
-rw-r--r--src/nl-cls-delete.c2
-rw-r--r--src/nl-cls-list.c2
-rw-r--r--src/nl-qdisc-add.c9
-rw-r--r--src/nl-qdisc-delete.c2
-rw-r--r--src/nl-qdisc-list.c2
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;
}
}