[Jack-Devel] [PATCH 3/4] Added multicast interface selection to NetManager

PrevNext  Index
DateSun, 10 Feb 2013 22:42:16 +0100
From Ruslan N. Marchenko <[hidden] at ruff dot mobi>
To[hidden] at jackaudio dot org
In-Reply-ToRuslan N. Marchenko [Jack-Devel] [PATCH 0/4] Multicast interface selection
With new parameter multicast-if manager can be bound to one or all interfaces to listen for slaves
---
 common/JackNetManager.cpp | 25 ++++++++++++++++++++++---
 common/JackNetManager.h   |  1 +
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/common/JackNetManager.cpp b/common/JackNetManager.cpp
index 23b8fd0..e970fb8 100644
--- a/common/JackNetManager.cpp
+++ b/common/JackNetManager.cpp
@@ -464,7 +464,7 @@ namespace Jack
             if (out) {
                 memset(out, 0, sizeof(float) * fParams.fPeriodSize);
             }
-            fNetAudioPlaybackBuffer->SetBuffer(audio_port_index, out)));
+            fNetAudioPlaybackBuffer->SetBuffer(audio_port_index, out);
         #endif
         }
 
@@ -550,6 +550,13 @@ namespace Jack
             strcpy(fMulticastIP, DEFAULT_MULTICAST_IP);
         }
 
+        const char* default_multicast_if = getenv("JACK_NETJACK_INTERFACE");
+        if (default_multicast_if) {
+            strcpy(fMulticastIF, default_multicast_if);
+        } else {
+            strcpy(fMulticastIF, DEFAULT_MULTICAST_IF);
+        }
+
         for (node = params; node; node = jack_slist_next(node)) {
 
             param = (const jack_driver_param_t*) node->data;
@@ -563,6 +570,14 @@ namespace Jack
                     }
                     break;
 
+                case 'f' :
+                    if (strlen(param->value.str) < 32) {
+                        strcpy(fMulticastIF, param->value.str);
+                    } else {
+                        jack_error("Can't use multicast interface %s, using default %s", param->value.ui, DEFAULT_MULTICAST_IF);
+                    }
+                    break;
+
                 case 'p':
                     fSocket.SetPort(param->value.ui);
                     break;
@@ -655,7 +670,7 @@ namespace Jack
     {
         JackNetMasterManager* master_manager = static_cast<JackNetMasterManager*>(arg);
         jack_info("Starting Jack NetManager");
-        jack_info("Listening on '%s:%d'", master_manager->fMulticastIP, master_manager->fSocket.GetPort());
+        jack_info("Listening on '%s:%d%%%s'", master_manager->fMulticastIP, master_manager->fSocket.GetPort(),master_manager->fMulticastIF);
         master_manager->Run();
         return NULL;
     }
@@ -691,7 +706,7 @@ namespace Jack
         }
 
         //join multicast group
-        if (fSocket.JoinMCastGroup(fMulticastIP) == SOCKET_ERROR) {
+        if (fSocket.JoinMCastGroup(fMulticastIP,fMulticastIF) == SOCKET_ERROR) {
             jack_error("Can't join multicast group : %s", StrError(NET_ERROR_CODE));
         }
 
@@ -737,6 +752,7 @@ namespace Jack
                         }
                         break;
                     default:
+			jack_log("JackNetMasterManager::Run: read: %d; type: %d; peer: %s",rx_bytes,host_params.fPacketID,host_params.fName);
                         break;
                 }
             }
@@ -825,6 +841,9 @@ extern "C"
         strcpy(value.str, DEFAULT_MULTICAST_IP);
         jack_driver_descriptor_add_parameter(desc, &filler, "multicast-ip", 'a', JackDriverParamString, &value, NULL, "Multicast address", NULL);
 
+        strcpy(value.str, DEFAULT_MULTICAST_IF);
+        jack_driver_descriptor_add_parameter(desc, &filler, "multicast-if", 'f', JackDriverParamString, &value, NULL, "Multicast interface", "Multicast interface to bind to. ('all' - all ip ifs; 'any' (default) kernel chosen; ifname i.e. eth0)");
+
         value.i = DEFAULT_PORT;
         jack_driver_descriptor_add_parameter(desc, &filler, "udp-net-port", 'p', JackDriverParamInt, &value, NULL, "UDP port", NULL);
 
diff --git a/common/JackNetManager.h b/common/JackNetManager.h
index c88a09b..e5c0a48 100644
--- a/common/JackNetManager.h
+++ b/common/JackNetManager.h
@@ -105,6 +105,7 @@ namespace Jack
             jack_client_t* fClient;
             const char* fName;
             char fMulticastIP[32];
+            char fMulticastIF[32];
             JackNetSocket fSocket;
             jack_native_thread_t fThread;
             master_list_t fMasterList;
-- 
1.8.1.2
PrevNext  Index

1360532545.20934_0.ltw:2, <8efd91c730f837fe8edd55266dce099f740d17ec.1360530044.git.me at ruff dot mobi>