Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(680)

Unified Diff: content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc

Issue 704133005: Pepper: Add support for multicast in PPB_UDPSocket API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Check for dev channel and permissions for Multicast membership Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..5d26cb7dc9e8b9e808df585e43f052dee43e085f 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: {
bbudge 2015/03/05 22:02:17 check permissions
+ 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_)
+ 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: {
bbudge 2015/03/05 22:02:17 check permissions
+ 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_)
+ 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,51 @@ 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);
+
+ SocketPermissionRequest request =
+ pepper_socket_utils::CreateSocketPermissionRequest(
+ SocketPermissionRequest::UDP_MULTICAST_MEMBERSHIP, addr);
bbudge 2015/03/05 22:02:18 Nice.
+ if (!pepper_socket_utils::CanUseSocketAPIs(external_plugin_,
+ private_api_,
+ &request,
+ render_process_id_,
+ render_frame_id_)) {
+ return PP_ERROR_NOACCESS;
+ }
bbudge 2015/03/05 22:02:18 First, you should use your new IsPluginAllowedToUs
+
+ if (!socket_)
+ return PP_ERROR_FAILED;
+
+ net::IPAddressNumber group;
+ uint16 port;
+
+ if (!NetAddressPrivateImpl::NetAddressToIPEndPoint(addr, &group, &port))
+ return PP_ERROR_ADDRESS_INVALID;
+
+ return NetErrorToPepperError(socket_->JoinGroup(group));
+}
+
+int32_t PepperUDPSocketMessageFilter::OnMsgLeaveGroup(
+ const ppapi::host::HostMessageContext* context,
+ const PP_NetAddress_Private& addr) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
bbudge 2015/03/05 22:02:17 check permissions
+
+ if (!socket_)
+ 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 +429,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);

Powered by Google App Engine
This is Rietveld 408576698