[PATCH v7 24/33] raop: Add IPv6 support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Hajime Fujita <crisp.fujita@xxxxxxxxx>

---
 src/modules/raop/raop-client.c | 23 ++++++++++++++++-------
 src/modules/rtp/rtsp_client.c  |  2 +-
 2 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/src/modules/raop/raop-client.c b/src/modules/raop/raop-client.c
index cf415d0..574f10b 100644
--- a/src/modules/raop/raop-client.c
+++ b/src/modules/raop/raop-client.c
@@ -752,6 +752,7 @@ static int open_bind_udp_socket(pa_raop_client *c, uint16_t *actual_port) {
     if (inet_pton(AF_INET, pa_rtsp_localip(c->rtsp), &sa4.sin_addr) > 0) {
         sa4.sin_family = af = AF_INET;
         sa4.sin_port = htons(port);
+        sa4.sin_addr.s_addr = INADDR_ANY;
         sa = (struct sockaddr *) &sa4;
         salen = sizeof(sa4);
         sa_port = &sa4.sin_port;
@@ -759,6 +760,7 @@ static int open_bind_udp_socket(pa_raop_client *c, uint16_t *actual_port) {
     } else if (inet_pton(AF_INET6, pa_rtsp_localip(c->rtsp), &sa6.sin6_addr) > 0) {
         sa6.sin6_family = af = AF_INET6;
         sa6.sin6_port = htons(port);
+        sa6.sin6_addr = in6addr_any;
         sa = (struct sockaddr *) &sa6;
         salen = sizeof(sa6);
         sa_port = &sa6.sin6_port;
@@ -849,11 +851,18 @@ static void rtsp_stream_cb(pa_rtsp_client *rtsp, pa_rtsp_state_t state, pa_rtsp_
             int frames = 0;
             const char *ip;
             char *url;
+            int ipv;
 
             pa_log_debug("RAOP: CONNECTED");
 
             ip = pa_rtsp_localip(c->rtsp);
-            url = pa_sprintf_malloc("rtsp://%s/%s", ip, c->sid);
+            if (pa_is_ip6_address(ip)) {
+                ipv = 6;
+                url = pa_sprintf_malloc("rtsp://[%s]/%s", ip, c->sid);
+            } else {
+                ipv = 4;
+                url = pa_sprintf_malloc("rtsp://%s/%s", ip, c->sid);
+            }
             pa_rtsp_set_url(c->rtsp, url);
 
             if (c->protocol == PA_RAOP_PROTOCOL_TCP)
@@ -865,14 +874,14 @@ static void rtsp_stream_cb(pa_rtsp_client *rtsp, pa_rtsp_state_t state, pa_rtsp_
                 case PA_RAOP_ENCRYPTION_NONE: {
                     sdp = pa_sprintf_malloc(
                         "v=0\r\n"
-                        "o=iTunes %s 0 IN IP4 %s\r\n"
+                        "o=iTunes %s 0 IN IP%d %s\r\n"
                         "s=iTunes\r\n"
-                        "c=IN IP4 %s\r\n"
+                        "c=IN IP%d %s\r\n"
                         "t=0 0\r\n"
                         "m=audio 0 RTP/AVP 96\r\n"
                         "a=rtpmap:96 AppleLossless\r\n"
                         "a=fmtp:96 %d 0 16 40 10 14 2 255 0 0 44100\r\n",
-                        c->sid, ip, c->host, frames);
+                        c->sid, ipv, ip, ipv, c->host, frames);
 
                     break;
                 }
@@ -886,16 +895,16 @@ static void rtsp_stream_cb(pa_rtsp_client *rtsp, pa_rtsp_state_t state, pa_rtsp_
 
                     sdp = pa_sprintf_malloc(
                         "v=0\r\n"
-                        "o=iTunes %s 0 IN IP4 %s\r\n"
+                        "o=iTunes %s 0 IN IP%d %s\r\n"
                         "s=iTunes\r\n"
-                        "c=IN IP4 %s\r\n"
+                        "c=IN IP%d %s\r\n"
                         "t=0 0\r\n"
                         "m=audio 0 RTP/AVP 96\r\n"
                         "a=rtpmap:96 AppleLossless\r\n"
                         "a=fmtp:96 %d 0 16 40 10 14 2 255 0 0 44100\r\n"
                         "a=rsaaeskey:%s\r\n"
                         "a=aesiv:%s\r\n",
-                        c->sid, ip, c->host, frames, key, iv);
+                        c->sid, ipv, ip, ipv, c->host, frames, key, iv);
 
                     pa_xfree(key);
                     pa_xfree(iv);
diff --git a/src/modules/rtp/rtsp_client.c b/src/modules/rtp/rtsp_client.c
index 31b8673..fd5d2d8 100644
--- a/src/modules/rtp/rtsp_client.c
+++ b/src/modules/rtp/rtsp_client.c
@@ -330,7 +330,7 @@ static void on_connection(pa_socket_client *sc, pa_iochannel *io, void *userdata
             }
         } else if (AF_INET6 == sa.sa.sa_family) {
             if ((res = inet_ntop(AF_INET6, &sa.in6.sin6_addr, buf, sizeof(buf)))) {
-                c->localip = pa_sprintf_malloc("[%s]", res);
+                c->localip = pa_xstrdup(res);
             }
         }
     }
-- 
2.9.3



[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux