mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 22:03:42 -07:00
Add bind option for TCP
This commit is contained in:
parent
15ef4f6768
commit
56b4bda50d
3 changed files with 139 additions and 0 deletions
|
@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file.
|
||||||
This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log...
|
This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log...
|
||||||
|
|
||||||
## [unreleased][unreleased]
|
## [unreleased][unreleased]
|
||||||
|
- Added `bind` option for network connections to specify the outbound address and port (@wh201906)
|
||||||
- Added new command `data bmap` - breaks down a hexvalue to a binary template (@iceman1001)
|
- Added new command `data bmap` - breaks down a hexvalue to a binary template (@iceman1001)
|
||||||
- Changed aid_desfire.json - added entreis from the Metrodroid project (@iceman1001)
|
- Changed aid_desfire.json - added entreis from the Metrodroid project (@iceman1001)
|
||||||
- Changed mad.json - added entries from the Metrodroid project (@iceman1001)
|
- Changed mad.json - added entries from the Metrodroid project (@iceman1001)
|
||||||
|
|
|
@ -121,6 +121,65 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) {
|
||||||
|
|
||||||
timeout.tv_usec = UART_TCP_CLIENT_RX_TIMEOUT_MS * 1000;
|
timeout.tv_usec = UART_TCP_CLIENT_RX_TIMEOUT_MS * 1000;
|
||||||
|
|
||||||
|
// find the "bind" option
|
||||||
|
char *bindAddrPortStr = strstr(addrPortStr, ",bind=");
|
||||||
|
char *bindAddrStr = NULL;
|
||||||
|
char *bindPortStr = NULL;
|
||||||
|
bool isBindingIPv6 = false; // Assume v4
|
||||||
|
if (bindAddrPortStr != NULL) {
|
||||||
|
*bindAddrPortStr = '\0'; // as the end of target address (and port)
|
||||||
|
bindAddrPortStr += 6;
|
||||||
|
bindAddrStr = bindAddrPortStr;
|
||||||
|
|
||||||
|
// find the start of the bind address
|
||||||
|
char *endBracket = strrchr(bindAddrPortStr, ']');
|
||||||
|
if (bindAddrPortStr[0] == '[') {
|
||||||
|
bindAddrStr += 1;
|
||||||
|
if (endBracket == NULL) {
|
||||||
|
PrintAndLogEx(ERR, "error: wrong address: [] unmatched in bind option");
|
||||||
|
free(addrPortStr);
|
||||||
|
free(sp);
|
||||||
|
return INVALID_SERIAL_PORT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// find the bind port
|
||||||
|
char *lColon = strchr(bindAddrPortStr, ':');
|
||||||
|
char *rColon = strrchr(bindAddrPortStr, ':');
|
||||||
|
if (rColon == NULL) {
|
||||||
|
// no colon
|
||||||
|
// ",bind=<ipv4 address>", ",bind=[<ipv4 address>]"
|
||||||
|
bindPortStr = NULL;
|
||||||
|
} else if (lColon == rColon) {
|
||||||
|
// only one colon
|
||||||
|
// ",bind=<ipv4 address>:<port>", ",bind=[<ipv4 address>]:<port>"
|
||||||
|
bindPortStr = rColon + 1;
|
||||||
|
} else {
|
||||||
|
// two or more colon, IPv6 address
|
||||||
|
// ",bind=[<ipv6 address>]:<port>"
|
||||||
|
// ",bind=<ipv6 address>", ",bind=[<ipv6 address>]"
|
||||||
|
if (endBracket != NULL && rColon == endBracket + 1) {
|
||||||
|
bindPortStr = rColon + 1;
|
||||||
|
} else {
|
||||||
|
bindPortStr = NULL;
|
||||||
|
}
|
||||||
|
isBindingIPv6 = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle the end of the bind address
|
||||||
|
if (endBracket != NULL) {
|
||||||
|
*endBracket = '\0';
|
||||||
|
} else if (rColon != NULL && lColon == rColon) {
|
||||||
|
*rColon = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
// for bind option, it's possible to only specify address or port
|
||||||
|
if (strlen(bindAddrStr) == 0)
|
||||||
|
bindAddrStr = NULL;
|
||||||
|
if (bindPortStr != NULL && strlen(bindPortStr) == 0)
|
||||||
|
bindPortStr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// find the start of the address
|
// find the start of the address
|
||||||
char *endBracket = strrchr(addrPortStr, ']');
|
char *endBracket = strrchr(addrPortStr, ']');
|
||||||
if (addrPortStr[0] == '[') {
|
if (addrPortStr[0] == '[') {
|
||||||
|
@ -190,6 +249,15 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) {
|
||||||
if (sfd == -1)
|
if (sfd == -1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (!uart_bind(&sfd, bindAddrStr, bindPortStr, isBindingIPv6)) {
|
||||||
|
PrintAndLogEx(ERR, "error: Could not bind. errno: %d", errno);
|
||||||
|
close(sfd);
|
||||||
|
freeaddrinfo(addr);
|
||||||
|
free(addrPortStr);
|
||||||
|
free(sp);
|
||||||
|
return INVALID_SERIAL_PORT;
|
||||||
|
}
|
||||||
|
|
||||||
if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1)
|
if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -123,6 +123,65 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) {
|
||||||
|
|
||||||
timeout.tv_usec = UART_TCP_CLIENT_RX_TIMEOUT_MS * 1000;
|
timeout.tv_usec = UART_TCP_CLIENT_RX_TIMEOUT_MS * 1000;
|
||||||
|
|
||||||
|
// find the "bind" option
|
||||||
|
char *bindAddrPortStr = strstr(addrPortStr, ",bind=");
|
||||||
|
char *bindAddrStr = NULL;
|
||||||
|
char *bindPortStr = NULL;
|
||||||
|
bool isBindingIPv6 = false; // Assume v4
|
||||||
|
if (bindAddrPortStr != NULL) {
|
||||||
|
*bindAddrPortStr = '\0'; // as the end of target address (and port)
|
||||||
|
bindAddrPortStr += 6;
|
||||||
|
bindAddrStr = bindAddrPortStr;
|
||||||
|
|
||||||
|
// find the start of the bind address
|
||||||
|
char *endBracket = strrchr(bindAddrPortStr, ']');
|
||||||
|
if (bindAddrPortStr[0] == '[') {
|
||||||
|
bindAddrStr += 1;
|
||||||
|
if (endBracket == NULL) {
|
||||||
|
PrintAndLogEx(ERR, "error: wrong address: [] unmatched in bind option");
|
||||||
|
free(addrPortStr);
|
||||||
|
free(sp);
|
||||||
|
return INVALID_SERIAL_PORT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// find the bind port
|
||||||
|
char *lColon = strchr(bindAddrPortStr, ':');
|
||||||
|
char *rColon = strrchr(bindAddrPortStr, ':');
|
||||||
|
if (rColon == NULL) {
|
||||||
|
// no colon
|
||||||
|
// ",bind=<ipv4 address>", ",bind=[<ipv4 address>]"
|
||||||
|
bindPortStr = NULL;
|
||||||
|
} else if (lColon == rColon) {
|
||||||
|
// only one colon
|
||||||
|
// ",bind=<ipv4 address>:<port>", ",bind=[<ipv4 address>]:<port>"
|
||||||
|
bindPortStr = rColon + 1;
|
||||||
|
} else {
|
||||||
|
// two or more colon, IPv6 address
|
||||||
|
// ",bind=[<ipv6 address>]:<port>"
|
||||||
|
// ",bind=<ipv6 address>", ",bind=[<ipv6 address>]"
|
||||||
|
if (endBracket != NULL && rColon == endBracket + 1) {
|
||||||
|
bindPortStr = rColon + 1;
|
||||||
|
} else {
|
||||||
|
bindPortStr = NULL;
|
||||||
|
}
|
||||||
|
isBindingIPv6 = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle the end of the bind address
|
||||||
|
if (endBracket != NULL) {
|
||||||
|
*endBracket = '\0';
|
||||||
|
} else if (rColon != NULL && lColon == rColon) {
|
||||||
|
*rColon = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
// for bind option, it's possible to only specify address or port
|
||||||
|
if (strlen(bindAddrStr) == 0)
|
||||||
|
bindAddrStr = NULL;
|
||||||
|
if (bindPortStr != NULL && strlen(bindPortStr) == 0)
|
||||||
|
bindPortStr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// find the start of the address
|
// find the start of the address
|
||||||
char *endBracket = strrchr(addrPortStr, ']');
|
char *endBracket = strrchr(addrPortStr, ']');
|
||||||
if (addrPortStr[0] == '[') {
|
if (addrPortStr[0] == '[') {
|
||||||
|
@ -202,6 +261,17 @@ serial_port uart_open(const char *pcPortName, uint32_t speed) {
|
||||||
if (hSocket == INVALID_SOCKET)
|
if (hSocket == INVALID_SOCKET)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (!uart_bind(&hSocket, bindAddrStr, bindPortStr, isBindingIPv6)) {
|
||||||
|
PrintAndLogEx(ERR, "error: Could not bind. error: %u", WSAGetLastError());
|
||||||
|
closesocket(hSocket);
|
||||||
|
hSocket = INVALID_SOCKET;
|
||||||
|
freeaddrinfo(addr);
|
||||||
|
free(addrPortStr);
|
||||||
|
free(sp);
|
||||||
|
WSACleanup();
|
||||||
|
return INVALID_SERIAL_PORT;
|
||||||
|
}
|
||||||
|
|
||||||
if (connect(hSocket, rp->ai_addr, (int)rp->ai_addrlen) != INVALID_SOCKET)
|
if (connect(hSocket, rp->ai_addr, (int)rp->ai_addrlen) != INVALID_SOCKET)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue