| Index: content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
|
| diff --git a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
|
| index 50221d9222c4f7dfe3e7f2c87e3218020c864d48..205df3abe57c94cd46f9de199ea793da8630457a 100644
|
| --- a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
|
| +++ b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
|
| @@ -60,6 +60,7 @@ PepperUDPSocketMessageFilter::PepperUDPSocketMessageFilter(
|
| : socket_options_(0),
|
| rcvbuf_size_(0),
|
| sndbuf_size_(0),
|
| + multicast_ttl_(0),
|
| closed_(false),
|
| remaining_recv_slots_(UDPSocketResourceBase::kPluginReceiveBufferSlots),
|
| external_plugin_(host->external_plugin()),
|
| @@ -95,6 +96,8 @@ PepperUDPSocketMessageFilter::OverrideTaskRunnerForMessage(
|
| return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO);
|
| case PpapiHostMsg_UDPSocket_Bind::ID:
|
| case PpapiHostMsg_UDPSocket_SendTo::ID:
|
| + case PpapiHostMsg_UDPSocket_JoinGroup::ID:
|
| + case PpapiHostMsg_UDPSocket_LeaveGroup::ID:
|
| return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI);
|
| }
|
| return NULL;
|
| @@ -113,6 +116,10 @@ int32_t PepperUDPSocketMessageFilter::OnResourceMessageReceived(
|
| OnMsgClose)
|
| PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(
|
| PpapiHostMsg_UDPSocket_RecvSlotAvailable, OnMsgRecvSlotAvailable)
|
| + PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_UDPSocket_JoinGroup,
|
| + OnMsgJoinGroup)
|
| + PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_UDPSocket_LeaveGroup,
|
| + OnMsgLeaveGroup)
|
| PPAPI_END_MESSAGE_MAP()
|
| return PP_ERROR_FAILED;
|
| }
|
| @@ -151,7 +158,7 @@ int32_t PepperUDPSocketMessageFilter::OnMsgSetOption(
|
| if (!value.GetBool(&boolean_value))
|
| return PP_ERROR_BADARGUMENT;
|
|
|
| - // If the socket is already connected, proxy the value to TCPSocket.
|
| + // If the socket is already bound, proxy the value to UDPSocket.
|
| if (socket_.get())
|
| return NetErrorToPepperError(socket_->SetBroadcast(boolean_value));
|
|
|
| @@ -171,7 +178,7 @@ int32_t PepperUDPSocketMessageFilter::OnMsgSetOption(
|
| ppapi::proxy::UDPSocketResourceBase::kMaxSendBufferSize)
|
| return PP_ERROR_BADARGUMENT;
|
|
|
| - // If the socket is already connected, proxy the value to UDPSocket.
|
| + // If the socket is already bound, proxy the value to UDPSocket.
|
| if (socket_.get()) {
|
| return NetErrorToPepperError(
|
| socket_->SetSendBufferSize(integer_value));
|
| @@ -190,7 +197,7 @@ int32_t PepperUDPSocketMessageFilter::OnMsgSetOption(
|
| ppapi::proxy::UDPSocketResourceBase::kMaxReceiveBufferSize)
|
| return PP_ERROR_BADARGUMENT;
|
|
|
| - // If the socket is already connected, proxy the value to UDPSocket.
|
| + // If the socket is already bound, proxy the value to UDPSocket.
|
| if (socket_.get()) {
|
| return NetErrorToPepperError(
|
| socket_->SetReceiveBufferSize(integer_value));
|
| @@ -201,6 +208,40 @@ int32_t PepperUDPSocketMessageFilter::OnMsgSetOption(
|
| rcvbuf_size_ = integer_value;
|
| return PP_OK;
|
| }
|
| + case PP_UDPSOCKET_OPTION_MULTICAST_LOOP: {
|
| + bool boolean_value = false;
|
| + if (!value.GetBool(&boolean_value))
|
| + return PP_ERROR_BADARGUMENT;
|
| +
|
| + // If the socket is already bound, proxy the value to UDPSocket.
|
| + if (socket_.get())
|
| + return NetErrorToPepperError(
|
| + socket_->SetMulticastLoopbackMode(boolean_value));
|
| +
|
| + // UDPSocket instance is not yet created, so remember the value here.
|
| + if (boolean_value) {
|
| + socket_options_ |= SOCKET_OPTION_MULTICAST_LOOP;
|
| + } else {
|
| + socket_options_ &= ~SOCKET_OPTION_MULTICAST_LOOP;
|
| + }
|
| + return PP_OK;
|
| + }
|
| + case PP_UDPSOCKET_OPTION_MULTICAST_TTL: {
|
| + int32_t integer_value = 0;
|
| + if (!value.GetInt32(&integer_value) ||
|
| + integer_value < 0 || integer_value > 255)
|
| + return PP_ERROR_BADARGUMENT;
|
| +
|
| + // If the socket is already bound, proxy the value to UDPSocket.
|
| + if (socket_.get())
|
| + return NetErrorToPepperError(
|
| + socket_->SetMulticastTimeToLive(integer_value));
|
| +
|
| + // UDPSocket instance is not yet created, so remember the value here.
|
| + socket_options_ |= SOCKET_OPTION_MULTICAST_TTL;
|
| + multicast_ttl_ = integer_value;
|
| + return PP_OK;
|
| + }
|
| default: {
|
| NOTREACHED();
|
| return PP_ERROR_BADARGUMENT;
|
| @@ -286,6 +327,41 @@ int32_t PepperUDPSocketMessageFilter::OnMsgRecvSlotAvailable(
|
| return PP_OK;
|
| }
|
|
|
| +int32_t PepperUDPSocketMessageFilter::OnMsgJoinGroup(
|
| + const ppapi::host::HostMessageContext* context,
|
| + const PP_NetAddress_Private& addr) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| +
|
| + if (!socket_.get())
|
| + return PP_ERROR_FAILED;
|
| +
|
| + net::IPAddressNumber group;
|
| + uint16 port;
|
| +
|
| + if (!NetAddressPrivateImpl::NetAddressToIPEndPoint(addr, &group, &port))
|
| + return PP_ERROR_ADDRESS_INVALID;
|
| +
|
| + // TODO(etrunko) Check that app has multicast permission.
|
| + return NetErrorToPepperError(socket_->JoinGroup(group));
|
| +}
|
| +
|
| +int32_t PepperUDPSocketMessageFilter::OnMsgLeaveGroup(
|
| + const ppapi::host::HostMessageContext* context,
|
| + const PP_NetAddress_Private& addr) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| +
|
| + if (!socket_.get())
|
| + return PP_ERROR_FAILED;
|
| +
|
| + net::IPAddressNumber group;
|
| + uint16 port;
|
| +
|
| + if (!NetAddressPrivateImpl::NetAddressToIPEndPoint(addr, &group, &port))
|
| + return PP_ERROR_ADDRESS_INVALID;
|
| +
|
| + return NetErrorToPepperError(socket_->LeaveGroup(group));
|
| +}
|
| +
|
| void PepperUDPSocketMessageFilter::DoBind(
|
| const ppapi::host::ReplyMessageContext& context,
|
| const PP_NetAddress_Private& addr) {
|
| @@ -343,6 +419,20 @@ void PepperUDPSocketMessageFilter::DoBind(
|
| return;
|
| }
|
| }
|
| + if (socket_options_ & SOCKET_OPTION_MULTICAST_LOOP) {
|
| + int net_result = socket->SetMulticastLoopbackMode(true);
|
| + if (net_result != net::OK) {
|
| + SendBindError(context, NetErrorToPepperError(net_result));
|
| + return;
|
| + }
|
| + }
|
| + if (socket_options_ & SOCKET_OPTION_MULTICAST_TTL) {
|
| + int net_result = socket->SetMulticastInterface(multicast_ttl_);
|
| + if (net_result != net::OK) {
|
| + SendBindError(context, NetErrorToPepperError(net_result));
|
| + return;
|
| + }
|
| + }
|
|
|
| {
|
| int net_result = socket->Bind(end_point);
|
|
|