]> granicus.if.org Git - libnl/commitdiff
route: add separate function to set netem qdisc delay distribution
authorSteffen Vogel <post@steffenvogel.de>
Wed, 20 Dec 2017 10:09:08 +0000 (11:09 +0100)
committerSteffen Vogel <post@steffenvogel.de>
Wed, 20 Dec 2017 10:09:08 +0000 (11:09 +0100)
A new function rtnl_netem_set_delay_distribution_data() has been added
to allow the user to pass the delay distribution directly without loading
it from a file.

In conjunction with the maketable code (see iproute2 / NISTnet) this can
be used to generate and load custom delay distributions on the fly.

include/netlink/route/qdisc/netem.h
lib/route/qdisc/netem.c

index 4b071bf158f79d1eeae604e471a2f05a19ca146e..707d665484602d97c41a9e985fe55ecdc3534145 100644 (file)
@@ -66,6 +66,7 @@ extern int rtnl_netem_get_delay_correlation(struct rtnl_qdisc *);
 /* Delay Distribution */
 #define MAXDIST 65536
 extern int rtnl_netem_set_delay_distribution(struct rtnl_qdisc *, const char *);
+extern int rtnl_netem_set_delay_distribution_data(struct rtnl_qdisc *, int16_t *, size_t len);
 extern int rtnl_netem_get_delay_distribution_size(struct rtnl_qdisc *);
 extern int rtnl_netem_get_delay_distribution(struct rtnl_qdisc *, int16_t **);
 
index c4ba2a1fe80fdf570524e5ed948ee7203c4771d2..0df5b0178fd2d9452aacea85854e5c973d1ba25b 100644 (file)
@@ -867,17 +867,36 @@ int rtnl_netem_get_delay_distribution(struct rtnl_qdisc *qdisc, int16_t **dist_p
 }
 
 /**
- * Set the delay distribution. Latency/jitter must be set before applying.
+ * Set the delay distribution data. Latency/jitter must be set before applying.
  * @arg qdisc Netem qdisc.
- * @arg dist_type The name of the distribution (type, file, path/file).
  * @return 0 on success, error code on failure.
  */
-int rtnl_netem_set_delay_distribution(struct rtnl_qdisc *qdisc, const char *dist_type) {
+int rtnl_netem_set_delay_distribution_data(struct rtnl_qdisc *qdisc, int16_t *data, size_t len) {
        struct rtnl_netem *netem;
 
        if (!(netem = rtnl_tc_data(TC_CAST(qdisc))))
                BUG();
 
+       if (len > MAXDIST)
+               return -NLE_INVAL;
+
+       netem->qnm_dist.dist_data = (int16_t *) calloc(len, sizeof(int16_t));
+
+       memcpy(netem->qnm_dist.dist_data, data, len * sizeof(int16_t));
+
+       netem->qnm_dist.dist_size = len;
+       netem->qnm_mask |= SCH_NETEM_ATTR_DIST;
+
+       return 0;
+}
+
+/**
+ * Load the delay distribution from a file. Latency/jitter must be set before applying.
+ * @arg qdisc Netem qdisc.
+ * @arg dist_type The name of the distribution (type, file, path/file).
+ * @return 0 on success, error code on failure.
+ */
+int rtnl_netem_set_delay_distribution(struct rtnl_qdisc *qdisc, const char *dist_type) {
        FILE *f;
        int n = 0;
        size_t i;
@@ -909,7 +928,7 @@ int rtnl_netem_set_delay_distribution(struct rtnl_qdisc *qdisc, const char *dist
        if (f == NULL)
                return -nl_syserr2nlerr(errno);
 
-       netem->qnm_dist.dist_data = (int16_t *) calloc (MAXDIST, sizeof(int16_t));
+       int16_t * data = (int16_t *) calloc (MAXDIST, sizeof(int16_t));
 
        line = (char *) calloc (sizeof(char), len + 1);
 
@@ -928,17 +947,14 @@ int rtnl_netem_set_delay_distribution(struct rtnl_qdisc *qdisc, const char *dist
                                fclose(f);
                                return -NLE_INVAL;
                        }
-                       netem->qnm_dist.dist_data[n++] = x;
+                       data[n++] = x;
                }
        }
 
        free(line);
-
-       netem->qnm_dist.dist_size = n;
-       netem->qnm_mask |= SCH_NETEM_ATTR_DIST;
-
        fclose(f);
-       return 0;
+       
+       return rtnl_netem_set_delay_distribution_data(qdisc, data, n);
 }
 
 /** @} */