Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/slip/slip.c

    re141281 rc1694b6b  
    3737#include <stdio.h>
    3838#include <stdint.h>
     39#include <stdlib.h>
    3940#include <loc.h>
    4041#include <inet/addr.h>
    4142#include <inet/iplink_srv.h>
    42 #include <char_dev_iface.h>
     43#include <io/chardev.h>
    4344#include <io/log.h>
    4445#include <errno.h>
     46#include <str_error.h>
    4547#include <task.h>
    4648
     
    9698}
    9799
    98 static void write_flush(async_sess_t *sess)
     100static void write_flush(chardev_t *chardev)
    99101{
    100102        size_t written = 0;
    101103
    102104        while (slip_send_pending > 0) {
    103                 ssize_t size;
    104 
    105                 size = char_dev_write(sess, &slip_send_buf[written],
    106                     slip_send_pending);
    107                 if (size < 0) {
     105                int rc;
     106                size_t nwr;
     107
     108                rc = chardev_write(chardev, &slip_send_buf[written],
     109                    slip_send_pending, &nwr);
     110                if (rc != EOK) {
    108111                        log_msg(LOG_DEFAULT, LVL_ERROR,
    109                             "char_dev_write() returned %d",
    110                             (int) size);
     112                            "chardev_write() -> %s", str_error_name(rc));
    111113                        slip_send_pending = 0;
    112114                        break;
    113115                }
    114                 written += size;
    115                 slip_send_pending -= size;
    116         }
    117 }
    118 
    119 static void write_buffered(async_sess_t *sess, uint8_t ch)
     116                written += nwr;
     117                slip_send_pending -= nwr;
     118        }
     119}
     120
     121static void write_buffered(chardev_t *chardev, uint8_t ch)
    120122{
    121123        if (slip_send_pending == sizeof(slip_send_buf))
    122                 write_flush(sess);
     124                write_flush(chardev);
    123125        slip_send_buf[slip_send_pending++] = ch;
    124126}
     
    128130        log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_send()");
    129131       
    130         async_sess_t *sess = (async_sess_t *) srv->arg;
     132        chardev_t *chardev = (chardev_t *) srv->arg;
    131133        uint8_t *data = sdu->data;
    132134       
     
    136138         * measure for dealing with previous possible noise on the line.
    137139         */
    138         write_buffered(sess, SLIP_END);
     140        write_buffered(chardev, SLIP_END);
    139141       
    140142        for (size_t i = 0; i < sdu->size; i++) {
    141143                switch (data[i]) {
    142144                case SLIP_END:
    143                         write_buffered(sess, SLIP_ESC);
    144                         write_buffered(sess, SLIP_ESC_END);
     145                        write_buffered(chardev, SLIP_ESC);
     146                        write_buffered(chardev, SLIP_ESC_END);
    145147                        break;
    146148                case SLIP_ESC:
    147                         write_buffered(sess, SLIP_ESC);
    148                         write_buffered(sess, SLIP_ESC_ESC);
     149                        write_buffered(chardev, SLIP_ESC);
     150                        write_buffered(chardev, SLIP_ESC_ESC);
    149151                        break;
    150152                default:
    151                         write_buffered(sess, data[i]);
     153                        write_buffered(chardev, data[i]);
    152154                        break;
    153155                }
    154156        }
    155157       
    156         write_buffered(sess, SLIP_END);
    157         write_flush(sess);
     158        write_buffered(chardev, SLIP_END);
     159        write_flush(chardev);
    158160       
    159161        return EOK;
     
    203205}
    204206
    205 static uint8_t read_buffered(async_sess_t *sess)
     207static uint8_t read_buffered(chardev_t *chardev)
    206208{
    207209        while (slip_recv_pending == 0) {
    208                 ssize_t size;
    209 
    210                 size = char_dev_read(sess, slip_recv_buf,
    211                     sizeof(slip_recv_buf));
    212                 if (size < 0) {
     210                int rc;
     211                size_t nread;
     212
     213                rc = chardev_read(chardev, slip_recv_buf,
     214                    sizeof(slip_recv_buf), &nread);
     215                if (rc != EOK) {
    213216                        log_msg(LOG_DEFAULT, LVL_ERROR,
    214                             "char_dev_read() returned %d", (int) size);
     217                            "char_dev_read() -> %s", str_error_name(rc));
     218                }
     219
     220                if (nread == 0)
    215221                        return SLIP_END;
    216                 }
    217                 slip_recv_pending = size;
     222
     223                slip_recv_pending = nread;
    218224                slip_recv_read = 0;
    219225        }
     
    224230static int slip_recv_fibril(void *arg)
    225231{
    226         async_sess_t *sess = (async_sess_t *) arg;
     232        chardev_t *chardev = (chardev_t *) arg;
    227233        static uint8_t recv_final[SLIP_MTU];
    228234        iplink_recv_sdu_t sdu;
     
    234240        while (true) {
    235241                for (sdu.size = 0; sdu.size < sizeof(recv_final); /**/) {
    236                         ch = read_buffered(sess);
     242                        ch = read_buffered(chardev);
    237243                        switch (ch) {
    238244                        case SLIP_END:
     
    246252
    247253                        case SLIP_ESC:
    248                                 ch = read_buffered(sess);
     254                                ch = read_buffered(chardev);
    249255                                if (ch == SLIP_ESC_END) {
    250256                                        recv_final[sdu.size++] = SLIP_END;
    251257                                        break;
    252                                 } else if (ch ==  SLIP_ESC_ESC) {
     258                                } else if (ch == SLIP_ESC_ESC) {
    253259                                        recv_final[sdu.size++] = SLIP_ESC;
    254260                                        break;
     
    281287                if (rc != EOK) {
    282288                        log_msg(LOG_DEFAULT, LVL_ERROR,
    283                             "iplink_ev_recv() returned %d", rc);
     289                            "iplink_ev_recv() -> %s", str_error_name(rc));
    284290                }
    285291        }
     
    295301        async_sess_t *sess_in = NULL;
    296302        async_sess_t *sess_out = NULL;
     303        chardev_t *chardev_in = NULL;
     304        chardev_t *chardev_out = NULL;
    297305        fid_t fid;
    298306        int rc;
     
    336344                return ENOENT;
    337345        }
    338         slip_iplink.arg = sess_out;
     346
     347        rc = chardev_open(sess_out, &chardev_out);
     348        if (rc != EOK) {
     349                log_msg(LOG_DEFAULT, LVL_ERROR,
     350                    "Failed opening character device.");
     351                return ENOENT;
     352        }
     353
     354        slip_iplink.arg = chardev_out;
    339355
    340356        sess_in = loc_service_connect(svcid, INTERFACE_DDF, 0);
     
    347363        }
    348364
     365        rc = chardev_open(sess_in, &chardev_in);
     366        if (rc != EOK) {
     367                log_msg(LOG_DEFAULT, LVL_ERROR,
     368                    "Failed opening character device.");
     369                return ENOENT;
     370        }
     371
    349372        rc = loc_service_register(linkstr, &linksid);
    350373        if (rc != EOK) {
     
    363386        }
    364387
    365         fid = fibril_create(slip_recv_fibril, sess_in);
     388        fid = fibril_create(slip_recv_fibril, chardev_in);
    366389        if (!fid) {
    367390                log_msg(LOG_DEFAULT, LVL_ERROR,
     
    375398
    376399fail:
     400        chardev_close(chardev_out);
    377401        if (sess_out)
    378402                async_hangup(sess_out);
     403        chardev_close(chardev_in);
    379404        if (sess_in)
    380405                async_hangup(sess_in);
Note: See TracChangeset for help on using the changeset viewer.