Send the open flag sequence only when enough time elapsed since prior

closing flag sequence. See RFC1662 §4.4.2, last paragraph.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39628 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Philippe Houdoin
2010-11-25 16:34:02 +00:00
parent 7ca71ab6a2
commit 8d25a74c68
@@ -46,6 +46,7 @@ struct dialup_device : net_device {
int fd; int fd;
struct termios line_config; struct termios line_config;
dialup_state state; dialup_state state;
bigtime_t last_closing_flag_sequence_time;
bool data_mode; bool data_mode;
char init_string[64]; char init_string[64];
char dial_string[64]; char dial_string[64];
@@ -205,9 +206,11 @@ dialup_init(const char* name, net_device** _device)
device->mtu = 1500; device->mtu = 1500;
device->media = 0; device->media = 0;
device->header_length = HDLC_HEADER_LENGTH; device->header_length = HDLC_HEADER_LENGTH;
device->fd = -1; device->fd = -1;
device->state = DOWN; device->state = DOWN;
device->data_mode = false; device->data_mode = false;
device->last_closing_flag_sequence_time = 0;
// default AT strings // default AT strings
strncpy(device->init_string, "ATZ", sizeof(device->init_string)); strncpy(device->init_string, "ATZ", sizeof(device->init_string));
@@ -362,6 +365,7 @@ dialup_send_data(net_device* _device, net_buffer* buffer)
int packetSize = 0; int packetSize = 0;
status_t status; status_t status;
ssize_t bytesWritten; ssize_t bytesWritten;
bigtime_t now;
uint32 vectorCount = gBufferModule->count_iovecs(buffer); uint32 vectorCount = gBufferModule->count_iovecs(buffer);
if (vectorCount < 1) { if (vectorCount < 1) {
@@ -385,7 +389,12 @@ dialup_send_data(net_device* _device, net_buffer* buffer)
goto err; goto err;
} }
// mark frame start // Mark frame start if the prior frame closing flag was sent
// more than a second ago.
// Otherwise, the prior closing flag sequence is the open flag of this
// frame
now = system_time();
if (now - device->last_closing_flag_sequence_time > 1000000)
packet[packetSize++] = HDLC_FLAG_SEQUENCE; packet[packetSize++] = HDLC_FLAG_SEQUENCE;
// encode frame data // encode frame data
@@ -416,6 +425,7 @@ dialup_send_data(net_device* _device, net_buffer* buffer)
status = errno; status = errno;
goto err; goto err;
} }
device->last_closing_flag_sequence_time = system_time();
device->stats.send.packets++; device->stats.send.packets++;
device->stats.send.bytes += bytesWritten; device->stats.send.bytes += bytesWritten;