server: accept UVC probe on mismatched iface
This commit is contained in:
parent
f043634ce2
commit
83f2aac696
@ -349,7 +349,8 @@ fn handle_setup(
|
|||||||
) {
|
) {
|
||||||
let interface_lo = (req.w_index & 0xff) as u8;
|
let interface_lo = (req.w_index & 0xff) as u8;
|
||||||
let interface_hi = (req.w_index >> 8) as u8;
|
let interface_hi = (req.w_index >> 8) as u8;
|
||||||
let interface = if interface_lo == interfaces.streaming || interface_lo == interfaces.control {
|
let interface_raw = if interface_lo == interfaces.streaming || interface_lo == interfaces.control
|
||||||
|
{
|
||||||
interface_lo
|
interface_lo
|
||||||
} else if interface_hi == interfaces.streaming || interface_hi == interfaces.control {
|
} else if interface_hi == interfaces.streaming || interface_hi == interfaces.control {
|
||||||
interface_hi
|
interface_hi
|
||||||
@ -358,6 +359,7 @@ fn handle_setup(
|
|||||||
};
|
};
|
||||||
let selector = (req.w_value >> 8) as u8;
|
let selector = (req.w_value >> 8) as u8;
|
||||||
let is_in = (req.b_request_type & USB_DIR_IN) != 0;
|
let is_in = (req.b_request_type & USB_DIR_IN) != 0;
|
||||||
|
let interface = map_interface(interface_raw, selector, interfaces, debug);
|
||||||
|
|
||||||
if !is_in && req.b_request == UVC_SET_CUR {
|
if !is_in && req.b_request == UVC_SET_CUR {
|
||||||
if interface != interfaces.streaming {
|
if interface != interfaces.streaming {
|
||||||
@ -382,8 +384,14 @@ fn handle_setup(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let payload =
|
let payload = build_in_response(
|
||||||
build_in_response(state, interfaces, interface, selector, req.b_request, req.w_length);
|
state,
|
||||||
|
interfaces,
|
||||||
|
interface,
|
||||||
|
selector,
|
||||||
|
req.b_request,
|
||||||
|
req.w_length,
|
||||||
|
);
|
||||||
match payload {
|
match payload {
|
||||||
Some(bytes) => {
|
Some(bytes) => {
|
||||||
let _ = send_response(fd, uvc_send_response, &bytes);
|
let _ = send_response(fd, uvc_send_response, &bytes);
|
||||||
@ -394,6 +402,29 @@ fn handle_setup(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn map_interface(raw: u8, selector: u8, interfaces: UvcInterfaces, debug: bool) -> u8 {
|
||||||
|
if raw == interfaces.streaming || raw == interfaces.control {
|
||||||
|
return raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mapped = if matches!(selector, UVC_VS_PROBE_CONTROL | UVC_VS_COMMIT_CONTROL) {
|
||||||
|
interfaces.streaming
|
||||||
|
} else if selector == UVC_VC_REQUEST_ERROR_CODE_CONTROL {
|
||||||
|
interfaces.control
|
||||||
|
} else {
|
||||||
|
raw
|
||||||
|
};
|
||||||
|
|
||||||
|
if debug && mapped != raw {
|
||||||
|
eprintln!(
|
||||||
|
"[lesavka-uvc] remapped interface {} -> {} for selector {selector}",
|
||||||
|
raw, mapped
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
mapped
|
||||||
|
}
|
||||||
|
|
||||||
fn handle_data(
|
fn handle_data(
|
||||||
state: &mut UvcState,
|
state: &mut UvcState,
|
||||||
pending: &mut Option<PendingRequest>,
|
pending: &mut Option<PendingRequest>,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user