Ignore:
File:
1 edited

Legend:

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

    r74017ce re141281  
    4040#include <inet/addr.h>
    4141#include <inet/iplink_srv.h>
    42 #include <io/chardev.h>
     42#include <char_dev_iface.h>
    4343#include <io/log.h>
    4444#include <errno.h>
     
    9696}
    9797
    98 static void write_flush(chardev_t *chardev)
     98static void write_flush(async_sess_t *sess)
    9999{
    100100        size_t written = 0;
    101101
    102102        while (slip_send_pending > 0) {
    103                 int rc;
    104                 size_t nwr;
    105 
    106                 rc = chardev_write(chardev, &slip_send_buf[written],
    107                     slip_send_pending, &nwr);
    108                 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) {
    109108                        log_msg(LOG_DEFAULT, LVL_ERROR,
    110                             "chardev_write() returned %d", rc);
     109                            "char_dev_write() returned %d",
     110                            (int) size);
    111111                        slip_send_pending = 0;
    112112                        break;
    113113                }
    114                 written += nwr;
    115                 slip_send_pending -= nwr;
    116         }
    117 }
    118 
    119 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)
    120120{
    121121        if (slip_send_pending == sizeof(slip_send_buf))
    122                 write_flush(chardev);
     122                write_flush(sess);
    123123        slip_send_buf[slip_send_pending++] = ch;
    124124}
     
    128128        log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_send()");
    129129       
    130         chardev_t *chardev = (chardev_t *) srv->arg;
     130        async_sess_t *sess = (async_sess_t *) srv->arg;
    131131        uint8_t *data = sdu->data;
    132132       
     
    136136         * measure for dealing with previous possible noise on the line.
    137137         */
    138         write_buffered(chardev, SLIP_END);
     138        write_buffered(sess, SLIP_END);
    139139       
    140140        for (size_t i = 0; i < sdu->size; i++) {
    141141                switch (data[i]) {
    142142                case SLIP_END:
    143                         write_buffered(chardev, SLIP_ESC);
    144                         write_buffered(chardev, SLIP_ESC_END);
     143                        write_buffered(sess, SLIP_ESC);
     144                        write_buffered(sess, SLIP_ESC_END);
    145145                        break;
    146146                case SLIP_ESC:
    147                         write_buffered(chardev, SLIP_ESC);
    148                         write_buffered(chardev, SLIP_ESC_ESC);
     147                        write_buffered(sess, SLIP_ESC);
     148                        write_buffered(sess, SLIP_ESC_ESC);
    149149                        break;
    150150                default:
    151                         write_buffered(chardev, data[i]);
     151                        write_buffered(sess, data[i]);
    152152                        break;
    153153                }
    154154        }
    155155       
    156         write_buffered(chardev, SLIP_END);
    157         write_flush(chardev);
     156        write_buffered(sess, SLIP_END);
     157        write_flush(sess);
    158158       
    159159        return EOK;
     
    203203}
    204204
    205 static uint8_t read_buffered(chardev_t *chardev)
     205static uint8_t read_buffered(async_sess_t *sess)
    206206{
    207207        while (slip_recv_pending == 0) {
    208                 int rc;
    209                 size_t nread;
    210 
    211                 rc = chardev_read(chardev, slip_recv_buf,
    212                     sizeof(slip_recv_buf), &nread);
    213                 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) {
    214213                        log_msg(LOG_DEFAULT, LVL_ERROR,
    215                             "char_dev_read() returned %d", rc);
     214                            "char_dev_read() returned %d", (int) size);
     215                        return SLIP_END;
    216216                }
    217 
    218                 if (nread == 0)
    219                         return SLIP_END;
    220 
    221                 slip_recv_pending = nread;
     217                slip_recv_pending = size;
    222218                slip_recv_read = 0;
    223219        }
     
    228224static int slip_recv_fibril(void *arg)
    229225{
    230         chardev_t *chardev = (chardev_t *) arg;
     226        async_sess_t *sess = (async_sess_t *) arg;
    231227        static uint8_t recv_final[SLIP_MTU];
    232228        iplink_recv_sdu_t sdu;
     
    238234        while (true) {
    239235                for (sdu.size = 0; sdu.size < sizeof(recv_final); /**/) {
    240                         ch = read_buffered(chardev);
     236                        ch = read_buffered(sess);
    241237                        switch (ch) {
    242238                        case SLIP_END:
     
    250246
    251247                        case SLIP_ESC:
    252                                 ch = read_buffered(chardev);
     248                                ch = read_buffered(sess);
    253249                                if (ch == SLIP_ESC_END) {
    254250                                        recv_final[sdu.size++] = SLIP_END;
    255251                                        break;
    256                                 } else if (ch == SLIP_ESC_ESC) {
     252                                } else if (ch ==  SLIP_ESC_ESC) {
    257253                                        recv_final[sdu.size++] = SLIP_ESC;
    258254                                        break;
     
    299295        async_sess_t *sess_in = NULL;
    300296        async_sess_t *sess_out = NULL;
    301         chardev_t *chardev_in = NULL;
    302         chardev_t *chardev_out = NULL;
    303297        fid_t fid;
    304298        int rc;
     
    342336                return ENOENT;
    343337        }
    344 
    345         rc = chardev_open(sess_out, &chardev_out);
    346         if (rc != EOK) {
    347                 log_msg(LOG_DEFAULT, LVL_ERROR,
    348                     "Failed opening character device.");
    349                 return ENOENT;
    350         }
    351 
    352         slip_iplink.arg = chardev_out;
     338        slip_iplink.arg = sess_out;
    353339
    354340        sess_in = loc_service_connect(svcid, INTERFACE_DDF, 0);
     
    361347        }
    362348
    363         rc = chardev_open(sess_in, &chardev_in);
    364         if (rc != EOK) {
    365                 log_msg(LOG_DEFAULT, LVL_ERROR,
    366                     "Failed opening character device.");
    367                 return ENOENT;
    368         }
    369 
    370349        rc = loc_service_register(linkstr, &linksid);
    371350        if (rc != EOK) {
     
    384363        }
    385364
    386         fid = fibril_create(slip_recv_fibril, chardev_in);
     365        fid = fibril_create(slip_recv_fibril, sess_in);
    387366        if (!fid) {
    388367                log_msg(LOG_DEFAULT, LVL_ERROR,
     
    396375
    397376fail:
    398         chardev_close(chardev_out);
    399377        if (sess_out)
    400378                async_hangup(sess_out);
    401         chardev_close(chardev_in);
    402379        if (sess_in)
    403380                async_hangup(sess_in);
Note: See TracChangeset for help on using the changeset viewer.