Changes in uspace/srv/net/slip/slip.c [74017ce:e141281] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/slip/slip.c
r74017ce re141281 40 40 #include <inet/addr.h> 41 41 #include <inet/iplink_srv.h> 42 #include < io/chardev.h>42 #include <char_dev_iface.h> 43 43 #include <io/log.h> 44 44 #include <errno.h> … … 96 96 } 97 97 98 static void write_flush( chardev_t *chardev)98 static void write_flush(async_sess_t *sess) 99 99 { 100 100 size_t written = 0; 101 101 102 102 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) { 109 108 log_msg(LOG_DEFAULT, LVL_ERROR, 110 "chardev_write() returned %d", rc); 109 "char_dev_write() returned %d", 110 (int) size); 111 111 slip_send_pending = 0; 112 112 break; 113 113 } 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 119 static void write_buffered(async_sess_t *sess, uint8_t ch) 120 120 { 121 121 if (slip_send_pending == sizeof(slip_send_buf)) 122 write_flush( chardev);122 write_flush(sess); 123 123 slip_send_buf[slip_send_pending++] = ch; 124 124 } … … 128 128 log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_send()"); 129 129 130 chardev_t *chardev = (chardev_t *) srv->arg;130 async_sess_t *sess = (async_sess_t *) srv->arg; 131 131 uint8_t *data = sdu->data; 132 132 … … 136 136 * measure for dealing with previous possible noise on the line. 137 137 */ 138 write_buffered( chardev, SLIP_END);138 write_buffered(sess, SLIP_END); 139 139 140 140 for (size_t i = 0; i < sdu->size; i++) { 141 141 switch (data[i]) { 142 142 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); 145 145 break; 146 146 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); 149 149 break; 150 150 default: 151 write_buffered( chardev, data[i]);151 write_buffered(sess, data[i]); 152 152 break; 153 153 } 154 154 } 155 155 156 write_buffered( chardev, SLIP_END);157 write_flush( chardev);156 write_buffered(sess, SLIP_END); 157 write_flush(sess); 158 158 159 159 return EOK; … … 203 203 } 204 204 205 static uint8_t read_buffered( chardev_t *chardev)205 static uint8_t read_buffered(async_sess_t *sess) 206 206 { 207 207 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) { 214 213 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; 216 216 } 217 218 if (nread == 0) 219 return SLIP_END; 220 221 slip_recv_pending = nread; 217 slip_recv_pending = size; 222 218 slip_recv_read = 0; 223 219 } … … 228 224 static int slip_recv_fibril(void *arg) 229 225 { 230 chardev_t *chardev = (chardev_t *) arg;226 async_sess_t *sess = (async_sess_t *) arg; 231 227 static uint8_t recv_final[SLIP_MTU]; 232 228 iplink_recv_sdu_t sdu; … … 238 234 while (true) { 239 235 for (sdu.size = 0; sdu.size < sizeof(recv_final); /**/) { 240 ch = read_buffered( chardev);236 ch = read_buffered(sess); 241 237 switch (ch) { 242 238 case SLIP_END: … … 250 246 251 247 case SLIP_ESC: 252 ch = read_buffered( chardev);248 ch = read_buffered(sess); 253 249 if (ch == SLIP_ESC_END) { 254 250 recv_final[sdu.size++] = SLIP_END; 255 251 break; 256 } else if (ch == SLIP_ESC_ESC) {252 } else if (ch == SLIP_ESC_ESC) { 257 253 recv_final[sdu.size++] = SLIP_ESC; 258 254 break; … … 299 295 async_sess_t *sess_in = NULL; 300 296 async_sess_t *sess_out = NULL; 301 chardev_t *chardev_in = NULL;302 chardev_t *chardev_out = NULL;303 297 fid_t fid; 304 298 int rc; … … 342 336 return ENOENT; 343 337 } 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; 353 339 354 340 sess_in = loc_service_connect(svcid, INTERFACE_DDF, 0); … … 361 347 } 362 348 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 370 349 rc = loc_service_register(linkstr, &linksid); 371 350 if (rc != EOK) { … … 384 363 } 385 364 386 fid = fibril_create(slip_recv_fibril, chardev_in);365 fid = fibril_create(slip_recv_fibril, sess_in); 387 366 if (!fid) { 388 367 log_msg(LOG_DEFAULT, LVL_ERROR, … … 396 375 397 376 fail: 398 chardev_close(chardev_out);399 377 if (sess_out) 400 378 async_hangup(sess_out); 401 chardev_close(chardev_in);402 379 if (sess_in) 403 380 async_hangup(sess_in);
Note:
See TracChangeset
for help on using the changeset viewer.