diff --git a/client/src/comms.c b/client/src/comms.c index 269e75a1d..9460c7024 100644 --- a/client/src/comms.c +++ b/client/src/comms.c @@ -666,9 +666,9 @@ int TestProxmark(pm3_device_t *dev) { g_conn.send_via_fpc_usart = g_pm3_capabilities.via_fpc; g_conn.uart_speed = g_pm3_capabilities.baudrate; - bool is_tcp_conn = (memcmp(g_conn.serial_port_name, "tcp:", 4) == 0); + bool is_tcp_conn = (g_conn.send_via_ip == PM3_TCPv4 || g_conn.send_via_ip == PM3_TCPv6); bool is_bt_conn = (memcmp(g_conn.serial_port_name, "bt:", 3) == 0); - bool is_udp_conn = (memcmp(g_conn.serial_port_name, "udp:", 4) == 0); + bool is_udp_conn = (g_conn.send_via_ip == PM3_UDPv4 || g_conn.send_via_ip == PM3_UDPv6); PrintAndLogEx(INFO, "Communicating with PM3 over %s%s%s%s", (g_conn.send_via_fpc_usart) ? _YELLOW_("FPC UART") : _YELLOW_("USB-CDC"), @@ -680,15 +680,11 @@ int TestProxmark(pm3_device_t *dev) { PrintAndLogEx(INFO, "PM3 UART serial baudrate: " _YELLOW_("%u") "\n", g_conn.uart_speed); } else { int res; - if (is_tcp_conn || is_udp_conn) { - if ((strstr(g_conn.serial_port_name, "localhost") != NULL) || - (strstr(g_conn.serial_port_name, "127.0.0.1") != NULL) || - (strstr(g_conn.serial_port_name, "[::1]") != NULL) || - (strstr(g_conn.serial_port_name, "p:::1") != NULL)) { - res = uart_reconfigure_timeouts(UART_TCP_CLIENT_LOCAL_RX_TIMEOUT_MS); - } else { - res = uart_reconfigure_timeouts(UART_TCP_CLIENT_RX_TIMEOUT_MS); - } + if (g_conn.send_via_local_ip) { + // (g_conn.send_via_local_ip == true) -> ((is_tcp_conn || is_udp_conn) == true) + res = uart_reconfigure_timeouts(is_tcp_conn ? UART_TCP_LOCAL_CLIENT_RX_TIMEOUT_MS : UART_UDP_LOCAL_CLIENT_RX_TIMEOUT_MS); + } else if (is_tcp_conn || is_udp_conn) { + res = uart_reconfigure_timeouts(UART_NET_CLIENT_RX_TIMEOUT_MS); } else { res = uart_reconfigure_timeouts(UART_USB_CLIENT_RX_TIMEOUT_MS); } diff --git a/client/src/comms.h b/client/src/comms.h index 9f4d6cd60..333b2bf1c 100644 --- a/client/src/comms.h +++ b/client/src/comms.h @@ -70,8 +70,10 @@ typedef struct { bool send_with_crc_on_fpc; // "Session" flag, to tell via which interface next msgs are sent: USB or FPC USART bool send_via_fpc_usart; - // to tell if we are using TCP/UDP/TCPv6 + // to tell if we are using TCP/UDP/TCP(IPv6)/UDP(IPv6) CommunicationProtocol_t send_via_ip; + // to tell if the target address is local address(127.0.0.1/localhost/::1) + bool send_via_local_ip; // To memorise baudrate uint32_t uart_speed; uint16_t last_command; diff --git a/client/src/uart/uart_posix.c b/client/src/uart/uart_posix.c index ecb488633..bc0fb37c4 100644 --- a/client/src/uart/uart_posix.c +++ b/client/src/uart/uart_posix.c @@ -91,6 +91,8 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { sp->udpBuffer = NULL; // init timeouts timeout.tv_usec = UART_FPC_CLIENT_RX_TIMEOUT_MS * 1000; + g_conn.send_via_local_ip = false; + g_conn.send_via_ip = PM3_NONE; char *prefix = strdup(pcPortName); if (prefix == NULL) { @@ -119,7 +121,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { return INVALID_SERIAL_PORT; } - timeout.tv_usec = UART_TCP_CLIENT_RX_TIMEOUT_MS * 1000; + timeout.tv_usec = UART_NET_CLIENT_RX_TIMEOUT_MS * 1000; // find the "bind" option char *bindAddrPortStr = strstr(addrPortStr, ",bind="); @@ -233,6 +235,12 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { info.ai_family = PF_UNSPEC; info.ai_socktype = SOCK_STREAM; + if ((strstr(addrstr, "localhost") != NULL) || + (strstr(addrstr, "127.0.0.1") != NULL) || + (strstr(addrstr, "::1") != NULL)) { + g_conn.send_via_local_ip = true; + } + int s = getaddrinfo(addrstr, portstr, &info, &addr); if (s != 0) { PrintAndLogEx(ERR, "error: getaddrinfo: %s", gai_strerror(s)); @@ -304,7 +312,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { return INVALID_SERIAL_PORT; } - timeout.tv_usec = UART_TCP_CLIENT_RX_TIMEOUT_MS * 1000; + timeout.tv_usec = UART_NET_CLIENT_RX_TIMEOUT_MS * 1000; // find the "bind" option char *bindAddrPortStr = strstr(addrPortStr, ",bind="); @@ -417,6 +425,12 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { info.ai_family = PF_UNSPEC; info.ai_socktype = SOCK_DGRAM; + if ((strstr(addrstr, "localhost") != NULL) || + (strstr(addrstr, "127.0.0.1") != NULL) || + (strstr(addrstr, "::1") != NULL)) { + g_conn.send_via_local_ip = true; + } + int s = getaddrinfo(addrstr, portstr, &info, &addr); if (s != 0) { PrintAndLogEx(ERR, "error: getaddrinfo: %s", gai_strerror(s)); @@ -528,7 +542,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { } // we must use max timeout! - timeout.tv_usec = UART_TCP_CLIENT_RX_TIMEOUT_MS * 1000; + timeout.tv_usec = UART_NET_CLIENT_RX_TIMEOUT_MS * 1000; size_t servernameLen = (strlen(pcPortName) - 7) + 1; char serverNameBuf[servernameLen]; diff --git a/client/src/uart/uart_win32.c b/client/src/uart/uart_win32.c index 72faf97b4..ba3374494 100644 --- a/client/src/uart/uart_win32.c +++ b/client/src/uart/uart_win32.c @@ -44,7 +44,7 @@ typedef struct { // this is for TCP connection struct timeval timeout = { .tv_sec = 0, // 0 second - .tv_usec = UART_TCP_CLIENT_RX_TIMEOUT_MS * 1000 + .tv_usec = UART_NET_CLIENT_RX_TIMEOUT_MS * 1000 }; uint32_t newtimeout_value = 0; @@ -92,6 +92,8 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { } sp->udpBuffer = NULL; + g_conn.send_via_local_ip = false; + g_conn.send_via_ip = PM3_NONE; char *prefix = strdup(pcPortName); if (prefix == NULL) { @@ -121,7 +123,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { return INVALID_SERIAL_PORT; } - timeout.tv_usec = UART_TCP_CLIENT_RX_TIMEOUT_MS * 1000; + timeout.tv_usec = UART_NET_CLIENT_RX_TIMEOUT_MS * 1000; // find the "bind" option char *bindAddrPortStr = strstr(addrPortStr, ",bind="); @@ -244,6 +246,12 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { info.ai_socktype = SOCK_STREAM; info.ai_protocol = IPPROTO_TCP; + if ((strstr(addrstr, "localhost") != NULL) || + (strstr(addrstr, "127.0.0.1") != NULL) || + (strstr(addrstr, "::1") != NULL)) { + g_conn.send_via_local_ip = true; + } + int s = getaddrinfo(addrstr, portstr, &info, &addr); if (s != 0) { PrintAndLogEx(ERR, "error: getaddrinfo: %d: %s", s, gai_strerror(s)); @@ -322,7 +330,7 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { return INVALID_SERIAL_PORT; } - timeout.tv_usec = UART_TCP_CLIENT_RX_TIMEOUT_MS * 1000; + timeout.tv_usec = UART_NET_CLIENT_RX_TIMEOUT_MS * 1000; // find the "bind" option char *bindAddrPortStr = strstr(addrPortStr, ",bind="); @@ -445,6 +453,12 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) { info.ai_socktype = SOCK_DGRAM; info.ai_protocol = IPPROTO_UDP; + if ((strstr(addrstr, "localhost") != NULL) || + (strstr(addrstr, "127.0.0.1") != NULL) || + (strstr(addrstr, "::1") != NULL)) { + g_conn.send_via_local_ip = true; + } + int s = getaddrinfo(addrstr, portstr, &info, &addr); if (s != 0) { PrintAndLogEx(ERR, "error: getaddrinfo: %d: %s", s, gai_strerror(s)); diff --git a/doc/new_frame_format.md b/doc/new_frame_format.md index 73c6faabb..061dcd929 100644 --- a/doc/new_frame_format.md +++ b/doc/new_frame_format.md @@ -332,9 +332,11 @@ else we get errors about partial packet reception FTDI 460800 hw status ⇒ we need 30ms BT 115200 hf mf fchk --1k -f file.dic ⇒ we need 140ms - # define UART_FPC_CLIENT_RX_TIMEOUT_MS 170 - # define UART_USB_CLIENT_RX_TIMEOUT_MS 20 - # define UART_TCP_CLIENT_RX_TIMEOUT_MS 300 + # define UART_FPC_CLIENT_RX_TIMEOUT_MS 200 + # define UART_USB_CLIENT_RX_TIMEOUT_MS 20 + # define UART_NET_CLIENT_RX_TIMEOUT_MS 500 + # define UART_TCP_LOCAL_CLIENT_RX_TIMEOUT_MS 40 + # define UART_UDP_LOCAL_CLIENT_RX_TIMEOUT_MS 20 This goes to `uart_posix.c` `timeval` struct and `uart_win32.c` `serial_port_windows` struct @@ -342,7 +344,7 @@ and `uart_win32.c` `serial_port_windows` struct It starts at UART_FPC_CLIENT_RX_TIMEOUT_MS and once we detect we're working over USB it's reduced to UART_USB_CLIENT_RX_TIMEOUT_MS. - +The timeout is configurable by the `hw timeout` command (since v4.17140). Add automatically some communication delay in the `WaitForResponseTimeout` & `dl_it` timeouts. Only when using FPC, timeout = 2* empirically measured delay (FTDI cable). diff --git a/doc/termux_notes.md b/doc/termux_notes.md index 852c3cdc1..c4ab7fa9b 100644 --- a/doc/termux_notes.md +++ b/doc/termux_notes.md @@ -15,12 +15,13 @@ * [ Flashing the kernel ](#flashing-the-kernel) * [ Testing ](#testing) * [ Troubleshooting ](#troubleshooting) - * [ TCP bridge method ](#tcp-bridge-method) + * [ TCP/UDP bridge method ](#tcpudp-bridge-method) * [ USB connection ](#usb-connection) * [ USB-UART bridge application ](#usb-uart-bridge-application) * [ Bluetooth connection ](#bluetooth-connection) * [ BT-UART bridge application ](#bt-uart-bridge-application) * [ TCP connection ](#tcp-connection) + * [ UDP connection ](#udp-connection) * [Troubleshooting](#troubleshooting-1) * [BTADDON Missing in Firmware of PM3](#btaddon-missing-in-firmware-of-pm3) * [Compiling and Flashing a Proxmark3 Firmware from non-root Android](#compiling-and-flashing-a-proxmark3-firmware-from-non-root-android) @@ -125,16 +126,20 @@ Everything should work just like if it was your PC! - `dmesg | grep usb` - useful debug info - `/proc/config.gz` - contains your kernel's build configuration. Look for `CONFIG_USB_ACM`, which should be enabled -## TCP bridge method +## TCP/UDP bridge method ^[Top](#top) Termux doesn't come with usb serial neither bluetooth serial drivers. -However, it is fully integrated with phone's network, so we need to talk to the proxmark using serial to tcp sockets (carried out by android apps). +However, it is fully integrated with phone's network, so we need to talk to the proxmark using serial to TCP/UDP sockets (carried out by other android apps). + +``` +|Client in Termux| <--TCP/UDP--> |Bridge App| <--USB/Bluetooth--> |Proxmark3| +``` ### USB connection ^[Top](#top) -#### USB-UART Bridge Application +#### USB-UART Bridge Application for TCP to USB bridging ^[Top](#top) Install [this free TCPUART app](https://play.google.com/store/apps/details?id=com.hardcodedjoy.tcpuart) on the Play Store @@ -153,7 +158,7 @@ It is possible to record the config as autostart, cf 'Settings' -> 'Autostart se ### Bluetooth connection ^[Top](#top) -#### BT-UART Bridge Application +#### BT-UART Bridge Application for TCP to BT bridging ^[Top](#top) Install [this free app](https://play.google.com/store/apps/details?id=masar.bb) or [the paid version](https://play.google.com/store/apps/details?id=masar.bluetoothbridge.pro) (which includes usb bridge) @@ -175,6 +180,42 @@ Alternatively, if you have made the client in the git repo: ``` ./client/proxmark3 tcp:localhost: ``` +If the last colon and the chosen port are missing, the client will use `18888` as the default port. + +### UDP connection +^[Top](#top) + +Start a new session, then: +``` +proxmark3 udp:localhost: +``` +Alternatively, if you have made the client in the git repo: +``` +./client/proxmark3 udp:localhost: +``` +If the last colon and the chosen port are missing, the client will use `18888` as the default port. + +You can also specify the outbound port for UDP connections, which might be required for some UDP to USB/BT bridge app as the target port of it. +The format is +``` +proxmark3 udp:localhost:,bind=: +``` +Some examples: +``` +# The bridge app listens on Port 12345, and the client listens on Port 12355 +proxmark3 udp:localhost:12345,bind=:12355 + +# 127.0.0.1 is also a valid local address +proxmark3 udp:127.0.0.1:12345,bind=:12355 + +# The bridge app listens on the default port 18888, and the client listens on Port 12355 +proxmark3 udp:127.0.0.1,bind=:12355 + +# OutboundPort is randomly picked by the system, which requires the "UDP server" mode for the bridge app +proxmark3 udp:localhost:12345 +``` + + ### Troubleshooting ^[Top](#top) diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index 8f488013e..af019eadd 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -831,8 +831,9 @@ typedef struct { // uart_windows.c & uart_posix.c # define UART_FPC_CLIENT_RX_TIMEOUT_MS 200 # define UART_USB_CLIENT_RX_TIMEOUT_MS 20 -# define UART_TCP_CLIENT_RX_TIMEOUT_MS 500 -# define UART_TCP_CLIENT_LOCAL_RX_TIMEOUT_MS 40 +# define UART_NET_CLIENT_RX_TIMEOUT_MS 500 +# define UART_TCP_LOCAL_CLIENT_RX_TIMEOUT_MS 40 +# define UART_UDP_LOCAL_CLIENT_RX_TIMEOUT_MS 20 // CMD_DEVICE_INFO response packet has flags in arg[0], flag definitions: