From 0103776770e30b5943ba447380f9ab6e08f41d45 Mon Sep 17 00:00:00 2001 From: Philippe Houdoin Date: Tue, 23 Nov 2010 13:51:30 +0000 Subject: [PATCH] Add initial up & down support. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39582 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/network/devices/dialup/dialup.cpp | 103 ++++++++++-------- 1 file changed, 56 insertions(+), 47 deletions(-) diff --git a/src/add-ons/kernel/network/devices/dialup/dialup.cpp b/src/add-ons/kernel/network/devices/dialup/dialup.cpp index ab8bc28bb0..7ba3c6ec65 100644 --- a/src/add-ons/kernel/network/devices/dialup/dialup.cpp +++ b/src/add-ons/kernel/network/devices/dialup/dialup.cpp @@ -56,6 +56,43 @@ static net_stack_module_info* sStackModule; // #pragma mark - +static status_t +switch_to_command_mode(dialup_device* device) +{ + if (device->state != UP || !device->data_mode) + return B_ERROR; + + snooze(device->escape_silence); + + ssize_t size = write(device->fd, device->escape_string, + strlen(device->escape_string)); + if (size != (ssize_t)strlen(device->escape_string)) + return B_IO_ERROR; + + snooze(device->escape_silence); + device->data_mode = false; + return B_OK; +} + +#if 0 +static status_t +switch_to_data_mode(dialup_device* device) +{ + if (device->state != UP) + return B_OK; + + // TODO: check if it's needed, as these days any + // escaped AT commands switch back to data mode automatically + // after their completion... + ssize_t size = write(device->fd, "ATO", 3); + if (size != 3) + return B_IO_ERROR; + + device->data_mode = true; + return B_OK; +} +#endif + static status_t send_command(dialup_device* device, const char* command) { @@ -66,11 +103,11 @@ send_command(dialup_device* device, const char* command) return status; } - ssize_t bytesWritten = write(device->fd, command, strlen(command); + ssize_t bytesWritten = write(device->fd, command, strlen(command)); if (bytesWritten != (ssize_t)strlen(command)) return B_IO_ERROR; - if (write(fd, "\r", 1) != 1) + if (write(device->fd, "\r", 1) != 1) return B_IO_ERROR; return B_OK; @@ -116,56 +153,22 @@ read_command_reply(dialup_device* device, const char* command, static status_t -switch_to_command_mode(dialup_device* device) -{ - if (device->state != UP || !device->data_mode) - return B_ERROR; - - snooze(device->escape_silence); - - ssize_t size = write(device->fd, device->escape_string, - strlen(device->escape_string)); - if (size != (ssize_t)strlen(device->escape_string)) - return B_IO_ERROR; - - snooze(device->escape_silence); - device->data_mode = false; - return B_OK; -} - - -static status_t -switch_to_data_mode(dialup_device* device) -{ - if (device->state != UP) - return B_OK; - - // TODO: check if it's needed, as these days any - // escaped AT commands switch back to data mode automatically - // after their completion... - status_t status = send_command(device, "ATO"); - if (status == B_OK); - device->data_mode = true; - - return status; -} - - -static status_t -hangup_device(dialup_device* device) +hangup(dialup_device* device) { if (device->state != UP) return B_ERROR; // TODO: turn device's DTR down instead. Or do that too after sending command char reply[8]; + if (send_command(device, device->hangup_string) != B_OK || read_command_reply(device, device->hangup_string, reply, sizeof(reply)) != B_OK || strcmp(reply, "OK")) return B_ERROR; - device->flags &= ~IFF_LINK; + device->state = DOWN; + return B_OK; } @@ -270,23 +273,28 @@ dialup_up(net_device* _device) } // Send dialing string - if (send_command(device, device->dialing_string) != B_OK - || read_command_reply(device, device->dialing_string, + if (send_command(device, device->dial_string) != B_OK + || read_command_reply(device, device->dial_string, reply, sizeof(reply)) != B_OK || strncmp(reply, "CONNECT", 7)) { errno = B_IO_ERROR; goto err; } + + device->state = UP; device->data_mode = true; - device->media |= IFM_FULL_DUPLEX + device->media |= IFM_FULL_DUPLEX; device->flags |= IFF_LINK; device->link_quality = 1000; if (strlen(reply) > 7) { + // get speed from "CONNECTxxxx" reply device->link_speed = atoi(&reply[8]); - else - device->link_speed = 19200; // check default baudrate + } else { + // Set default speed (theorically, it could be 300 bits/s even) + device->link_speed = 19200; + } return B_OK; @@ -304,12 +312,13 @@ dialup_down(net_device* _device) { dialup_device* device = (dialup_device*)_device; - if (device->flags & IFF_LINK && - hangup_device(device) == B_OK) + if (device->flags & IFF_LINK + && hangup(device) == B_OK) device->flags &= ~IFF_LINK; close(device->fd); device->fd = -1; + device->media = 0; }