Merge pull request #4323 from lemondrops/modem
Modem (and related) cleanups
This commit is contained in:
@@ -5,34 +5,11 @@ indent_style = space
|
||||
indent_size = 4
|
||||
tab_width = 4
|
||||
|
||||
# Disabled for now since not all editors support setting a tab_width value different from indent_size
|
||||
# Relevant VSCode extension issue: https://github.com/editorconfig/editorconfig-vscode/issues/190
|
||||
# [*.rc]
|
||||
# indent_style = space
|
||||
# indent_size = 4
|
||||
# tab_width = 4
|
||||
|
||||
# [Makefile.*]
|
||||
# indent_style = space
|
||||
# indent_size = 4
|
||||
# tab_width = 4
|
||||
|
||||
[*.manifest]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.yml]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[**/CMakeLists.txt]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
[*.cmake]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
[*.json]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
[*.ui]
|
||||
indent_size = 1
|
||||
|
@@ -5,8 +5,7 @@
|
||||
# include <ws2tcpip.h>
|
||||
#endif
|
||||
|
||||
enum net_socket_types
|
||||
{
|
||||
enum net_socket_types {
|
||||
/* Only TCP is supported for now. */
|
||||
NET_SOCKET_TCP
|
||||
};
|
||||
|
@@ -39,6 +39,24 @@
|
||||
#include <86box/plat_unused.h>
|
||||
#include <86box/plat_netsocket.h>
|
||||
|
||||
#ifdef ENABLE_MODEM_LOG
|
||||
int modem_do_log = ENABLE_MODEM_LOG;
|
||||
|
||||
static void
|
||||
modem_log(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (modem_do_log) {
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
#else
|
||||
# define modem_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
/* From RFC 1055. */
|
||||
#define END 0300 /* indicates end of packet */
|
||||
#define ESC 0333 /* indicates byte stuffing */
|
||||
@@ -57,21 +75,18 @@ typedef enum ResTypes {
|
||||
ResNOANSWER
|
||||
} ResTypes;
|
||||
|
||||
enum modem_types
|
||||
{
|
||||
enum modem_types {
|
||||
MODEM_TYPE_SLIP = 1,
|
||||
MODEM_TYPE_PPP = 2,
|
||||
MODEM_TYPE_TCPIP = 3
|
||||
};
|
||||
|
||||
typedef enum modem_mode_t
|
||||
{
|
||||
typedef enum modem_mode_t {
|
||||
MODEM_MODE_COMMAND = 0,
|
||||
MODEM_MODE_DATA = 1
|
||||
} modem_mode_t;
|
||||
|
||||
typedef enum modem_slip_stage_t
|
||||
{
|
||||
typedef enum modem_slip_stage_t {
|
||||
MODEM_SLIP_STAGE_USERNAME,
|
||||
MODEM_SLIP_STAGE_PASSWORD
|
||||
} modem_slip_stage_t;
|
||||
@@ -80,14 +95,12 @@ typedef enum modem_slip_stage_t
|
||||
#define NUMBER_BUFFER_SIZE 128
|
||||
#define PHONEBOOK_SIZE 200
|
||||
|
||||
typedef struct modem_phonebook_entry_t
|
||||
{
|
||||
typedef struct modem_phonebook_entry_t {
|
||||
char phone[NUMBER_BUFFER_SIZE];
|
||||
char address[NUMBER_BUFFER_SIZE];
|
||||
} modem_phonebook_entry_t;
|
||||
|
||||
typedef struct modem_t
|
||||
{
|
||||
typedef struct modem_t {
|
||||
uint8_t mac[6];
|
||||
serial_t *serial;
|
||||
uint32_t baudrate;
|
||||
@@ -165,14 +178,19 @@ static void modem_accept_incoming_call(modem_t* modem);
|
||||
extern ssize_t local_getline(char **buf, size_t *bufsiz, FILE *fp);
|
||||
|
||||
// https://stackoverflow.com/a/122974
|
||||
char *trim(char *str)
|
||||
char *
|
||||
trim(char *str)
|
||||
{
|
||||
size_t len = 0;
|
||||
char *frontp = str;
|
||||
char *endp = NULL;
|
||||
|
||||
if( str == NULL ) { return NULL; }
|
||||
if( str[0] == '\0' ) { return str; }
|
||||
if (str == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
if (str[0] == '\0') {
|
||||
return str;
|
||||
}
|
||||
|
||||
len = strlen(str);
|
||||
endp = str + len;
|
||||
@@ -180,9 +198,10 @@ char *trim(char *str)
|
||||
/* Move the front and back pointers to address the first non-whitespace
|
||||
* characters from each end.
|
||||
*/
|
||||
while( isspace((unsigned char) *frontp) ) { ++frontp; }
|
||||
if( endp != frontp )
|
||||
{
|
||||
while (isspace((unsigned char) *frontp)) {
|
||||
++frontp;
|
||||
}
|
||||
if (endp != frontp) {
|
||||
while (isspace((unsigned char) *(--endp)) && endp != frontp) { }
|
||||
}
|
||||
|
||||
@@ -196,9 +215,10 @@ char *trim(char *str)
|
||||
* of endp to mean the front of the string buffer now.
|
||||
*/
|
||||
endp = str;
|
||||
if( frontp != str )
|
||||
{
|
||||
while( *frontp ) { *endp++ = *frontp++; }
|
||||
if (frontp != str) {
|
||||
while (*frontp) {
|
||||
*endp++ = *frontp++;
|
||||
}
|
||||
*endp = '\0';
|
||||
}
|
||||
|
||||
@@ -217,7 +237,7 @@ modem_read_phonebook_file(modem_t* modem, const char* path)
|
||||
|
||||
modem->entries_num = 0;
|
||||
|
||||
pclog("Phonebook: Reading file %s...\n", path);
|
||||
modem_log("Modem: Reading phone book file %s...\n", path);
|
||||
while (local_getline(&buf, &size, file) != -1) {
|
||||
modem_phonebook_entry_t entry = { { 0 }, { 0 } };
|
||||
buf[strcspn(buf, "\r\n")] = '\0';
|
||||
@@ -237,17 +257,17 @@ modem_read_phonebook_file(modem_t* modem, const char* path)
|
||||
|
||||
if ((entry.phone[0] == '\0') || (entry.address[0] == '\0')) {
|
||||
/* Appears to be a bad line. */
|
||||
pclog("Phonebook: Skipped a bad line\n");
|
||||
modem_log("Modem: Skipped a bad line\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strspn(entry.phone, "01234567890*=,;#+>") != strlen(entry.phone)) {
|
||||
/* Invalid characters. */
|
||||
pclog("Phonebook: Invalid character in phone number %s\n", entry.phone);
|
||||
modem_log("Modem: Invalid character in phone number %s\n", entry.phone);
|
||||
continue;
|
||||
}
|
||||
|
||||
pclog("Phonebook: Mapped phone number %s to address %s\n", entry.phone, entry.address);
|
||||
modem_log("Modem: Mapped phone number %s to address %s\n", entry.phone, entry.address);
|
||||
modem->entries[modem->entries_num++] = entry;
|
||||
if (modem->entries_num >= PHONEBOOK_SIZE)
|
||||
break;
|
||||
@@ -258,7 +278,8 @@ modem_read_phonebook_file(modem_t* modem, const char* path)
|
||||
static void
|
||||
modem_echo(modem_t *modem, uint8_t c)
|
||||
{
|
||||
if (modem->echo && fifo8_num_free(&modem->data_pending)) fifo8_push(&modem->data_pending, c);
|
||||
if (modem->echo && fifo8_num_free(&modem->data_pending))
|
||||
fifo8_push(&modem->data_pending, c);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
@@ -313,7 +334,6 @@ modem_send_line(modem_t* modem, const char* line)
|
||||
fifo8_push(&modem->data_pending, modem->reg[MREG_LF_CHAR]);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
modem_send_number(modem_t *modem, uint32_t val)
|
||||
{
|
||||
@@ -338,7 +358,7 @@ process_tx_packet(modem_t *modem, uint8_t *p, uint32_t len)
|
||||
uint8_t *processed_tx_packet = calloc(len, 1);
|
||||
uint8_t c = 0;
|
||||
|
||||
pclog("Processing SLIP packet of %u bytes\n", len);
|
||||
modem_log("Processing SLIP packet of %u bytes\n", len);
|
||||
|
||||
while (pos < len) {
|
||||
c = p[pos];
|
||||
@@ -373,8 +393,7 @@ process_tx_packet(modem_t *modem, uint8_t *p, uint32_t len)
|
||||
}
|
||||
|
||||
send_tx_packet:
|
||||
if (received)
|
||||
{
|
||||
if (received) {
|
||||
uint8_t *buf = calloc(received + 14, 1);
|
||||
buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = 0xFF;
|
||||
buf[6] = buf[7] = buf[8] = buf[9] = buf[10] = buf[11] = 0xFC;
|
||||
@@ -461,7 +480,7 @@ modem_write(UNUSED(serial_t *s), void *priv, uint8_t txval)
|
||||
if (txval == '/') {
|
||||
// Repeat the last command.
|
||||
modem_echo(modem, txval);
|
||||
pclog("Repeat last command (%s)\n", modem->prevcmdbuf);
|
||||
modem_log("Repeat last command (%s)\n", modem->prevcmdbuf);
|
||||
modem_do_command(modem, 1);
|
||||
} else {
|
||||
modem_echo(modem, modem->reg[MREG_BACKSPACE_CHAR]);
|
||||
@@ -500,7 +519,9 @@ modem_write(UNUSED(serial_t *s), void *priv, uint8_t txval)
|
||||
}
|
||||
}
|
||||
|
||||
void modem_send_res(modem_t* modem, const ResTypes response) {
|
||||
void
|
||||
modem_send_res(modem_t *modem, const ResTypes response)
|
||||
{
|
||||
char response_str_connect[256] = { 0 };
|
||||
const char *response_str = NULL;
|
||||
uint32_t code = -1;
|
||||
@@ -508,23 +529,47 @@ void modem_send_res(modem_t* modem, const ResTypes response) {
|
||||
snprintf(response_str_connect, sizeof(response_str_connect), "CONNECT %u", modem->baudrate);
|
||||
|
||||
switch (response) {
|
||||
case ResOK: code = 0; response_str = "OK"; break;
|
||||
case ResCONNECT: code = 1; response_str = response_str_connect; break;
|
||||
case ResRING: code = 2; response_str = "RING"; break;
|
||||
case ResNOCARRIER: code = 3; response_str = "NO CARRIER"; break;
|
||||
case ResERROR: code = 4; response_str = "ERROR"; break;
|
||||
case ResNODIALTONE: code = 6; response_str = "NO DIALTONE"; break;
|
||||
case ResBUSY: code = 7; response_str = "BUSY"; break;
|
||||
case ResNOANSWER: code = 8; response_str = "NO ANSWER"; break;
|
||||
case ResNONE: return;
|
||||
case ResOK:
|
||||
code = 0;
|
||||
response_str = "OK";
|
||||
break;
|
||||
case ResCONNECT:
|
||||
code = 1;
|
||||
response_str = response_str_connect;
|
||||
break;
|
||||
case ResRING:
|
||||
code = 2;
|
||||
response_str = "RING";
|
||||
break;
|
||||
case ResNOCARRIER:
|
||||
code = 3;
|
||||
response_str = "NO CARRIER";
|
||||
break;
|
||||
case ResERROR:
|
||||
code = 4;
|
||||
response_str = "ERROR";
|
||||
break;
|
||||
case ResNODIALTONE:
|
||||
code = 6;
|
||||
response_str = "NO DIALTONE";
|
||||
break;
|
||||
case ResBUSY:
|
||||
code = 7;
|
||||
response_str = "BUSY";
|
||||
break;
|
||||
case ResNOANSWER:
|
||||
code = 8;
|
||||
response_str = "NO ANSWER";
|
||||
break;
|
||||
case ResNONE:
|
||||
return;
|
||||
}
|
||||
|
||||
if (modem->doresponse != 1) {
|
||||
if (modem->doresponse == 2 && (response == ResRING ||
|
||||
response == ResCONNECT || response == ResNOCARRIER)) {
|
||||
if (modem->doresponse == 2 && (response == ResRING || response == ResCONNECT || response == ResNOCARRIER)) {
|
||||
return;
|
||||
}
|
||||
pclog("Modem response: %s\n", response_str);
|
||||
modem_log("Modem response: %s\n", response_str);
|
||||
if (modem->numericresponse && code != ~0) {
|
||||
modem_send_number(modem, code);
|
||||
} else if (response_str != NULL) {
|
||||
@@ -641,19 +686,16 @@ modem_dial(modem_t* modem, const char* str)
|
||||
{
|
||||
modem->tcpIpConnCounter = 0;
|
||||
modem->tcpIpMode = false;
|
||||
if (!strncmp(str, "0.0.0.0", sizeof("0.0.0.0") - 1))
|
||||
{
|
||||
pclog("Turning on SLIP\n");
|
||||
if (!strncmp(str, "0.0.0.0", sizeof("0.0.0.0") - 1)) {
|
||||
modem_log("Turning on SLIP\n");
|
||||
modem_enter_connected_state(modem);
|
||||
modem->numberinprogress[0] = 0;
|
||||
modem->tcpIpMode = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
char buf[NUMBER_BUFFER_SIZE] = "";
|
||||
strncpy(buf, str, sizeof(buf) - 1);
|
||||
strncpy(modem->lastnumber, str, sizeof(modem->lastnumber) - 1);
|
||||
pclog("Connecting to %s...\n", buf);
|
||||
modem_log("Connecting to %s...\n", buf);
|
||||
|
||||
// Scan host for port
|
||||
uint16_t port;
|
||||
@@ -661,8 +703,7 @@ modem_dial(modem_t* modem, const char* str)
|
||||
if (hasport) {
|
||||
*hasport++ = 0;
|
||||
port = (uint16_t) atoi(hasport);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
port = 23;
|
||||
}
|
||||
|
||||
@@ -696,7 +737,9 @@ is_next_token(const char* a, size_t N, const char *b)
|
||||
return (strncmp(a, b, N_without_null) == 0);
|
||||
}
|
||||
|
||||
static const char *modem_get_address_from_phonebook(modem_t* modem, const char *input) {
|
||||
static const char *
|
||||
modem_get_address_from_phonebook(modem_t *modem, const char *input)
|
||||
{
|
||||
int i = 0;
|
||||
for (i = 0; i < modem->entries_num; i++) {
|
||||
if (strcmp(input, modem->entries[i].phone) == 0)
|
||||
@@ -738,7 +781,7 @@ modem_do_command(modem_t* modem, int repeat)
|
||||
return;
|
||||
}
|
||||
|
||||
pclog("Command received: %s (doresponse = %d)\n", modem->cmdbuf, modem->doresponse);
|
||||
modem_log("Command received: %s (doresponse = %d)\n", modem->cmdbuf, modem->doresponse);
|
||||
|
||||
scanbuf = &modem->cmdbuf[2];
|
||||
|
||||
@@ -764,7 +807,8 @@ modem_do_command(modem_t* modem, int repeat)
|
||||
}
|
||||
modem_send_res(modem, ResERROR);
|
||||
return;
|
||||
case 'D': { // Dial.
|
||||
case 'D':
|
||||
{ // Dial.
|
||||
char buffer[NUMBER_BUFFER_SIZE];
|
||||
char obuffer[NUMBER_BUFFER_SIZE];
|
||||
char *foundstr = &scanbuf[0];
|
||||
@@ -777,7 +821,7 @@ modem_do_command(modem_t* modem, int repeat)
|
||||
if (modem->lastnumber[0] == 0)
|
||||
modem_send_res(modem, ResERROR);
|
||||
else {
|
||||
pclog("Redialing number %s\n", modem->lastnumber);
|
||||
modem_log("Redialing number %s\n", modem->lastnumber);
|
||||
modem_dial(modem, modem->lastnumber);
|
||||
}
|
||||
return;
|
||||
@@ -795,7 +839,7 @@ modem_do_command(modem_t* modem, int repeat)
|
||||
// Check for ; and return to command mode if found
|
||||
char *semicolon = strchr(foundstr, ';');
|
||||
if (semicolon != NULL) {
|
||||
pclog("Semicolon found in number, returning to command mode\n");
|
||||
modem_log("Semicolon found in number, returning to command mode\n");
|
||||
strncat(modem->numberinprogress, foundstr, strcspn(foundstr, ";"));
|
||||
scanbuf = semicolon + 1;
|
||||
break;
|
||||
@@ -804,7 +848,7 @@ modem_do_command(modem_t* modem, int repeat)
|
||||
foundstr = modem->numberinprogress;
|
||||
}
|
||||
|
||||
pclog("Dialing number %s\n", foundstr);
|
||||
modem_log("Dialing number %s\n", foundstr);
|
||||
mappedaddr = modem_get_address_from_phonebook(modem, foundstr);
|
||||
if (mappedaddr) {
|
||||
modem_dial(modem, mappedaddr);
|
||||
@@ -847,10 +891,14 @@ modem_do_command(modem_t* modem, int repeat)
|
||||
size_t k = 0;
|
||||
size_t foundlen2 = strlen(foundstr);
|
||||
for (i = 0; i < foundlen2; i++) {
|
||||
if (i == 0 && foundstr[0] == '0') continue;
|
||||
if (i == 1 && foundstr[0] == '0' && foundstr[1] == '0') continue;
|
||||
if (foundstr[i] == '0' && foundstr[i-1] == '.') continue;
|
||||
if (foundstr[i] == '0' && foundstr[i-1] == '0' && foundstr[i-2] == '.') continue;
|
||||
if (i == 0 && foundstr[0] == '0')
|
||||
continue;
|
||||
if (i == 1 && foundstr[0] == '0' && foundstr[1] == '0')
|
||||
continue;
|
||||
if (foundstr[i] == '0' && foundstr[i - 1] == '.')
|
||||
continue;
|
||||
if (foundstr[i] == '0' && foundstr[i - 1] == '0' && foundstr[i - 2] == '.')
|
||||
continue;
|
||||
obuffer[k++] = foundstr[i];
|
||||
}
|
||||
obuffer[k] = 0;
|
||||
@@ -862,20 +910,32 @@ modem_do_command(modem_t* modem, int repeat)
|
||||
}
|
||||
case 'I': // Some strings about firmware
|
||||
switch (modem_scan_number(&scanbuf)) {
|
||||
case 3: modem_send_line(modem, "86Box Emulated Modem Firmware V1.00"); break;
|
||||
case 4: modem_send_line(modem, "Modem compiled for 86Box version " EMU_VERSION); break;
|
||||
case 3:
|
||||
modem_send_line(modem, "86Box Emulated Modem Firmware V1.00");
|
||||
break;
|
||||
case 4:
|
||||
modem_send_line(modem, "Modem compiled for 86Box version " EMU_VERSION);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'E': // Echo on/off
|
||||
switch (modem_scan_number(&scanbuf)) {
|
||||
case 0: modem->echo = false; break;
|
||||
case 1: modem->echo = true; break;
|
||||
case 0:
|
||||
modem->echo = false;
|
||||
break;
|
||||
case 1:
|
||||
modem->echo = true;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'V':
|
||||
switch (modem_scan_number(&scanbuf)) {
|
||||
case 0: modem->numericresponse = true; break;
|
||||
case 1: modem->numericresponse = false; break;
|
||||
case 0:
|
||||
modem->numericresponse = true;
|
||||
break;
|
||||
case 1:
|
||||
modem->numericresponse = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'H': // Hang up
|
||||
@@ -921,7 +981,8 @@ modem_do_command(modem_t* modem, int repeat)
|
||||
break;
|
||||
}
|
||||
return;
|
||||
case 'Z': { // Reset and load profiles
|
||||
case 'Z':
|
||||
{ // Reset and load profiles
|
||||
// scan the number away, if any
|
||||
modem_scan_number(&scanbuf);
|
||||
if (modem->connected)
|
||||
@@ -931,7 +992,8 @@ modem_do_command(modem_t* modem, int repeat)
|
||||
}
|
||||
case ' ': // skip space
|
||||
break;
|
||||
case 'Q': {
|
||||
case 'Q':
|
||||
{
|
||||
// Response options
|
||||
// 0 = all on, 1 = all off,
|
||||
// 2 = no ring and no connect/carrier in answermode
|
||||
@@ -945,7 +1007,8 @@ modem_do_command(modem_t* modem, int repeat)
|
||||
}
|
||||
}
|
||||
|
||||
case 'S': { // Registers
|
||||
case 'S':
|
||||
{ // Registers
|
||||
const uint32_t index = modem_scan_number(&scanbuf);
|
||||
if (index >= 100) {
|
||||
modem_send_res(modem, ResERROR);
|
||||
@@ -962,8 +1025,7 @@ modem_do_command(modem_t* modem, int repeat)
|
||||
const uint32_t val = modem_scan_number(&scanbuf);
|
||||
modem->reg[index] = val;
|
||||
break;
|
||||
}
|
||||
else if (scanbuf[0] == '?') { // get register
|
||||
} else if (scanbuf[0] == '?') { // get register
|
||||
modem_send_number(modem, modem->reg[index]);
|
||||
scanbuf++;
|
||||
break;
|
||||
@@ -974,10 +1036,12 @@ modem_do_command(modem_t* modem, int repeat)
|
||||
// GetPortNumber(), index, reg[index]);
|
||||
}
|
||||
break;
|
||||
case '&': { // & escaped commands
|
||||
case '&':
|
||||
{ // & escaped commands
|
||||
char cmdchar = modem_fetch_character(&scanbuf);
|
||||
switch (cmdchar) {
|
||||
case 'C': {
|
||||
case 'C':
|
||||
{
|
||||
const uint32_t val = modem_scan_number(&scanbuf);
|
||||
if (val < 2)
|
||||
modem->dcdmode = val;
|
||||
@@ -987,7 +1051,8 @@ modem_do_command(modem_t* modem, int repeat)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'K': {
|
||||
case 'K':
|
||||
{
|
||||
const uint32_t val = modem_scan_number(&scanbuf);
|
||||
if (val < 5)
|
||||
modem->flowcontrol = val;
|
||||
@@ -997,7 +1062,8 @@ modem_do_command(modem_t* modem, int repeat)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'D': {
|
||||
case 'D':
|
||||
{
|
||||
const uint32_t val = modem_scan_number(&scanbuf);
|
||||
if (val < 4)
|
||||
modem->dtrmode = val;
|
||||
@@ -1015,7 +1081,8 @@ modem_do_command(modem_t* modem, int repeat)
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case '\\': { // \ escaped commands
|
||||
case '\\':
|
||||
{ // \ escaped commands
|
||||
char cmdchar = modem_fetch_character(&scanbuf);
|
||||
switch (cmdchar) {
|
||||
case 'N':
|
||||
@@ -1046,16 +1113,16 @@ modem_dtr_callback_timer(void* priv)
|
||||
if (dev->connected) {
|
||||
switch (dev->dtrmode) {
|
||||
case 1:
|
||||
pclog("DTR dropped, returning to command mode (dtrmode = %i)\n", dev->dtrmode);
|
||||
modem_log("DTR dropped, returning to command mode (dtrmode = %i)\n", dev->dtrmode);
|
||||
dev->mode = MODEM_MODE_COMMAND;
|
||||
break;
|
||||
case 2:
|
||||
pclog("DTR dropped, hanging up (dtrmode = %i)\n", dev->dtrmode);
|
||||
modem_log("DTR dropped, hanging up (dtrmode = %i)\n", dev->dtrmode);
|
||||
modem_send_res(dev, ResNOCARRIER);
|
||||
modem_enter_idle_state(dev);
|
||||
break;
|
||||
case 3:
|
||||
pclog("DTR dropped, resetting modem (dtrmode = %i)\n", dev->dtrmode);
|
||||
modem_log("DTR dropped, resetting modem (dtrmode = %i)\n", dev->dtrmode);
|
||||
modem_send_res(dev, ResNOCARRIER);
|
||||
modem_reset(dev);
|
||||
break;
|
||||
@@ -1100,7 +1167,8 @@ fifo8_resize_2x(Fifo8* fifo)
|
||||
|
||||
#define TEL_CLIENT 0
|
||||
#define TEL_SERVER 1
|
||||
void modem_process_telnet(modem_t* modem, uint8_t *data, uint32_t size)
|
||||
void
|
||||
modem_process_telnet(modem_t *modem, uint8_t *data, uint32_t size)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
for (i = 0; i < size; i++) {
|
||||
@@ -1117,14 +1185,20 @@ void modem_process_telnet(modem_t* modem, uint8_t *data, uint32_t size)
|
||||
}
|
||||
switch (modem->telClient.command) {
|
||||
case 251: /* Will */
|
||||
if (c == 0) modem->telClient.binary[TEL_SERVER] = true;
|
||||
if (c == 1) modem->telClient.echo[TEL_SERVER] = true;
|
||||
if (c == 3) modem->telClient.supressGA[TEL_SERVER] = true;
|
||||
if (c == 0)
|
||||
modem->telClient.binary[TEL_SERVER] = true;
|
||||
if (c == 1)
|
||||
modem->telClient.echo[TEL_SERVER] = true;
|
||||
if (c == 3)
|
||||
modem->telClient.supressGA[TEL_SERVER] = true;
|
||||
break;
|
||||
case 252: /* Won't */
|
||||
if (c == 0) modem->telClient.binary[TEL_SERVER] = false;
|
||||
if (c == 1) modem->telClient.echo[TEL_SERVER] = false;
|
||||
if (c == 3) modem->telClient.supressGA[TEL_SERVER] = false;
|
||||
if (c == 0)
|
||||
modem->telClient.binary[TEL_SERVER] = false;
|
||||
if (c == 1)
|
||||
modem->telClient.echo[TEL_SERVER] = false;
|
||||
if (c == 3)
|
||||
modem->telClient.supressGA[TEL_SERVER] = false;
|
||||
break;
|
||||
case 253: /* Do */
|
||||
if (c == 0) {
|
||||
@@ -1202,7 +1276,6 @@ void modem_process_telnet(modem_t* modem, uint8_t *data, uint32_t size)
|
||||
static int
|
||||
modem_rx(void *priv, uint8_t *buf, int io_len)
|
||||
{
|
||||
#if 1
|
||||
modem_t *modem = (modem_t *) priv;
|
||||
uint32_t i = 0;
|
||||
|
||||
@@ -1211,7 +1284,7 @@ modem_rx(void *priv, uint8_t *buf, int io_len)
|
||||
|
||||
if (!modem->connected) {
|
||||
/* Drop packet. */
|
||||
pclog("Dropping %d bytes\n", io_len - 14);
|
||||
modem_log("Dropping %d bytes\n", io_len - 14);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1220,11 +1293,11 @@ modem_rx(void *priv, uint8_t *buf, int io_len)
|
||||
}
|
||||
|
||||
if (!(buf[12] == 0x08 && buf[13] == 0x00)) {
|
||||
pclog("Dropping %d bytes (non-IP packet (ethtype 0x%02X%02X))\n", io_len - 14, buf[12], buf[13]);
|
||||
modem_log("Dropping %d bytes (non-IP packet (ethtype 0x%02X%02X))\n", io_len - 14, buf[12], buf[13]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
pclog("Receiving %d bytes\n", io_len - 14);
|
||||
modem_log("Receiving %d bytes\n", io_len - 14);
|
||||
/* Strip the Ethernet header. */
|
||||
io_len -= 14;
|
||||
buf += 14;
|
||||
@@ -1247,7 +1320,6 @@ modem_rx(void *priv, uint8_t *buf, int io_len)
|
||||
}
|
||||
fifo8_push(&modem->rx_data, END);
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1280,7 +1352,7 @@ static void
|
||||
modem_cmdpause_timer_callback(void *priv)
|
||||
{
|
||||
modem_t *modem = (modem_t *) priv;
|
||||
uint32_t guard_threashold = 0;
|
||||
uint32_t guard_threshold = 0;
|
||||
timer_on_auto(&modem->cmdpause_timer, 1000);
|
||||
|
||||
if (modem->tcpIpConnInProgress) {
|
||||
@@ -1331,8 +1403,7 @@ modem_cmdpause_timer_callback(void *priv)
|
||||
if (modem->ringing) {
|
||||
if (modem->ringtimer <= 0) {
|
||||
modem->reg[MREG_RING_COUNT]++;
|
||||
if ((modem->reg[MREG_AUTOANSWER_COUNT] > 0) &&
|
||||
(modem->reg[MREG_RING_COUNT] >= modem->reg[MREG_AUTOANSWER_COUNT])) {
|
||||
if ((modem->reg[MREG_AUTOANSWER_COUNT] > 0) && (modem->reg[MREG_RING_COUNT] >= modem->reg[MREG_AUTOANSWER_COUNT])) {
|
||||
modem_accept_incoming_call(modem);
|
||||
return;
|
||||
}
|
||||
@@ -1350,8 +1421,7 @@ modem_cmdpause_timer_callback(void *priv)
|
||||
modem->tx_count = 0;
|
||||
fifo8_reset(&modem->rx_data);
|
||||
}
|
||||
}
|
||||
else if (modem->connected && modem->tcpIpMode) {
|
||||
} else if (modem->connected && modem->tcpIpMode) {
|
||||
if (modem->tx_count) {
|
||||
int wouldblock = 0;
|
||||
int res = plat_netsocket_send(modem->clientsocket, modem->tx_pkt_ser_line, modem->tx_count, &wouldblock);
|
||||
@@ -1393,12 +1463,12 @@ modem_cmdpause_timer_callback(void *priv)
|
||||
}
|
||||
|
||||
modem->cmdpause++;
|
||||
guard_threashold = (uint32_t)(modem->reg[MREG_GUARD_TIME] * 20);
|
||||
if (modem->cmdpause > guard_threashold) {
|
||||
guard_threshold = (uint32_t) (modem->reg[MREG_GUARD_TIME] * 20);
|
||||
if (modem->cmdpause > guard_threshold) {
|
||||
if (modem->plusinc == 0) {
|
||||
modem->plusinc = 1;
|
||||
} else if (modem->plusinc == 4) {
|
||||
pclog("Escape sequence triggered, returning to command mode\n");
|
||||
modem_log("Escape sequence triggered, returning to command mode\n");
|
||||
modem->mode = MODEM_MODE_COMMAND;
|
||||
modem_send_res(modem, ResOK);
|
||||
modem->plusinc = 0;
|
||||
@@ -1414,7 +1484,6 @@ modem_init(const device_t *info)
|
||||
const char *phonebook_file = NULL;
|
||||
memset(modem->mac, 0xfc, 6);
|
||||
|
||||
|
||||
modem->port = device_get_config_int("port");
|
||||
modem->baudrate = device_get_config_int("baudrate");
|
||||
modem->listen_port = device_get_config_int("listen_port");
|
||||
@@ -1442,7 +1511,8 @@ modem_init(const device_t *info)
|
||||
return modem;
|
||||
}
|
||||
|
||||
void modem_close(void *priv)
|
||||
void
|
||||
modem_close(void *priv)
|
||||
{
|
||||
modem_t *modem = (modem_t *) priv;
|
||||
modem->listen_port = 0;
|
||||
@@ -1453,6 +1523,7 @@ void modem_close(void *priv)
|
||||
free(priv);
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
static const device_config_t modem_config[] = {
|
||||
{
|
||||
.name = "port",
|
||||
@@ -1522,6 +1593,7 @@ static const device_config_t modem_config[] = {
|
||||
},
|
||||
{ .name = "", .description = "", .type = CONFIG_END }
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
const device_t modem_device = {
|
||||
.name = "Standard Hayes-compliant Modem",
|
||||
|
@@ -19,7 +19,8 @@
|
||||
#include <ws2tcpip.h>
|
||||
#include <winerror.h>
|
||||
|
||||
SOCKET plat_netsocket_create(int type)
|
||||
SOCKET
|
||||
plat_netsocket_create(int type)
|
||||
{
|
||||
SOCKET socket = -1;
|
||||
u_long yes = 1;
|
||||
@@ -36,7 +37,8 @@ SOCKET plat_netsocket_create(int type)
|
||||
return socket;
|
||||
}
|
||||
|
||||
SOCKET plat_netsocket_create_server(int type, unsigned short port)
|
||||
SOCKET
|
||||
plat_netsocket_create_server(int type, unsigned short port)
|
||||
{
|
||||
struct sockaddr_in sock_addr;
|
||||
SOCKET socket = -1;
|
||||
@@ -70,12 +72,14 @@ SOCKET plat_netsocket_create_server(int type, unsigned short port)
|
||||
return socket;
|
||||
}
|
||||
|
||||
void plat_netsocket_close(SOCKET socket)
|
||||
void
|
||||
plat_netsocket_close(SOCKET socket)
|
||||
{
|
||||
closesocket((SOCKET) socket);
|
||||
}
|
||||
|
||||
SOCKET plat_netsocket_accept(SOCKET socket)
|
||||
SOCKET
|
||||
plat_netsocket_accept(SOCKET socket)
|
||||
{
|
||||
SOCKET clientsocket = accept(socket, NULL, NULL);
|
||||
|
||||
@@ -85,7 +89,8 @@ SOCKET plat_netsocket_accept(SOCKET socket)
|
||||
return clientsocket;
|
||||
}
|
||||
|
||||
int plat_netsocket_connected(SOCKET socket)
|
||||
int
|
||||
plat_netsocket_connected(SOCKET socket)
|
||||
{
|
||||
struct sockaddr addr;
|
||||
socklen_t len = sizeof(struct sockaddr);
|
||||
@@ -131,7 +136,8 @@ int plat_netsocket_connected(SOCKET socket)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int plat_netsocket_connect(SOCKET socket, const char* hostname, unsigned short port)
|
||||
int
|
||||
plat_netsocket_connect(SOCKET socket, const char *hostname, unsigned short port)
|
||||
{
|
||||
struct sockaddr_in sock_addr;
|
||||
int res = -1;
|
||||
@@ -164,7 +170,8 @@ int plat_netsocket_connect(SOCKET socket, const char* hostname, unsigned short p
|
||||
return res;
|
||||
}
|
||||
|
||||
int plat_netsocket_send(SOCKET socket, const unsigned char* data, unsigned int size, int *wouldblock)
|
||||
int
|
||||
plat_netsocket_send(SOCKET socket, const unsigned char *data, unsigned int size, int *wouldblock)
|
||||
{
|
||||
int res = send(socket, (const char *) data, size, 0);
|
||||
|
||||
@@ -179,7 +186,8 @@ int plat_netsocket_send(SOCKET socket, const unsigned char* data, unsigned int s
|
||||
return res;
|
||||
}
|
||||
|
||||
int plat_netsocket_receive(SOCKET socket, unsigned char* data, unsigned int size, int *wouldblock)
|
||||
int
|
||||
plat_netsocket_receive(SOCKET socket, unsigned char *data, unsigned int size, int *wouldblock)
|
||||
{
|
||||
int res = recv(socket, (char *) data, size, 0);
|
||||
|
||||
|
@@ -19,17 +19,14 @@
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <netdb.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <string.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/select.h>
|
||||
#include <unistd.h>
|
||||
|
||||
SOCKET plat_netsocket_create(int type)
|
||||
SOCKET
|
||||
plat_netsocket_create(int type)
|
||||
{
|
||||
SOCKET fd = -1;
|
||||
int yes = 1;
|
||||
@@ -47,7 +44,8 @@ SOCKET plat_netsocket_create(int type)
|
||||
return fd;
|
||||
}
|
||||
|
||||
SOCKET plat_netsocket_create_server(int type, unsigned short port)
|
||||
SOCKET
|
||||
plat_netsocket_create_server(int type, unsigned short port)
|
||||
{
|
||||
struct sockaddr_in sock_addr;
|
||||
SOCKET fd = -1;
|
||||
@@ -82,12 +80,14 @@ SOCKET plat_netsocket_create_server(int type, unsigned short port)
|
||||
return fd;
|
||||
}
|
||||
|
||||
void plat_netsocket_close(SOCKET socket)
|
||||
void
|
||||
plat_netsocket_close(SOCKET socket)
|
||||
{
|
||||
close((SOCKET) socket);
|
||||
}
|
||||
|
||||
SOCKET plat_netsocket_accept(SOCKET socket)
|
||||
SOCKET
|
||||
plat_netsocket_accept(SOCKET socket)
|
||||
{
|
||||
SOCKET clientsocket = accept(socket, NULL, NULL);
|
||||
|
||||
@@ -97,7 +97,8 @@ SOCKET plat_netsocket_accept(SOCKET socket)
|
||||
return clientsocket;
|
||||
}
|
||||
|
||||
int plat_netsocket_connected(SOCKET socket)
|
||||
int
|
||||
plat_netsocket_connected(SOCKET socket)
|
||||
{
|
||||
struct sockaddr addr;
|
||||
socklen_t len = sizeof(struct sockaddr);
|
||||
@@ -135,7 +136,8 @@ int plat_netsocket_connected(SOCKET socket)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int plat_netsocket_connect(SOCKET socket, const char* hostname, unsigned short port)
|
||||
int
|
||||
plat_netsocket_connect(SOCKET socket, const char *hostname, unsigned short port)
|
||||
{
|
||||
struct sockaddr_in sock_addr;
|
||||
int res = -1;
|
||||
@@ -168,7 +170,8 @@ int plat_netsocket_connect(SOCKET socket, const char* hostname, unsigned short p
|
||||
return res;
|
||||
}
|
||||
|
||||
int plat_netsocket_send(SOCKET socket, const unsigned char* data, unsigned int size, int *wouldblock)
|
||||
int
|
||||
plat_netsocket_send(SOCKET socket, const unsigned char *data, unsigned int size, int *wouldblock)
|
||||
{
|
||||
int res = send(socket, (const char *) data, size, 0);
|
||||
|
||||
@@ -183,7 +186,8 @@ int plat_netsocket_send(SOCKET socket, const unsigned char* data, unsigned int s
|
||||
return res;
|
||||
}
|
||||
|
||||
int plat_netsocket_receive(SOCKET socket, unsigned char* data, unsigned int size, int *wouldblock)
|
||||
int
|
||||
plat_netsocket_receive(SOCKET socket, unsigned char *data, unsigned int size, int *wouldblock)
|
||||
{
|
||||
int res = recv(socket, (char *) data, size, 0);
|
||||
|
||||
|
Reference in New Issue
Block a user