Ignore:
File:
1 edited

Legend:

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

    rc1694b6b re141281  
    3737#include <stdio.h>
    3838#include <stdint.h>
    39 #include <stdlib.h>
    4039#include <loc.h>
    4140#include <inet/addr.h>
    4241#include <inet/iplink_srv.h>
    43 #include <io/chardev.h>
     42#include <char_dev_iface.h>
    4443#include <io/log.h>
    4544#include <errno.h>
    46 #include <str_error.h>
    4745#include <task.h>
    4846
     
    9896}
    9997
    100 static void write_flush(chardev_t *chardev)
     98static void write_flush(async_sess_t *sess)
    10199{
    102100        size_t written = 0;
    103101
    104102        while (slip_send_pending > 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) {
     103                ssize_t size;
     104
     105                size = char_dev_write(sess, &slip_send_buf[written],
     106                    slip_send_pending);
     107                if (size < 0) {
    111108                        log_msg(LOG_DEFAULT, LVL_ERROR,
    112                             "chardev_write() -> %s", str_error_name(rc));
     109                            "char_dev_write() returned %d",
     110                            (int) size);
    113111                        slip_send_pending = 0;
    114112                        break;
    115113                }
    116                 written += nwr;
    117                 slip_send_pending -= nwr;
    118         }
    119 }
    120 
    121 static void write_buffered(chardev_t *chardev, uint8_t ch)
     114                written += size;
     115                slip_send_pending -= size;
     116        }
     117}
     118
     119static void write_buffered(async_sess_t *sess, uint8_t ch)
    122120{
    123121        if (slip_send_pending == sizeof(slip_send_buf))
    124                 write_flush(chardev);
     122                write_flush(sess);
    125123        slip_send_buf[slip_send_pending++] = ch;
    126124}
     
    130128        log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_send()");
    131129       
    132         chardev_t *chardev = (chardev_t *) srv->arg;
     130        async_sess_t *sess = (async_sess_t *) srv->arg;
    133131        uint8_t *data = sdu->data;
    134132       
     
    138136         * measure for dealing with previous possible noise on the line.
    139137         */
    140         write_buffered(chardev, SLIP_END);
     138        write_buffered(sess, SLIP_END);
    141139       
    142140        for (size_t i = 0; i < sdu->size; i++) {
    143141                switch (data[i]) {
    144142                case SLIP_END:
    145                         write_buffered(chardev, SLIP_ESC);
    146                         write_buffered(chardev, SLIP_ESC_END);
     143                        write_buffered(sess, SLIP_ESC);
     144                        write_buffered(sess, SLIP_ESC_END);
    147145                        break;
    148146                case SLIP_ESC:
    149                         write_buffered(chardev, SLIP_ESC);
    150                         write_buffered(chardev, SLIP_ESC_ESC);
     147                        write_buffered(sess, SLIP_ESC);
     148                        write_buffered(sess, SLIP_ESC_ESC);
    151149                        break;
    152150                default:
    153                         write_buffered(chardev, data[i]);
     151                        write_buffered(sess, data[i]);
    154152                        break;
    155153                }
    156154        }
    157155       
    158         write_buffered(chardev, SLIP_END);
    159         write_flush(chardev);
     156        write_buffered(sess, SLIP_END);
     157        write_flush(sess);
    160158       
    161159        return EOK;
     
    205203}
    206204
    207 static uint8_t read_buffered(chardev_t *chardev)
     205static uint8_t read_buffered(async_sess_t *sess)
    208206{
    209207        while (slip_recv_pending == 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) {
     208                ssize_t size;
     209
     210                size = char_dev_read(sess, slip_recv_buf,
     211                    sizeof(slip_recv_buf));
     212                if (size < 0) {
    216213                        log_msg(LOG_DEFAULT, LVL_ERROR,
    217                             "char_dev_read() -> %s", str_error_name(rc));
     214                            "char_dev_read() returned %d", (int) size);
     215                        return SLIP_END;
    218216                }
    219 
    220                 if (nread == 0)
    221                         return SLIP_END;
    222 
    223                 slip_recv_pending = nread;
     217                slip_recv_pending = size;
    224218                slip_recv_read = 0;
    225219        }
     
    230224static int slip_recv_fibril(void *arg)
    231225{
    232         chardev_t *chardev = (chardev_t *) arg;
     226        async_sess_t *sess = (async_sess_t *) arg;
    233227        static uint8_t recv_final[SLIP_MTU];
    234228        iplink_recv_sdu_t sdu;
     
    240234        while (true) {
    241235                for (sdu.size = 0; sdu.size < sizeof(recv_final); /**/) {
    242                         ch = read_buffered(chardev);
     236                        ch = read_buffered(sess);
    243237                        switch (ch) {
    244238                        case SLIP_END:
     
    252246
    253247                        case SLIP_ESC:
    254                                 ch = read_buffered(chardev);
     248                                ch = read_buffered(sess);
    255249                                if (ch == SLIP_ESC_END) {
    256250                                        recv_final[sdu.size++] = SLIP_END;
    257251                                        break;
    258                                 } else if (ch == SLIP_ESC_ESC) {
     252                                } else if (ch ==  SLIP_ESC_ESC) {
    259253                                        recv_final[sdu.size++] = SLIP_ESC;
    260254                                        break;
     
    287281                if (rc != EOK) {
    288282                        log_msg(LOG_DEFAULT, LVL_ERROR,
    289                             "iplink_ev_recv() -> %s", str_error_name(rc));
     283                            "iplink_ev_recv() returned %d", rc);
    290284                }
    291285        }
     
    301295        async_sess_t *sess_in = NULL;
    302296        async_sess_t *sess_out = NULL;
    303         chardev_t *chardev_in = NULL;
    304         chardev_t *chardev_out = NULL;
    305297        fid_t fid;
    306298        int rc;
     
    344336                return ENOENT;
    345337        }
    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;
     338        slip_iplink.arg = sess_out;
    355339
    356340        sess_in = loc_service_connect(svcid, INTERFACE_DDF, 0);
     
    363347        }
    364348
    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 
    372349        rc = loc_service_register(linkstr, &linksid);
    373350        if (rc != EOK) {
     
    386363        }
    387364
    388         fid = fibril_create(slip_recv_fibril, chardev_in);
     365        fid = fibril_create(slip_recv_fibril, sess_in);
    389366        if (!fid) {
    390367                log_msg(LOG_DEFAULT, LVL_ERROR,
     
    398375
    399376fail:
    400         chardev_close(chardev_out);
    401377        if (sess_out)
    402378                async_hangup(sess_out);
    403         chardev_close(chardev_in);
    404379        if (sess_in)
    405380                async_hangup(sess_in);
Note: See TracChangeset for help on using the changeset viewer.