Просмотр исходного кода

ncd: NCDIfConfig: add IPv6 route functions

ambrop7 13 лет назад
Родитель
Сommit
eb26903dee
2 измененных файлов с 71 добавлено и 0 удалено
  1. 65 0
      ncd/NCDIfConfig.c
  2. 6 0
      ncd/NCDIfConfig.h

+ 65 - 0
ncd/NCDIfConfig.c

@@ -248,6 +248,45 @@ int NCDIfConfig_remove_ipv4_route (struct ipv4_ifaddr dest, const uint32_t *gate
     return route_cmd("del", dest, gateway, metric, device);
 }
 
+static int route_cmd6 (const char *cmdtype, struct ipv6_ifaddr dest, const struct ipv6_addr *gateway, int metric, const char *ifname)
+{
+    ASSERT(!strcmp(cmdtype, "add") || !strcmp(cmdtype, "del"))
+    ASSERT(dest.prefix >= 0)
+    ASSERT(dest.prefix <= 128)
+    
+    if (strlen(ifname) >= IFNAMSIZ) {
+        BLog(BLOG_ERROR, "ifname too long");
+        return 0;
+    }
+    
+    char dest_str[IPADDR6_PRINT_MAX];
+    ipaddr6_print_addr(dest.addr, dest_str);
+    
+    char gwstr[10 + IPADDR6_PRINT_MAX];
+    if (gateway) {
+        strcpy(gwstr, " via ");
+        ipaddr6_print_addr(*gateway, gwstr + strlen(gwstr));
+    } else {
+        gwstr[0] = '\0';
+    }
+    
+    char cmd[70 + IPADDR6_PRINT_MAX + IPADDR6_PRINT_MAX + IFNAMSIZ];
+    sprintf(cmd, IP_CMD" route %s %s/%d%s metric %d dev %s",
+            cmdtype, dest_str, dest.prefix, gwstr, metric, ifname);
+    
+    return !run_command(cmd);
+}
+
+int NCDIfConfig_add_ipv6_route (struct ipv6_ifaddr dest, const struct ipv6_addr *gateway, int metric, const char *device)
+{
+    return route_cmd6("add", dest, gateway, metric, device);
+}
+
+int NCDIfConfig_remove_ipv6_route (struct ipv6_ifaddr dest, const struct ipv6_addr *gateway, int metric, const char *device)
+{
+    return route_cmd6("del", dest, gateway, metric, device);
+}
+
 static int blackhole_route_cmd (const char *cmdtype, struct ipv4_ifaddr dest, int metric)
 {
     ASSERT(!strcmp(cmdtype, "add") || !strcmp(cmdtype, "del"))
@@ -273,6 +312,32 @@ int NCDIfConfig_remove_ipv4_blackhole_route (struct ipv4_ifaddr dest, int metric
     return blackhole_route_cmd("del", dest, metric);
 }
 
+static int blackhole_route_cmd6 (const char *cmdtype, struct ipv6_ifaddr dest, int metric)
+{
+    ASSERT(!strcmp(cmdtype, "add") || !strcmp(cmdtype, "del"))
+    ASSERT(dest.prefix >= 0)
+    ASSERT(dest.prefix <= 128)
+    
+    char dest_str[IPADDR6_PRINT_MAX];
+    ipaddr6_print_addr(dest.addr, dest_str);
+    
+    char cmd[70 + IPADDR6_PRINT_MAX];
+    sprintf(cmd, IP_CMD" route %s blackhole %s/%d metric %d",
+            cmdtype, dest_str, dest.prefix, metric);
+    
+    return !run_command(cmd);
+}
+
+int NCDIfConfig_add_ipv6_blackhole_route (struct ipv6_ifaddr dest, int metric)
+{
+    return blackhole_route_cmd6("add", dest, metric);
+}
+
+int NCDIfConfig_remove_ipv6_blackhole_route (struct ipv6_ifaddr dest, int metric)
+{
+    return blackhole_route_cmd6("del", dest, metric);
+}
+
 int NCDIfConfig_set_dns_servers (uint32_t *servers, size_t num_servers)
 {
     FILE *temp_file = fopen(RESOLVCONF_TEMP_FILE, "w");

+ 6 - 0
ncd/NCDIfConfig.h

@@ -53,9 +53,15 @@ int NCDIfConfig_remove_ipv6_addr (const char *ifname, struct ipv6_ifaddr ifaddr)
 int NCDIfConfig_add_ipv4_route (struct ipv4_ifaddr dest, const uint32_t *gateway, int metric, const char *device);
 int NCDIfConfig_remove_ipv4_route (struct ipv4_ifaddr dest, const uint32_t *gateway, int metric, const char *device);
 
+int NCDIfConfig_add_ipv6_route (struct ipv6_ifaddr dest, const struct ipv6_addr *gateway, int metric, const char *device);
+int NCDIfConfig_remove_ipv6_route (struct ipv6_ifaddr dest, const struct ipv6_addr *gateway, int metric, const char *device);
+
 int NCDIfConfig_add_ipv4_blackhole_route (struct ipv4_ifaddr dest, int metric);
 int NCDIfConfig_remove_ipv4_blackhole_route (struct ipv4_ifaddr dest, int metric);
 
+int NCDIfConfig_add_ipv6_blackhole_route (struct ipv6_ifaddr dest, int metric);
+int NCDIfConfig_remove_ipv6_blackhole_route (struct ipv6_ifaddr dest, int metric);
+
 int NCDIfConfig_set_dns_servers (uint32_t *servers, size_t num_servers);
 
 int NCDIfConfig_make_tuntap (const char *ifname, const char *owner, int tun);