+ struct blob_attr *tb[__HR_MAX];
+ struct interface *iface;
+ union if_addr a;
+ bool v6 = false;
+
+ blobmsg_parse(route_policy, __HR_MAX, tb, blob_data(msg), blob_len(msg));
+ if (!tb[HR_TARGET])
+ return UBUS_STATUS_INVALID_ARGUMENT;
+
+ if (tb[HR_V6])
+ v6 = blobmsg_get_bool(tb[HR_V6]);
+
+ memset(&a, 0, sizeof(a));
+ if (!inet_pton(v6 ? AF_INET6 : AF_INET, blobmsg_data(tb[HR_TARGET]), &a))
+ return UBUS_STATUS_INVALID_ARGUMENT;
+
+
+ iface = interface_ip_add_target_route(&a, v6);
+ if (!iface)
+ return UBUS_STATUS_NOT_FOUND;
+
+ blob_buf_init(&b, 0);
+ blobmsg_add_string(&b, "interface", iface->name);
+ ubus_send_reply(ctx, req, b.head);
+