RFC-0099:引入“zx_socket_set_disposition” | |
---|---|
状态 | 已接受 |
领域 |
|
说明 | 引入 `zx_socket_set_disposition`,以将 `zx_socket_off` 替换为可逆转的操作。 |
问题 | |
Gerrit 更改 | |
作者 | |
审核人 | |
提交日期(年-月-日) | 2021-05-06 |
审核日期(年-月-日) | 2021-06-03 |
摘要
引入了 zx_socket_set_disposition
以取代 zx_socket_shutdown
。新的
系统调用通过允许逆转关闭操作来扩展旧调用。
引入 ZX_RIGHT_MANAGE_SOCKET
,并在新的系统调用中要求使用它。最近
通过 zx_socket_create
创建的标识名将拥有此权限。
设计初衷
用可逆操作替换关停的动机
我们在 fdio 中有一个精心设计的状态机来应对 未连接的流网络套接字不应接受写入。状态机 具有本地状态,该状态很难传播到 进程和远程状态(Zircon 套接字上的用户信号), 驱动本地状态。这些体操很有必要 因此必须防止其通过外部 直到它们“建立联系”为止(也通过外部方式)。
要求新权利的动机
现在关闭 Zircon 套接字过于宽松。由于 Zircon 套接字 可以(并且实际上正在)克隆 权限可以改变所有句柄的套接字状态。这一问题 从而造成更严重的后果。
总结
用可逆操作替换套接字关闭,同时禁止 由非特权句柄启动,因此允许网络堆栈实现 完全驱动套接字状态
套接字可在提供给客户端之前,先关闭,删除 在 fdio 中需要上述状态跟踪。
套接字关闭可由网络堆栈完全中介,由客户端启动 FIDL 调用,消除目前存在的竞态条件(例如, https://fxbug.dev/42140031).
设计
在 FIDL 中定义 ZX_RIGHT_MANAGE_SOCKET
:
扩展 bits rights
:
library zx;
bits rights : uint32 {
MANAGE_SOCKET = 0x00100000;
};
rights.md 中的文档 ZX_RIGHT_MANAGE_SOCKET
:
附加到表:
右 | 授予的权限 |
---|---|
ZX_RIGHT_MANAGE_SOCKET | 允许通过 zx_socket_set_disposition 更改套接字处置方式 |
在 FIDL 中定义 zx_socket_set_disposition
添加到 protocol socket
:
library zx;
protocol socket {
/// Set disposition of writes.
socket_set_disposition(handle:<SOCKET, rights.MANAGE_SOCKET> handle, uint32 disposition, uint32 disposition_peer) -> (status status);
}
在 /reference/syscalls/socket_set_disposition.md
中记录 zx_socket_set_disposition
说明
zx_socket_set_disposition
设置
调用套接字句柄及其对等方的 zx_socket_write
。
可以使用的有效处置标志:
ZX_SOCKET_DISPOSITION_WRITE_DISABLED - 为指定的 套接字端点。设置后,对指定套接字端点的写入将失败 ZX_ERR_BAD_STATE。如果从指定套接字端点读取 成功,直至指定套接字端点中缓冲的所有数据全部使用完毕; 失败并显示 ZX_ERR_BAD_STATE。
ZX_SOCKET_DISPOSITION_WRITE_ENABLED - 为指定的
套接字端点。设置后,向指定的套接字执行读写操作
端点的行为方式与 zx_socket_write
中指定的方式相同,
zx_socket_read
。
在套接字上指定 ZX_SOCKET_DISPOSITION_WRITE_ENABLED 无效
包含已缓冲数据的端点;将会导致
zx_socket_set_disposition
返回 ZX_ERR_BAD_STATE,并且没有任何操作
。
同时指定 ZX_SOCKET_DISPOSITION_WRITE_DISABLED 和
disposition 或 disposition_peer 中的 ZX_SOCKET_DISPOSITION_WRITE_ENABLED;
否则会导致 zx_socket_set_disposition
返回
ZX_ERR_INVALID_ARGS,并且未执行任何操作。
转化价值
zx_socket_set_disposition()
在成功时返回 ZX_OK。
错误
ZX_ERR_BAD_HANDLE handle 不是有效的句柄。
ZX_ERR_BAD_STATE disposition 或 disposition_peer 包含 ZX_SOCKET_DISPOSITION_WRITE_ENABLED 和 handle 表示具有 指定套接字端点上已缓冲的数据。
ZX_ERR_WRONG_TYPE handle 不是套接字句柄。
ZX_ERR_ACCESS_DENIED 句柄没有 ZX_ERR_ACCESS_DENIED。
ZX_ERR_INVALID_ARGS disposition 或 disposition_peer 包含标志 或标志组合无效。
Migration
实现后,现有的 zx_socket_shutdown
用法将被替换为
对 zx_socket_set_disposition
的等效调用。进行必要的 ABI 转换后
完成后,系统会移除“zx_socket_shutdown
”及其关联的选项。
实现
应完全可在套接字调度程序内实现。
性能
此更改对效果没有实质性影响。
工效学设计
此变化对人体工程学没有任何实质性的影响。
向后兼容性
此更改是向后兼容的,因为不使用新 API 的客户端 不会受到任何影响
安全注意事项
此变更可以简化 fdio 代码,从而提高安全性。这个 否则不会对安全性产生实质性影响。
隐私注意事项
此变更对隐私权没有任何实质性影响。
测试
将使用系统调用的单元测试来测试此功能,并将 经过测试的 fdio 状态机的部件上,
文档
zx_socket_write
和zx_socket_read
将
已更新为引用 zx_socket_set_disposition
,而不是
zx_socket_shutdown
。
其他文档将如“实现”部分中所述进行更新。
缺点、替代方案和未知问题
可以在 zx_socket_shutdown
中添加一个新标志,用于实现以下目的:
允许其行为被反转。这种方法的优势在于
引入一个新词(性态),但该词语并不能很好地
行为继续使用 zx_socket_shutdown
的主要缺点是
它接受的标志不直观;“ZX_SOCKET_SHUTDOWN_READ
”没有
按照表的说明执行(它禁止对等写入,而不是禁止
读取)。
“取消关闭”的行为被指定为在数据存在时产生错误 向套接字传递指定方向另一种选择是 操作成功我们选择了更严格的选项, 从而防止出现意想不到的后果
您可以使用现有权限,而无需创建新的权限。一份问卷调查, 现有权利表明,不存在适合此项用途的现有权利 这种情况。
仅凭这种设计无法完全解决数据流的状态传播问题 套接字。该方案的替代方案是一种更全面的方法, 旨在彻底消除 fdio 流套接字状态机。这种 那么提案中就必须包含该提案
先验技术和参考资料
流套接字语义实际上由它们在其他 操作系统中,需要区分已连接的套接字和 就会出现未连接的情况。