[haiku-commits] r40246 - haiku/trunk/src/add-ons/kernel/network/devices/dialup

  • From: philippe.houdoin@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 18 Jan 2011 20:57:22 +0100 (CET)

Author: phoudoin
Date: 2011-01-18 20:57:22 +0100 (Tue, 18 Jan 2011)
New Revision: 40246
Changeset: http://dev.haiku-os.org/changeset/40246

Modified:
   haiku/trunk/src/add-ons/kernel/network/devices/dialup/dialup.cpp
Log:
Add ACCM support (Async Control Char Map) for RX & TX.
Add quick & dirty receive_data() hook.


Modified: haiku/trunk/src/add-ons/kernel/network/devices/dialup/dialup.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/network/devices/dialup/dialup.cpp    
2011-01-18 19:39:13 UTC (rev 40245)
+++ haiku/trunk/src/add-ons/kernel/network/devices/dialup/dialup.cpp    
2011-01-18 19:57:22 UTC (rev 40246)
@@ -53,6 +53,9 @@
        char                    escape_string[8];
        bigtime_t               escape_silence;
        char                    hangup_string[16];
+       bigtime_t               flag_timeout;
+       uint32                  rx_accm;
+       uint32                  tx_accm[8];
 };
 
 net_buffer_module_info* gBufferModule;
@@ -220,6 +223,12 @@
        strncpy(device->escape_string, "+++", sizeof(device->escape_string));
        device->escape_silence = 1000000;
 
+       device->tx_flag_timeout = 1000000;
+
+       // default rx & tx Async-Control-Character-Map
+       memset(device->rx_accm, 0xFF, sizeof(device->rx_accm));
+       memset(device->tx_accm, 0xFF, sizeof(device->tx_accm));
+
        *_device = device;
        return B_OK;
 }
@@ -365,7 +374,6 @@
        int packetSize = 0;
        status_t status;
        ssize_t bytesWritten;
-       bigtime_t now;
 
        uint32 vectorCount = gBufferModule->count_iovecs(buffer);
        if (vectorCount < 1) {
@@ -393,9 +401,10 @@
        // 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)
+       if (device->flag_timeout
+               && system_time() - device->last_closing_flag_sequence_time > 
device->flagt_timeout) {
                packet[packetSize++] = HDLC_FLAG_SEQUENCE;
+       }
 
        // encode frame data
        ioVector = ioVectors;
@@ -450,7 +459,50 @@
        if (device->fd == -1)
                return B_FILE_ERROR;
 
-       return ENOBUFS;
+       net_buffer* buffer = gBufferModule->create(256);
+       if (buffer == NULL)
+               return ENOBUFS;
+
+       ssize_t bytesRead;
+       uint8* data;
+       packet = (uint8*)malloc(2 + 2 * buffer->size);
+       if (packet == NULL) {
+               status = B_NO_MEMORY;
+               goto err;
+       }
+
+       status_t status = gBufferModule->append_size(buffer, device->mtu + 
HDLC_HEADER_LENGTH, &data);
+       if (status == B_OK && data == NULL) {
+               dprintf("scattered I/O is not yet supported by dialup 
device.\n");
+               status = B_NOT_SUPPORTED;
+       }
+       if (status < B_OK)
+               goto err;
+
+       while (true) {
+               bytesRead = read(device->fd, data, device->frame_size);
+               if (bytesRead < 0) {
+
+       }
+
+       status = gBufferModule->trim(buffer, bytesRead);
+       if (status < B_OK) {
+               device->stats.receive.dropped++;
+               goto err;
+       }
+
+       device->stats.receive.bytes += bytesRead;
+       device->stats.receive.packets++;
+
+       *_buffer = buffer;
+       return B_OK;
+
+err:
+       gBufferModule->free(buffer);
+
+done:
+       free(packet);
+       return status;
 }
 
 


Other related posts:

  • » [haiku-commits] r40246 - haiku/trunk/src/add-ons/kernel/network/devices/dialup - philippe . houdoin