-
-
Notifications
You must be signed in to change notification settings - Fork 35k
bpo-31425: Expose AF_QIPCRTR in socket module #3706
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -193,6 +193,13 @@ created. Socket addresses are represented as follows: | |
| - *addr* - Optional bytes-like object specifying the hardware physical | ||
| address, whose interpretation depends on the device. | ||
|
|
||
| - :const:`AF_QIPCRTR` is a Linux-only socket based interface for communicating | ||
| with services running on co-processors in Qualcomm platforms. The address | ||
| family is represented as a ``(node, port)`` tuple where the *node* and *port* | ||
| are non-negative integers. | ||
|
|
||
| .. versionadded:: 3.7 | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This should be 3.8, not 3.7.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good catch! |
||
|
|
||
| If you use a hostname in the *host* portion of IPv4/v6 socket address, the | ||
| program may show a nondeterministic behavior, as Python uses the first address | ||
| returned from the DNS resolution. The socket address will be resolved | ||
|
|
@@ -481,6 +488,13 @@ Constants | |
| :const:`HCI_DATA_DIR` are not available for FreeBSD, NetBSD, or | ||
| DragonFlyBSD. | ||
|
|
||
| .. data:: AF_QIPCRTR | ||
|
|
||
| Constant for Qualcomm's IPC router protocol, used to communicate with | ||
| service providing remote processors. | ||
|
|
||
| Availability: Linux >= 4.7. | ||
|
|
||
| Functions | ||
| ^^^^^^^^^ | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| Add support for sockets of the AF_QIPCRTR address family, supported by the | ||
| Linux kernel. This is used to communicate with services, such as GPS or | ||
| radio, running on Qualcomm devices. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -7,8 +7,8 @@ This module provides an interface to Berkeley socket IPC. | |
| Limitations: | ||
|
|
||
| - Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a | ||
| portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported | ||
| under Linux. | ||
| portable manner, though AF_PACKET, AF_NETLINK, AF_QIPCRTR and AF_TIPC are | ||
|
serhiy-storchaka marked this conversation as resolved.
|
||
| supported under Linux. | ||
| - No read/write operations (use sendall/recv or makefile instead). | ||
| - Additional restrictions apply on some non-Unix platforms (compensated | ||
| for by socket.py). | ||
|
|
@@ -55,6 +55,8 @@ Module interface: | |
| the Ethernet protocol number to be received. For example: | ||
| ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple | ||
| specify packet-type and ha-type/addr. | ||
| - an AF_QIPCRTR socket address is a (node, port) tuple where the | ||
| node and port are non-negative integers. | ||
| - an AF_TIPC socket address is expressed as | ||
| (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of: | ||
| TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID; | ||
|
|
@@ -1293,6 +1295,14 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) | |
| } | ||
| #endif /* AF_NETLINK */ | ||
|
|
||
| #if defined(AF_QIPCRTR) | ||
| case AF_QIPCRTR: | ||
| { | ||
| struct sockaddr_qrtr *a = (struct sockaddr_qrtr *) addr; | ||
| return Py_BuildValue("II", a->sq_node, a->sq_port); | ||
| } | ||
| #endif /* AF_QIPCRTR */ | ||
|
|
||
| #if defined(AF_VSOCK) | ||
| case AF_VSOCK: | ||
| { | ||
|
|
@@ -1668,6 +1678,30 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, | |
| } | ||
| #endif /* AF_NETLINK */ | ||
|
|
||
| #if defined(AF_QIPCRTR) | ||
| case AF_QIPCRTR: | ||
| { | ||
| struct sockaddr_qrtr* addr; | ||
| unsigned int node, port; | ||
| addr = (struct sockaddr_qrtr *)addr_ret; | ||
| if (!PyTuple_Check(args)) { | ||
| PyErr_Format( | ||
| PyExc_TypeError, | ||
| "getsockaddrarg: " | ||
| "AF_QIPCRTR address must be tuple, not %.500s", | ||
| Py_TYPE(args)->tp_name); | ||
| return 0; | ||
| } | ||
| if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &node, &port)) | ||
| return 0; | ||
| addr->sq_family = AF_QIPCRTR; | ||
| addr->sq_node = node; | ||
| addr->sq_port = port; | ||
| *len_ret = sizeof(*addr); | ||
| return 1; | ||
| } | ||
| #endif /* AF_QIPCRTR */ | ||
|
|
||
| #if defined(AF_VSOCK) | ||
| case AF_VSOCK: | ||
| { | ||
|
|
@@ -2263,6 +2297,14 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) | |
| } | ||
| #endif /* AF_NETLINK */ | ||
|
|
||
| #if defined(AF_QIPCRTR) | ||
| case AF_QIPCRTR: | ||
| { | ||
| *len_ret = sizeof (struct sockaddr_qrtr); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. please remove the extra space after sizeof
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For the record, I'm ignoring this to follow the coding style in this function. |
||
| return 1; | ||
| } | ||
| #endif /* AF_QIPCRTR */ | ||
|
|
||
| #if defined(AF_VSOCK) | ||
| case AF_VSOCK: | ||
| { | ||
|
|
@@ -6983,6 +7025,11 @@ PyInit__socket(void) | |
| #endif | ||
| #endif /* AF_NETLINK */ | ||
|
|
||
| #ifdef AF_QIPCRTR | ||
| /* Qualcomm IPCROUTER */ | ||
| PyModule_AddIntMacro(m, AF_QIPCRTR); | ||
| #endif | ||
|
|
||
| #ifdef AF_VSOCK | ||
| PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK); | ||
| PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0); | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -54,6 +54,15 @@ typedef int socklen_t; | |
| # undef AF_NETLINK | ||
| #endif | ||
|
|
||
| #ifdef HAVE_LINUX_QRTR_H | ||
| # ifdef HAVE_ASM_TYPES_H | ||
| # include <asm/types.h> | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You must add the new addr type to the large |
||
| # endif | ||
| # include <linux/qrtr.h> | ||
| #else | ||
| # undef AF_QIPCRTR | ||
| #endif | ||
|
|
||
| #ifdef HAVE_BLUETOOTH_BLUETOOTH_H | ||
| #include <bluetooth/bluetooth.h> | ||
| #include <bluetooth/rfcomm.h> | ||
|
|
@@ -203,6 +212,9 @@ typedef union sock_addr { | |
| #ifdef HAVE_SOCKADDR_ALG | ||
| struct sockaddr_alg alg; | ||
| #endif | ||
| #ifdef AF_QIPCRTR | ||
| struct sockaddr_qrtr sq; | ||
| #endif | ||
| #ifdef AF_VSOCK | ||
| struct sockaddr_vm vm; | ||
| #endif | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.