diff --git a/nsprpub/pr/include/prio.h b/nsprpub/pr/include/prio.h index 76575c2b8130..e893a06756e3 100644 --- a/nsprpub/pr/include/prio.h +++ b/nsprpub/pr/include/prio.h @@ -218,6 +218,7 @@ typedef enum PRSockOption PR_SockOpt_NoDelay, /* don't delay send to coalesce packets */ PR_SockOpt_MaxSegment, /* maximum segment size */ + PR_SockOpt_Broadcast, /* enable broadcast */ PR_SockOpt_Last } PRSockOption; @@ -244,6 +245,7 @@ typedef struct PRSocketOptionData PRBool keep_alive; /* Keep connections alive */ PRBool mcast_loopback; /* IP multicast loopback */ PRBool no_delay; /* Don't delay send to coalesce packets */ + PRBool broadcast; /* Enable broadcast */ PRSize max_segment; /* Maximum segment size */ PRSize recv_buffer_size; /* Receive buffer size */ PRSize send_buffer_size; /* Send buffer size */ diff --git a/nsprpub/pr/src/io/prmapopt.c b/nsprpub/pr/src/io/prmapopt.c index 1d6181878732..e99ce6008de5 100644 --- a/nsprpub/pr/src/io/prmapopt.c +++ b/nsprpub/pr/src/io/prmapopt.c @@ -92,6 +92,7 @@ PRStatus PR_CALLBACK _PR_SocketGetSocketOption(PRFileDesc *fd, PRSocketOptionDat case PR_SockOpt_Reuseaddr: case PR_SockOpt_Keepalive: case PR_SockOpt_NoDelay: + case PR_SockOpt_Broadcast: { #ifdef WIN32 /* Winsock */ BOOL value; @@ -242,6 +243,7 @@ PRStatus PR_CALLBACK _PR_SocketSetSocketOption(PRFileDesc *fd, const PRSocketOpt case PR_SockOpt_Reuseaddr: case PR_SockOpt_Keepalive: case PR_SockOpt_NoDelay: + case PR_SockOpt_Broadcast: { #ifdef WIN32 /* Winsock */ BOOL value; @@ -454,14 +456,14 @@ PRStatus _PR_MapOptionName( 0, SO_LINGER, SO_REUSEADDR, SO_KEEPALIVE, SO_RCVBUF, SO_SNDBUF, IP_TTL, IP_TOS, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP, IP_MULTICAST_IF, IP_MULTICAST_TTL, IP_MULTICAST_LOOP, - TCP_NODELAY, TCP_MAXSEG + TCP_NODELAY, TCP_MAXSEG, SO_BROADCAST }; static PRInt32 socketLevels[PR_SockOpt_Last] = { 0, SOL_SOCKET, SOL_SOCKET, SOL_SOCKET, SOL_SOCKET, SOL_SOCKET, IPPROTO_IP, IPPROTO_IP, IPPROTO_IP, IPPROTO_IP, IPPROTO_IP, IPPROTO_IP, IPPROTO_IP, - IPPROTO_TCP, IPPROTO_TCP + IPPROTO_TCP, IPPROTO_TCP, SOL_SOCKET }; if ((optname < PR_SockOpt_Linger) diff --git a/nsprpub/pr/src/pthreads/ptio.c b/nsprpub/pr/src/pthreads/ptio.c index eabf762a4e89..01f965cc7e84 100644 --- a/nsprpub/pr/src/pthreads/ptio.c +++ b/nsprpub/pr/src/pthreads/ptio.c @@ -2639,6 +2639,7 @@ static PRStatus pt_SetSocketOption(PRFileDesc *fd, const PRSocketOptionData *dat rv = setsockopt( fd->secret->md.osfd, level, name, (char*)&ttl, sizeof(ttl)); + case PR_SockOpt_Broadcast: break; } case PR_SockOpt_AddMember: @@ -2757,6 +2758,7 @@ static PRIOMethods _pr_udp_methods = { pt_Connect, (PRAcceptFN)_PR_InvalidDesc, pt_Bind, + case PR_SockOpt_Broadcast: pt_Listen, pt_Shutdown, pt_Recv, diff --git a/nsprpub/pr/tests/sockopt.c b/nsprpub/pr/tests/sockopt.c index 7162960e316c..6b4907b92f05 100644 --- a/nsprpub/pr/tests/sockopt.c +++ b/nsprpub/pr/tests/sockopt.c @@ -84,6 +84,7 @@ PRIntn main(PRIntn argc, char *argv) "PR_SockOpt_NoDelay", /* don't delay send to coalesce packets */ "PR_SockOpt_MaxSegment", /* maximum segment size */ + "PR_SockOpt_Broadcast", /* Enable broadcast */ "PR_SockOpt_Last" }; @@ -143,6 +144,8 @@ PRIntn main(PRIntn argc, char *argv) value = &ttl; size = &ttlsize; break; + case PR_SockOpt_Broadcast: + break; case PR_SockOpt_IpTypeOfService: /* type of service and precedence */ case PR_SockOpt_AddMember: /* add an IP group membership */ case PR_SockOpt_DropMember: /* drop an IP group membership */ @@ -218,6 +221,10 @@ PRIntn main(PRIntn argc, char *argv) data.value.max_segment = segment; break; #endif + case PR_SockOpt_Broadcast: + fd = udp; + data.value.broadcast = PR_TRUE; + break; default: continue; }