Index: ppapi/proxy/udp_socket_resource_base.cc |
diff --git a/ppapi/proxy/udp_socket_resource_base.cc b/ppapi/proxy/udp_socket_resource_base.cc |
index 521a6e2f4e284220d649e8d49934f503b6245127..7bdcab55d79d4c9ab202094511a94de40ad16c29 100644 |
--- a/ppapi/proxy/udp_socket_resource_base.cc |
+++ b/ppapi/proxy/udp_socket_resource_base.cc |
@@ -65,26 +65,65 @@ int32_t UDPSocketResourceBase::SetOptionImpl( |
if (closed_) |
return PP_ERROR_FAILED; |
- SocketOptionData option_data; |
+ // Check if socket is expected to be bound or not according to the option |
switch (name) { |
case PP_UDPSOCKET_OPTION_ADDRESS_REUSE: |
- case PP_UDPSOCKET_OPTION_BROADCAST: { |
+ case PP_UDPSOCKET_OPTION_BROADCAST: |
+ case PP_UDPSOCKET_OPTION_MULTICAST_LOOP: |
+ case PP_UDPSOCKET_OPTION_MULTICAST_TTL: |
+ case PP_UDPSOCKET_OPTION_MULTICAST_IF: { |
if (bound_) |
return PP_ERROR_FAILED; |
+ break; |
+ } |
+ case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE: |
+ case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: |
+ case PP_UDPSOCKET_OPTION_MULTICAST_JOIN: |
+ case PP_UDPSOCKET_OPTION_MULTICAST_LEAVE: { |
+ if (!bound_) |
+ return PP_ERROR_FAILED; |
+ break; |
+ } |
+ } |
+ |
+ SocketOptionData option_data; |
+ switch (name) { |
+ case PP_UDPSOCKET_OPTION_ADDRESS_REUSE: |
+ case PP_UDPSOCKET_OPTION_BROADCAST: { |
if (value.type != PP_VARTYPE_BOOL) |
return PP_ERROR_BADARGUMENT; |
option_data.SetBool(PP_ToBool(value.value.as_bool)); |
break; |
} |
case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE: |
- case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: { |
- if (!bound_) |
- return PP_ERROR_FAILED; |
+ case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: |
+ case PP_UDPSOCKET_OPTION_MULTICAST_IF: { |
if (value.type != PP_VARTYPE_INT32) |
return PP_ERROR_BADARGUMENT; |
option_data.SetInt32(value.value.as_int); |
break; |
} |
+ case PP_UDPSOCKET_OPTION_MULTICAST_LOOP: { |
+ if (value.type != PP_VARTYPE_BOOL) |
+ return PP_ERROR_BADARGUMENT; |
+ option_data.SetBool(PP_ToBool(value.value.as_bool)); |
+ break; |
+ } |
+ case PP_UDPSOCKET_OPTION_MULTICAST_TTL: { |
+ int32_t ival = value.value.as_int; |
+ if (value.type != PP_VARTYPE_INT32 && (ival < 0 || ival > 255)) |
+ return PP_ERROR_BADARGUMENT; |
+ option_data.SetInt32(ival); |
+ break; |
+ } |
+ case PP_UDPSOCKET_OPTION_MULTICAST_JOIN: |
+ case PP_UDPSOCKET_OPTION_MULTICAST_LEAVE: { |
+ if (value.type != PP_VARTYPE_RESOURCE) |
+ return PP_ERROR_BADARGUMENT; |
+ PP_Resource resource = static_cast<PP_Resource>(value.value.as_id); |
+ option_data.SetInt32(resource); |
+ break; |
+ } |
default: { |
NOTREACHED(); |
return PP_ERROR_BADARGUMENT; |