+/******************************************************************************/
+/* Factors callbacks */
+/******************************************************************************/
+static double constant_latency_factor(double size)
+{
+ return sg_latency_factor;
+}
+
+static double constant_bandwidth_factor(double size)
+{
+ return sg_bandwidth_factor;
+}
+
+static double constant_bandwidth_constraint(double rate, double bound, double size)
+{
+ return rate;
+}
+
+/**********************/
+/* SMPI callbacks */
+/**********************/
+static double smpi_latency_factor(double size)
+{
+ /* 1 B <= size <= 1 KiB */
+ if (size <= 1024.0) {
+ return 1.0056;
+ }
+
+ /* 2 KiB <= size <= 32 KiB */
+ if (size <= 32768.0) {
+ return 1.8805;
+ }
+
+ /* 64 KiB <= size <= 4 MiB */
+ return 22.7111;
+}
+
+static double smpi_bandwidth_factor(double size)
+{
+ /* 1 B <= size <= 1 KiB */
+ if (size <= 1024.0) {
+ return 0.2758;
+ }
+
+ /* 2 KiB <= size <= 32 KiB */
+ if (size <= 32768.0) {
+ return 0.5477;
+ }
+
+ /* 64 KiB <= size <= 4 MiB */
+ return 0.9359;
+}
+
+static double smpi_bandwidth_constraint(double rate, double bound, double size)
+{
+ return rate < 0 ? bound : min(bound, rate * smpi_bandwidth_factor(size));
+}
+
+
+static double (*latency_factor_callback)(double) = &constant_latency_factor;
+static double (*bandwidth_factor_callback)(double) = &constant_bandwidth_factor;
+static double (*bandwidth_constraint_callback)(double, double, double) = &constant_bandwidth_constraint;
+
+
+static link_CM02_t net_link_new(char *name,