Added an option to manually specify which address to bind to.
[distributedratelimiting.git] / drl / ulogd_DRL.c
index f7b0272..70f096b 100644 (file)
  * Add the config options for DRL. 
  */
 
  * Add the config options for DRL. 
  */
 
-static config_entry_t create_htb = {
+static config_entry_t bind_addr = {
     .next = NULL,
     .next = NULL,
+    .key = "bind_addr",
+    .type = CONFIG_TYPE_STRING,
+    .options = CONFIG_OPT_NONE,
+    .u = { .string = "AUTO" },
+};
+
+static config_entry_t create_htb = {
+    .next = &bind_addr,
     .key = "create_htb",
     .type = CONFIG_TYPE_INT,
     .options = CONFIG_OPT_NONE,
     .key = "create_htb",
     .type = CONFIG_TYPE_INT,
     .options = CONFIG_OPT_NONE,
@@ -1526,15 +1534,20 @@ static int init_drl(void) {
     pthread_rwlock_init(&limiter.limiter_lock,NULL);
 
     /* determine our local IP by iterating through interfaces */
     pthread_rwlock_init(&limiter.limiter_lock,NULL);
 
     /* determine our local IP by iterating through interfaces */
-    limiter.ip = get_local_ip();
-    if (limiter.ip == NULL) {
-        printlog(LOG_CRITICAL, "ulogd_DRL unable to aquire local IP address, not registering.\n");
-        return false;
+    if (strncmp(bind_addr.u.string, "AUTO", 4)) {
+        limiter.ip = bind_addr.u.string;
+    } else {
+        limiter.ip = get_local_ip();
+        if (limiter.ip == NULL) {
+            printlog(LOG_CRITICAL, "ulogd_DRL unable to aquire local IP address, not registering.\n");
+            return false;
+        }
     }
     limiter.localaddr = inet_addr(limiter.ip);
     limiter.port = htons(LIMITER_LISTEN_PORT);
     limiter.udp_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
     if (limiter.udp_socket < 0) {
     }
     limiter.localaddr = inet_addr(limiter.ip);
     limiter.port = htons(LIMITER_LISTEN_PORT);
     limiter.udp_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
     if (limiter.udp_socket < 0) {
+        perror("socket()");
         printlog(LOG_CRITICAL, "Failed to create UDP socket().\n");
         return false;
     }
         printlog(LOG_CRITICAL, "Failed to create UDP socket().\n");
         return false;
     }
@@ -1545,6 +1558,7 @@ static int init_drl(void) {
     server_address.sin_port = limiter.port;
 
     if (bind(limiter.udp_socket, (struct sockaddr *) &server_address, sizeof(server_address)) < 0) {
     server_address.sin_port = limiter.port;
 
     if (bind(limiter.udp_socket, (struct sockaddr *) &server_address, sizeof(server_address)) < 0) {
+        perror("bind()");
         printlog(LOG_CRITICAL, "Failed to bind UDP socket.\n");
         return false;
     }
         printlog(LOG_CRITICAL, "Failed to bind UDP socket.\n");
         return false;
     }