Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
  • abdsaber000/vlc
  • falbrechtskirchinger/vlc
  • b.sullender/vlc
  • hulxv/vlc
  • zyad-ayad/vlc
  • shocknovaa/vlc
  • gremlinflat/vlc
  • Pratham24D/vlc
  • hmaarrfk/vlc
412 results
Show changes
Commits on Source (14)
......@@ -292,6 +292,16 @@ static inline int vlc_setsockopt(int s, int level, int name,
# endif
#endif
/* union of the various sockaddr structures often used together */
typedef union {
struct sockaddr sa;
struct sockaddr_storage ss;
struct sockaddr_in sin;
#ifdef AF_INET6
struct sockaddr_in6 sin6;
#endif
} vlc_sockaddr;
VLC_API int vlc_getnameinfo( const struct sockaddr *, int, char *, int, int *, int );
/**
......@@ -343,22 +353,22 @@ net_SockAddrIsMulticast (const struct sockaddr *addr, socklen_t len)
static inline int net_GetSockAddress( int fd, char *address, int *port )
{
struct sockaddr_storage addr;
socklen_t addrlen = sizeof( addr );
vlc_sockaddr addr;
socklen_t addrlen = sizeof( addr.ss );
return getsockname( fd, (struct sockaddr *)&addr, &addrlen )
|| vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address,
return getsockname( fd, &addr.sa, &addrlen )
|| vlc_getnameinfo( &addr.sa, addrlen, address,
NI_MAXNUMERICHOST, port, NI_NUMERICHOST )
? VLC_EGENERIC : 0;
}
static inline int net_GetPeerAddress( int fd, char *address, int *port )
{
struct sockaddr_storage addr;
socklen_t addrlen = sizeof( addr );
vlc_sockaddr addr;
socklen_t addrlen = sizeof( addr.ss );
return getpeername( fd, (struct sockaddr *)&addr, &addrlen )
|| vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address,
return getpeername( fd, &addr.sa, &addrlen )
|| vlc_getnameinfo( &addr.sa, addrlen, address,
NI_MAXNUMERICHOST, port, NI_NUMERICHOST )
? VLC_EGENERIC : 0;
}
......
......@@ -293,19 +293,10 @@ typedef struct _access_sys_t
vlc_timer_t updateTimer;
/* Mulicast group and source, differentiate between address family based on the sa_family which is the first field (sin_family or sin6_family) in both structs */
union {
struct sockaddr_in ipv4;
struct sockaddr_in6 ipv6;
} mcastGroupAddr;
union {
struct sockaddr_in ipv4;
struct sockaddr_in6 ipv6;
} mcastSrcAddr;
vlc_sockaddr mcastGroupAddr;
vlc_sockaddr mcastSrcAddr;
/* AMT relay imformation */
union {
struct sockaddr_in ipv4;
struct sockaddr_in6 ipv6;
} relayDiscoAddr;
vlc_sockaddr relayDiscoAddr;
/* AMT Relay Membership Query data (RFC7450) */
struct relay_mem_query_msg_t {
......@@ -477,12 +468,12 @@ static int Open( vlc_object_t *p_this )
/* Store the binary socket representation of multicast group address */
if ( serverinfo->ai_family == AF_INET )
{
sys->mcastGroupAddr.ipv4 = *(struct sockaddr_in*)serverinfo->ai_addr;
sys->mcastGroupAddr.sin = *(struct sockaddr_in*)serverinfo->ai_addr;
hints.ai_family = AF_INET; /* now that we know family of the group we can improve the hints for resolving the source */
}
else
{
sys->mcastGroupAddr.ipv6 = *(struct sockaddr_in6*)serverinfo->ai_addr;
sys->mcastGroupAddr.sin6 = *(struct sockaddr_in6*)serverinfo->ai_addr;
hints.ai_family = AF_INET6;
}
/* Release the allocated memory */
......@@ -546,9 +537,9 @@ static int Open( vlc_object_t *p_this )
/* Store the binary socket representation of multicast source address */
if ( serverinfo->ai_family == AF_INET )
{
sys->mcastSrcAddr.ipv4 = *(struct sockaddr_in*)serverinfo->ai_addr;
sys->mcastSrcAddr.sin = *(struct sockaddr_in*)serverinfo->ai_addr;
} else {
sys->mcastSrcAddr.ipv6 = *(struct sockaddr_in6*)serverinfo->ai_addr;
sys->mcastSrcAddr.sin6 = *(struct sockaddr_in6*)serverinfo->ai_addr;
}
msg_Dbg( p_access, "Setting multicast source address to %s", mcastSrc);
}
......@@ -665,7 +656,7 @@ static block_t *BlockAMT(stream_t *p_access, bool *restrict eof)
{
access_sys_t *sys = p_access->p_sys;
ssize_t len = 0, shift = 0;
int tunnel = UDP_HDR_LEN + AMT_HDR_LEN + (sys->mcastGroupAddr.ipv4.sin_family == AF_INET ? IP_HDR_LEN : IPv6_FIXED_HDR_LEN );
int tunnel = UDP_HDR_LEN + AMT_HDR_LEN + (sys->mcastGroupAddr.sin.sin_family == AF_INET ? IP_HDR_LEN : IPv6_FIXED_HDR_LEN );
/* Allocate anticipated MTU buffer for holding the UDP packet suitable for native or AMT tunneled multicast */
block_t *pkt = block_Alloc( sys->mtu + tunnel );
......@@ -821,7 +812,7 @@ static block_t *BlockAMT(stream_t *p_access, bool *restrict eof)
/* Otherwise pull native multicast */
struct sockaddr temp;
socklen_t temp_size = sizeof( struct sockaddr );
len = recvfrom( sys->fd, (char *)pkt->p_buffer, sys->mtu + tunnel, 0, (struct sockaddr*)&temp, &temp_size );
len = recvfrom( sys->fd, (char *)pkt->p_buffer, sys->mtu + tunnel, 0, &temp, &temp_size );
if ( len <= 0 )
{
msg_Err(p_access, "recv() call failed: %zd was returned", len);
......@@ -894,9 +885,9 @@ static bool open_amt_tunnel( stream_t *p_access )
/* Store the binary representation */
if ( server->ai_family == AF_INET )
{
sys->relayDiscoAddr.ipv4 = *(struct sockaddr_in*)server_addr;
sys->relayDiscoAddr.sin = *(struct sockaddr_in*)server_addr;
} else {
sys->relayDiscoAddr.ipv6 = *(struct sockaddr_in6*)server_addr;
sys->relayDiscoAddr.sin6 = *(struct sockaddr_in6*)server_addr;
}
if( amt_sockets_init( p_access ) != 0 )
......@@ -942,8 +933,8 @@ static bool open_amt_tunnel( stream_t *p_access )
/* Arm IGMP timer once we've confirmed we are getting packets */
vlc_timer_schedule( sys->updateTimer, false,
VLC_TICK_FROM_SEC( sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic), 0 );
msg_Err(p_access, "Arming timer. qqic is %d",sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic);
VLC_TICK_FROM_SEC( sys->relayDiscoAddr.sin.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic), 0 );
msg_Err(p_access, "Arming timer. qqic is %d",sys->relayDiscoAddr.sin.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic);
break; /* found an active server sending UDP packets, so exit loop */
}
......@@ -1132,16 +1123,12 @@ static void make_ipv6( amt_ipv6_t *p, uint16_t length, struct in6_addr *dst )
*/
static int amt_sockets_init( stream_t *p_access )
{
struct sockaddr *rcvAddr;
struct sockaddr_in rcvAddr4;
struct sockaddr_in6 rcvAddr6;
vlc_sockaddr rcvAddr = {0};
access_sys_t *sys = p_access->p_sys;
memset( &rcvAddr4, 0, sizeof(struct sockaddr_in) );
memset( &rcvAddr6, 0, sizeof(struct sockaddr_in6) );
int enable = 0, res = 0;
/* create UDP socket */
sys->sAMT = vlc_socket( sys->relayDiscoAddr.ipv4.sin_family, SOCK_DGRAM, IPPROTO_UDP, true );
sys->sAMT = vlc_socket( sys->relayDiscoAddr.sin.sin_family, SOCK_DGRAM, IPPROTO_UDP, true );
if( sys->sAMT == -1 )
{
msg_Err( p_access, "Failed to create UDP socket" );
......@@ -1155,23 +1142,29 @@ static int amt_sockets_init( stream_t *p_access )
goto error;
}
rcvAddr4.sin_family = AF_INET;
rcvAddr4.sin_port = htons( 0 );
rcvAddr4.sin_addr.s_addr = INADDR_ANY;
rcvAddr6.sin6_family = AF_INET6;
rcvAddr6.sin6_port = htons( 0 );
rcvAddr6.sin6_addr = (struct in6_addr) IN6ADDR_ANY_INIT;
rcvAddr = sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? (struct sockaddr*) &rcvAddr4 : (struct sockaddr*) &rcvAddr6;
socklen_t rcvNamelen;
if (sys->relayDiscoAddr.sin.sin_family == AF_INET)
{
rcvNamelen = sizeof(rcvAddr.sin);
rcvAddr.sin.sin_family = AF_INET;
rcvAddr.sin.sin_port = htons( 0 );
rcvAddr.sin.sin_addr.s_addr = INADDR_ANY;
}
else
{
rcvNamelen = sizeof(rcvAddr.sin6);
rcvAddr.sin6.sin6_family = AF_INET6;
rcvAddr.sin6.sin6_port = htons( 0 );
rcvAddr.sin6.sin6_addr = (struct in6_addr) IN6ADDR_ANY_INIT;
}
if( bind(sys->sAMT, rcvAddr, sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sizeof(rcvAddr4) : sizeof(rcvAddr6) ) != 0 )
if( bind(sys->sAMT, &rcvAddr.sa, rcvNamelen ) != 0 )
{
msg_Err( p_access, "Failed to bind UDP socket error: %s", vlc_strerror(errno) );
goto error;
}
sys->sQuery = vlc_socket( sys->relayDiscoAddr.ipv4.sin_family, SOCK_DGRAM, IPPROTO_UDP, true );
sys->sQuery = vlc_socket( sys->relayDiscoAddr.sin.sin_family, SOCK_DGRAM, IPPROTO_UDP, true );
if( sys->sQuery == -1 )
{
msg_Err( p_access, "Failed to create query socket" );
......@@ -1179,22 +1172,24 @@ static int amt_sockets_init( stream_t *p_access )
}
/* bind socket to local address */
struct sockaddr_in stLocalAddr4 =
vlc_sockaddr stLocalAddr = {0};
socklen_t stLocalNamelen;
if (sys->relayDiscoAddr.sin.sin_family == AF_INET)
{
.sin_family = AF_INET,
.sin_port = htons( 0 ),
.sin_addr.s_addr = INADDR_ANY,
};
struct sockaddr_in6 stLocalAddr6;
memset( &rcvAddr6, 0, sizeof(struct sockaddr_in6) );
stLocalAddr6.sin6_family = AF_INET6;
stLocalAddr6.sin6_port = htons( 0 );
stLocalAddr6.sin6_addr = (struct in6_addr) IN6ADDR_ANY_INIT;
struct sockaddr *stLocalAddr = sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? (struct sockaddr*) &stLocalAddr4 : (struct sockaddr*) &stLocalAddr6;
stLocalNamelen = sizeof(stLocalAddr.sin);
stLocalAddr.sin.sin_family = AF_INET;
stLocalAddr.sin.sin_port = htons( 0 );
stLocalAddr.sin.sin_addr.s_addr = INADDR_ANY;
}
else
{
stLocalNamelen = sizeof(stLocalAddr.sin6);
stLocalAddr.sin6.sin6_family = AF_INET6;
stLocalAddr.sin6.sin6_port = htons( 0 );
stLocalAddr.sin6.sin6_addr = (struct in6_addr) IN6ADDR_ANY_INIT;
}
if( bind(sys->sQuery, stLocalAddr, sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sizeof(stLocalAddr4) : sizeof(stLocalAddr6) ) != 0 )
if( bind(sys->sQuery, &stLocalAddr.sa, stLocalNamelen ) != 0 )
{
msg_Err( p_access, "Failed to bind query socket" );
goto error;
......@@ -1250,7 +1245,7 @@ static void amt_send_relay_discovery_msg( stream_t *p_access, char *relay_ip )
sys->glob_ulNonce = ulNonce;
/* send it */
nRet = sendto( sys->sAMT, chaSendBuffer, sizeof(chaSendBuffer), 0, (struct sockaddr*) &sys->relayDiscoAddr, sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6));
nRet = sendto( sys->sAMT, chaSendBuffer, sizeof(chaSendBuffer), 0, &sys->relayDiscoAddr.sa, sys->relayDiscoAddr.sin.sin_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6));
if( nRet < 0)
{
......@@ -1296,7 +1291,7 @@ static void amt_send_relay_request( stream_t *p_access, char *relay_ip )
*/
chaSendBuffer[0] = AMT_REQUEST;
chaSendBuffer[1] = sys->mcastGroupAddr.ipv4.sin_family == AF_INET6;
chaSendBuffer[1] = sys->mcastGroupAddr.sin.sin_family == AF_INET6;
chaSendBuffer[2] = 0;
chaSendBuffer[3] = 0;
......@@ -1421,7 +1416,7 @@ static int amt_send_mem_update( stream_t *p_access, bool leave)
ulNonce = sys->glob_ulNonce;
memcpy( &pSendBuffer[8], &ulNonce, NONCE_LEN );
if ( sys->mcastGroupAddr.ipv4.sin_family == AF_INET )
if ( sys->mcastGroupAddr.sin.sin_family == AF_INET )
{
/* make IP header for IGMP packet */
amt_ip_alert_t p_ipHead;
......@@ -1440,13 +1435,13 @@ static int amt_send_mem_update( stream_t *p_access, bool leave)
amt_igmpv3_groupRecord_t groupRcd;
groupRcd.auxDatalen = 0;
groupRcd.ssm = sys->mcastGroupAddr.ipv4.sin_addr.s_addr;
groupRcd.ssm = sys->mcastGroupAddr.sin.sin_addr.s_addr;
if( sys->mcastSrcAddr.ipv4.sin_addr.s_addr )
if( sys->mcastSrcAddr.sin.sin_addr.s_addr )
{
groupRcd.type = leave ? AMT_IGMP_BLOCK:AMT_IGMP_INCLUDE;
groupRcd.nSrc = htons(1);
groupRcd.srcIP[0] = sys->mcastSrcAddr.ipv4.sin_addr.s_addr;
groupRcd.srcIP[0] = sys->mcastSrcAddr.sin.sin_addr.s_addr;
}
else
......@@ -1487,7 +1482,7 @@ static int amt_send_mem_update( stream_t *p_access, bool leave)
make_ipv6(&ip, IPv6_HOP_BY_HOP_OPTION_LEN + MLD_REPORT_LEN, &tmp);
if( make_mld_report(p_access,leave,&report,&sys->mcastGroupAddr.ipv6.sin6_addr,&sys->mcastSrcAddr.ipv6.sin6_addr) )
if( make_mld_report(p_access,leave,&report,&sys->mcastGroupAddr.sin6.sin6_addr,&sys->mcastSrcAddr.sin6.sin6_addr) )
{
goto oom;
}
......@@ -1581,18 +1576,27 @@ static bool amt_rcv_relay_adv( stream_t *p_access )
return false;
}
struct sockaddr_in relayAddr4;
relayAddr4.sin_port = htons( AMT_PORT );
relayAddr4.sin_family = AF_INET;
struct sockaddr_in6 relayAddr6;
relayAddr6.sin6_port = htons( AMT_PORT );
relayAddr6.sin6_family = AF_INET6;
vlc_sockaddr relayAddr = {0};
socklen_t relayNamelen;
void *bin_address_start;
if (sys->relayDiscoAddr.sin.sin_family == AF_INET)
{
relayNamelen = sizeof(relayAddr.sin);
bin_address_start = &relayAddr.sin.sin_addr;
relayAddr.sin.sin_port = htons( AMT_PORT );
relayAddr.sin.sin_family = AF_INET;
}
else
{
relayNamelen = sizeof(relayAddr.sin6);
bin_address_start = &relayAddr.sin6.sin6_addr;
relayAddr.sin6.sin6_port = htons( AMT_PORT );
relayAddr.sin6.sin6_family = AF_INET6;
}
void *bin_address_start = (sys->relayDiscoAddr.ipv4.sin_family == AF_INET) ? (void*) &relayAddr4.sin_addr : (void*) &relayAddr6.sin6_addr;
memcpy( bin_address_start , &pkt[8], sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? 4 : 16);
memcpy( bin_address_start , &pkt[8], sys->relayDiscoAddr.sin.sin_family == AF_INET ? 4 : 16);
int nRet = connect( sys->sAMT, sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? (struct sockaddr*)&relayAddr4 : (struct sockaddr*)&relayAddr6, sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sizeof(relayAddr4) : sizeof(relayAddr6) );
int nRet = connect( sys->sAMT, &relayAddr.sa, relayNamelen );
if( nRet < 0 )
{
msg_Err( p_access, "Error connecting AMT UDP socket: %s", vlc_strerror(errno) );
......@@ -1649,7 +1653,7 @@ static bool amt_rcv_relay_mem_query( stream_t *p_access )
ssize_t len = recv( sys->sAMT, pkt, i_buf_len, 0 );
if ( len <= 0 || (sys->mcastGroupAddr.ipv4.sin_family == AF_INET && len != (RELAY_QUERY_MSG_LEN - 40)) || (sys->mcastGroupAddr.ipv4.sin_family == AF_INET6 && len < RELAY_QUERY_MSG_LEN) ) /* subtract 40 for ipv4 case */
if ( len <= 0 || (sys->mcastGroupAddr.sin.sin_family == AF_INET && len != (RELAY_QUERY_MSG_LEN - 40)) || (sys->mcastGroupAddr.sin.sin_family == AF_INET6 && len < RELAY_QUERY_MSG_LEN) ) /* subtract 40 for ipv4 case */
{
msg_Err(p_access, "length of relay query message invalid!");
return false;
......@@ -1665,7 +1669,7 @@ static bool amt_rcv_relay_mem_query( stream_t *p_access )
return false;
}
if ( sys->mcastGroupAddr.ipv4.sin_family == AF_INET )
if ( sys->mcastGroupAddr.sin.sin_family == AF_INET )
{
size_t shift = AMT_HDR_LEN + MAC_LEN + NONCE_LEN + IP_HDR_IGMP_LEN;
sys->relay_query.igmp.type = pkt[shift];
......@@ -1754,5 +1758,5 @@ static void amt_update_timer_cb( void *data )
/* Arms the timer again for a single shot from this callback. That way, the
* time spent in amt_send_mem_update() is taken into consideration. */
vlc_timer_schedule( sys->updateTimer, false,
VLC_TICK_FROM_SEC( sys->mcastGroupAddr.ipv4.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic), 0 );
VLC_TICK_FROM_SEC( sys->mcastGroupAddr.sin.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic), 0 );
}
......@@ -122,23 +122,23 @@ static int server_socket(unsigned *port)
if (fd == -1)
return -1;
struct sockaddr_in6 addr = {
.sin6_family = AF_INET6,
vlc_sockaddr addr = {
.sin6.sin6_family = AF_INET6,
#ifdef HAVE_SA_LEN
.sin6_len = sizeof (addr),
.sin6.sin6_len = sizeof (addr),
#endif
.sin6_addr = in6addr_loopback,
.sin6.sin6_addr = in6addr_loopback,
};
socklen_t addrlen = sizeof (addr);
socklen_t addrlen = sizeof (addr.sin6);
if (bind(fd, (struct sockaddr *)&addr, addrlen)
|| getsockname(fd, (struct sockaddr *)&addr, &addrlen))
if (bind(fd, &addr.sa, addrlen)
|| getsockname(fd, &addr.sa, &addrlen))
{
vlc_close(fd);
return -1;
}
*port = ntohs(addr.sin6_port);
*port = ntohs(addr.sin6.sin6_port);
return fd;
}
......
......@@ -551,25 +551,25 @@ vlc_smb2_print_addr(stream_t *access)
{
struct access_sys *sys = access->p_sys;
struct sockaddr_storage addr;
if (getsockname(smb2_get_fd(sys->smb2), (struct sockaddr *)&addr,
&(socklen_t){ sizeof(addr) }) != 0)
vlc_sockaddr addr;
if (getsockname(smb2_get_fd(sys->smb2), &addr.sa,
&(socklen_t){ sizeof(addr.ss) }) != 0)
return;
void *sin_addr;
switch (addr.ss_family)
const void *sin_addr;
switch (addr.ss.ss_family)
{
case AF_INET6:
sin_addr = &((struct sockaddr_in6 *)&addr)->sin6_addr;
sin_addr = &addr.sin6.sin6_addr;
break;
case AF_INET:
sin_addr = &((struct sockaddr_in *)&addr)->sin_addr;
sin_addr = &addr.sin.sin_addr;
break;
default:
return;
}
char ip[INET6_ADDRSTRLEN];
if (inet_ntop(addr.ss_family, sin_addr, ip, sizeof(ip)) == NULL)
if (inet_ntop(addr.ss.ss_family, sin_addr, ip, sizeof(ip)) == NULL)
return;
if (strcmp(ip, sys->encoded_url.psz_host) == 0)
......
......@@ -202,11 +202,10 @@ static void *Master(void *handle)
continue;
/* We received something */
struct sockaddr_storage from;
socklen_t fromlen = sizeof (from);
vlc_sockaddr from;
socklen_t fromlen = sizeof (from.ss);
if (recvfrom(sys->fd, data, 8, 0,
(struct sockaddr *)&from, &fromlen) < 8)
if (recvfrom(sys->fd, data, 8, 0, &from.sa, &fromlen) < 8)
continue;
vlc_tick_t master_system = GetPcrSystem(sys->input);
......@@ -217,8 +216,7 @@ static void *Master(void *handle)
data[1] = hton64(master_system);
/* Reply to the sender */
sendto(sys->fd, data, 16, 0,
(struct sockaddr *)&from, fromlen);
sendto(sys->fd, data, 16, 0, &from.sa, fromlen);
#if 0
/* not sure we need the client information to sync,
since we are the master anyway */
......
......@@ -30,6 +30,7 @@
#include <vlc_modules.h>
#include <vlc_services_discovery.h>
#include <vlc_renderer_discovery.h>
#include <vlc_network.h>
#import <Foundation/Foundation.h>
#import <arpa/inet.h>
......@@ -130,24 +131,18 @@ static NSString * ipAddressAsStringForData(NSData * data)
return returnValue;
}
typedef union {
struct sockaddr sa;
struct sockaddr_in ipv4;
struct sockaddr_in6 ipv6;
} ip_socket_address;
ip_socket_address *socketAddress = (ip_socket_address *)[data bytes];
const vlc_sockaddr *socketAddress = (const vlc_sockaddr *)[data bytes];
if (socketAddress) {
const char *addressStr = NULL;
if (socketAddress->sa.sa_family == AF_INET) {
addressStr = inet_ntop(socketAddress->sa.sa_family,
(void *)&(socketAddress->ipv4.sin_addr),
&(socketAddress->sin.sin_addr),
addressBuffer,
sizeof(addressBuffer));
} else if (socketAddress->sa.sa_family == AF_INET6) {
addressStr = inet_ntop(socketAddress->sa.sa_family,
(void *)&(socketAddress->ipv6.sin6_addr),
&(socketAddress->sin6.sin6_addr),
addressBuffer,
sizeof(addressBuffer));
}
......
......@@ -733,7 +733,7 @@ char *SDPGenerate( sout_stream_t *p_stream, const char *rtsp_url )
{
sout_stream_sys_t *p_sys = p_stream->p_sys;
struct vlc_memstream sdp;
struct sockaddr_storage dst;
vlc_sockaddr dst;
char *psz_sdp = NULL;
socklen_t dstlen;
int i;
......@@ -763,13 +763,11 @@ char *SDPGenerate( sout_stream_t *p_stream, const char *rtsp_url )
inclport = true;
/* Oh boy, this is really ugly! */
dstlen = sizeof( dst );
dstlen = sizeof( dst.ss );
if( p_sys->es[0]->listen.fd != NULL )
getsockname( p_sys->es[0]->listen.fd[0],
(struct sockaddr *)&dst, &dstlen );
getsockname( p_sys->es[0]->listen.fd[0], &dst.sa, &dstlen );
else
getpeername( p_sys->es[0]->sinkv[0].rtp_fd,
(struct sockaddr *)&dst, &dstlen );
getpeername( p_sys->es[0]->sinkv[0].rtp_fd, &dst.sa, &dstlen );
}
else
{
......@@ -783,14 +781,14 @@ char *SDPGenerate( sout_stream_t *p_stream, const char *rtsp_url )
dstlen = ipv6 ? sizeof( struct sockaddr_in6 )
: sizeof( struct sockaddr_in );
memset (&dst, 0, dstlen);
dst.ss_family = ipv6 ? AF_INET6 : AF_INET;
dst.ss.ss_family = ipv6 ? AF_INET6 : AF_INET;
#ifdef HAVE_SA_LEN
dst.ss_len = dstlen;
dst.ss.ss_len = dstlen;
#endif
}
if( vlc_sdp_Start( &sdp, VLC_OBJECT( p_stream ), SOUT_CFG_PREFIX,
NULL, 0, (struct sockaddr *)&dst, dstlen ) )
NULL, 0, &dst.sa, dstlen ) )
goto out;
/* TODO: a=source-filter */
......
......@@ -83,31 +83,27 @@ static void Flush(sout_stream_t *stream, void *id)
static session_descriptor_t *CreateSDP(vlc_object_t *obj, int fd)
{
union {
struct sockaddr addr;
struct sockaddr_in in;
struct sockaddr_in6 in6;
} src, dst;
vlc_sockaddr src, dst;
socklen_t srclen = sizeof (srclen), dstlen = sizeof (dst);
char dhost[INET6_ADDRSTRLEN];
unsigned short dport;
if (getsockname(fd, &src.addr, &srclen)
|| getpeername(fd, &dst.addr, &dstlen)) {
if (getsockname(fd, &src.sa, &srclen)
|| getpeername(fd, &dst.sa, &dstlen)) {
int val = errno;
msg_Err(obj, "cannot format SDP: %s", vlc_strerror_c(val));
return NULL;
}
switch (dst.addr.sa_family) {
switch (dst.sa.sa_family) {
case AF_INET:
inet_ntop(AF_INET, &dst.in.sin_addr, dhost, sizeof (dhost));
dport = dst.in.sin_port;
inet_ntop(AF_INET, &dst.sin.sin_addr, dhost, sizeof (dhost));
dport = dst.sin.sin_port;
break;
case AF_INET6:
inet_ntop(AF_INET6, &dst.in6.sin6_addr, dhost, sizeof (dhost));
dport = dst.in6.sin6_port;
inet_ntop(AF_INET6, &dst.sin6.sin6_addr, dhost, sizeof (dhost));
dport = dst.sin6.sin6_port;
break;
default:
return NULL;
......@@ -116,7 +112,7 @@ static session_descriptor_t *CreateSDP(vlc_object_t *obj, int fd)
struct vlc_memstream sdp;
if (vlc_sdp_Start(&sdp, obj, SOUT_CFG_PREFIX,
&src.addr, srclen, &dst.addr, dstlen))
&src.sa, srclen, &dst.sa, dstlen))
return NULL;
vlc_memstream_printf(&sdp, "m=video %d udp mpeg\r\n", ntohs(dport));
......
......@@ -118,21 +118,16 @@ static int net_SetupDgramSocket (vlc_object_t *p_obj, int fd,
if (net_SockAddrIsMulticast (ptr->ai_addr, ptr->ai_addrlen))
{
union
{
struct sockaddr a;
struct sockaddr_in in;
struct sockaddr_in6 in6;
} dumb = {
vlc_sockaddr dumb = {
{ .sa_family = ptr->ai_addr->sa_family, },
};
static_assert (offsetof (struct sockaddr_in, sin_port) ==
offsetof (struct sockaddr_in6, sin6_port), "Mismatch");
assert(ptr->ai_addrlen <= sizeof (dumb));
memcpy(&dumb.in6.sin6_port, ((unsigned char *)ptr->ai_addr)
memcpy(&dumb.sin6.sin6_port, ((unsigned char *)ptr->ai_addr)
+ offsetof (struct sockaddr_in, sin_port), 2);
bind(fd, &dumb.a, ptr->ai_addrlen);
bind(fd, &dumb.sa, ptr->ai_addrlen);
}
else
#endif
......@@ -502,20 +497,14 @@ static int net_Subscribe(vlc_object_t *obj, int fd,
static int net_SetDSCP( int fd, uint8_t dscp )
{
union {
struct sockaddr a;
struct sockaddr_in in;
#ifdef IPV6_TCLASS
struct sockaddr_in in6;
#endif
} addr;
vlc_sockaddr addr;
if (getsockname(fd, &addr.a, &(socklen_t){ sizeof (addr) }))
if (getsockname(fd, &addr.sa, &(socklen_t){ sizeof (addr) }))
return -1;
int level, cmd;
switch (addr.a.sa_family)
switch (addr.sa.sa_family)
{
#ifdef IPV6_TCLASS
case AF_INET6:
......
......@@ -160,18 +160,17 @@ makeaddrinfo (int af, int type, int proto,
static struct addrinfo *
makeipv4info (int type, int proto, u_long ip, u_short port, const char *name)
{
struct sockaddr_in addr;
vlc_sockaddr addr = {0};
memset (&addr, 0, sizeof (addr));
addr.sin_family = AF_INET;
addr.sin.sin_family = AF_INET;
# ifdef HAVE_SA_LEN
addr.sin_len = sizeof (addr);
addr.sin.sin_len = sizeof (addr.sin);
# endif
addr.sin_port = port;
addr.sin_addr.s_addr = ip;
addr.sin.sin_port = port;
addr.sin.sin_addr.s_addr = ip;
return makeaddrinfo (AF_INET, type, proto,
(struct sockaddr*)&addr, sizeof (addr), name);
&addr.sa, sizeof (addr.sin), name);
}
/*
......
......@@ -63,11 +63,7 @@ typedef struct sap_address_t
vlc_cond_t wait;
char group[NI_MAXNUMERICHOST];
union {
struct sockaddr a;
struct sockaddr_in in;
struct sockaddr_in6 in6;
} orig;
vlc_sockaddr orig;
socklen_t origlen;
int fd;
unsigned interval;
......@@ -101,7 +97,7 @@ static sap_address_t *AddressCreate (vlc_object_t *obj, const char *group)
strlcpy (addr->group, group, sizeof (addr->group));
addr->fd = fd;
addr->origlen = sizeof (addr->orig);
getsockname(fd, &addr->orig.a, &addr->origlen);
getsockname(fd, &addr->orig.sa, &addr->origlen);
addr->interval = var_CreateGetInteger (obj, "sap-interval");
vlc_cond_init (&addr->wait);
......@@ -165,12 +161,7 @@ sout_AnnounceRegisterSDP (vlc_object_t *obj, const char *sdp,
{
int i;
char psz_addr[NI_MAXNUMERICHOST];
union
{
struct sockaddr a;
struct sockaddr_in in;
struct sockaddr_in6 in6;
} addr;
vlc_sockaddr addr;
socklen_t addrlen = 0;
struct addrinfo *res;
......@@ -191,13 +182,13 @@ sout_AnnounceRegisterSDP (vlc_object_t *obj, const char *sdp,
}
/* Determine SAP multicast address automatically */
switch (addr.a.sa_family)
switch (addr.sa.sa_family)
{
#if defined (HAVE_INET_PTON) || defined (_WIN32)
case AF_INET6:
{
/* See RFC3513 for list of valid IPv6 scopes */
struct in6_addr *a6 = &addr.in6.sin6_addr;
struct in6_addr *a6 = &addr.sin6.sin6_addr;
memcpy( a6->s6_addr + 2, "\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x02\x7f\xfe", 14 );
......@@ -214,7 +205,7 @@ sout_AnnounceRegisterSDP (vlc_object_t *obj, const char *sdp,
case AF_INET:
{
/* See RFC2365 for IPv4 scopes */
uint32_t ipv4 = addr.in.sin_addr.s_addr;
uint32_t ipv4 = addr.sin.sin_addr.s_addr;
/* 224.0.0.0/24 => 224.0.0.255 */
if ((ipv4 & htonl (0xffffff00)) == htonl (0xe0000000))
......@@ -241,17 +232,17 @@ sout_AnnounceRegisterSDP (vlc_object_t *obj, const char *sdp,
return NULL;
}
addr.in.sin_addr.s_addr = ipv4;
addr.sin.sin_addr.s_addr = ipv4;
break;
}
default:
msg_Err (obj, "Address family %u not supported by SAP",
(unsigned)addr.a.sa_family);
(unsigned)addr.sa.sa_family);
return NULL;
}
i = vlc_getnameinfo( &addr.a, addrlen,
i = vlc_getnameinfo( &addr.sa, addrlen,
psz_addr, sizeof( psz_addr ), NULL, NI_NUMERICHOST );
if( i )
......@@ -289,26 +280,26 @@ matched:
/* SAPv1, not encrypted, not compressed */
uint8_t flags = 0x20;
#ifdef AF_INET6
if (sap_addr->orig.a.sa_family == AF_INET6)
if (sap_addr->orig.sa.sa_family == AF_INET6)
flags |= 0x10;
#endif
vlc_memstream_putc(&stream, flags);
vlc_memstream_putc(&stream, 0x00); /* No authentication length */
vlc_memstream_write(&stream, &(uint16_t){ vlc_tick_now() }, 2); /* ID hash */
switch (sap_addr->orig.a.sa_family)
switch (sap_addr->orig.sa.sa_family)
{
#ifdef AF_INET6
case AF_INET6:
{
const struct in6_addr *a6 = &sap_addr->orig.in6.sin6_addr;
const struct in6_addr *a6 = &sap_addr->orig.sin6.sin6_addr;
vlc_memstream_write(&stream, a6, 16);
break;
}
#endif
case AF_INET:
{
const struct in_addr *a4 = &sap_addr->orig.in.sin_addr;
const struct in_addr *a4 = &sap_addr->orig.sin.sin_addr;
vlc_memstream_write(&stream, a4, 4);
break;
}
......