Changes in uspace/srv/net/slip/slip.c [c1694b6b:e141281] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/slip/slip.c
rc1694b6b re141281 37 37 #include <stdio.h> 38 38 #include <stdint.h> 39 #include <stdlib.h>40 39 #include <loc.h> 41 40 #include <inet/addr.h> 42 41 #include <inet/iplink_srv.h> 43 #include < io/chardev.h>42 #include <char_dev_iface.h> 44 43 #include <io/log.h> 45 44 #include <errno.h> 46 #include <str_error.h>47 45 #include <task.h> 48 46 … … 98 96 } 99 97 100 static void write_flush( chardev_t *chardev)98 static void write_flush(async_sess_t *sess) 101 99 { 102 100 size_t written = 0; 103 101 104 102 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) { 111 108 log_msg(LOG_DEFAULT, LVL_ERROR, 112 "chardev_write() -> %s", str_error_name(rc)); 109 "char_dev_write() returned %d", 110 (int) size); 113 111 slip_send_pending = 0; 114 112 break; 115 113 } 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 119 static void write_buffered(async_sess_t *sess, uint8_t ch) 122 120 { 123 121 if (slip_send_pending == sizeof(slip_send_buf)) 124 write_flush( chardev);122 write_flush(sess); 125 123 slip_send_buf[slip_send_pending++] = ch; 126 124 } … … 130 128 log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_send()"); 131 129 132 chardev_t *chardev = (chardev_t *) srv->arg;130 async_sess_t *sess = (async_sess_t *) srv->arg; 133 131 uint8_t *data = sdu->data; 134 132 … … 138 136 * measure for dealing with previous possible noise on the line. 139 137 */ 140 write_buffered( chardev, SLIP_END);138 write_buffered(sess, SLIP_END); 141 139 142 140 for (size_t i = 0; i < sdu->size; i++) { 143 141 switch (data[i]) { 144 142 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); 147 145 break; 148 146 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); 151 149 break; 152 150 default: 153 write_buffered( chardev, data[i]);151 write_buffered(sess, data[i]); 154 152 break; 155 153 } 156 154 } 157 155 158 write_buffered( chardev, SLIP_END);159 write_flush( chardev);156 write_buffered(sess, SLIP_END); 157 write_flush(sess); 160 158 161 159 return EOK; … … 205 203 } 206 204 207 static uint8_t read_buffered( chardev_t *chardev)205 static uint8_t read_buffered(async_sess_t *sess) 208 206 { 209 207 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) { 216 213 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; 218 216 } 219 220 if (nread == 0) 221 return SLIP_END; 222 223 slip_recv_pending = nread; 217 slip_recv_pending = size; 224 218 slip_recv_read = 0; 225 219 } … … 230 224 static int slip_recv_fibril(void *arg) 231 225 { 232 chardev_t *chardev = (chardev_t *) arg;226 async_sess_t *sess = (async_sess_t *) arg; 233 227 static uint8_t recv_final[SLIP_MTU]; 234 228 iplink_recv_sdu_t sdu; … … 240 234 while (true) { 241 235 for (sdu.size = 0; sdu.size < sizeof(recv_final); /**/) { 242 ch = read_buffered( chardev);236 ch = read_buffered(sess); 243 237 switch (ch) { 244 238 case SLIP_END: … … 252 246 253 247 case SLIP_ESC: 254 ch = read_buffered( chardev);248 ch = read_buffered(sess); 255 249 if (ch == SLIP_ESC_END) { 256 250 recv_final[sdu.size++] = SLIP_END; 257 251 break; 258 } else if (ch == SLIP_ESC_ESC) {252 } else if (ch == SLIP_ESC_ESC) { 259 253 recv_final[sdu.size++] = SLIP_ESC; 260 254 break; … … 287 281 if (rc != EOK) { 288 282 log_msg(LOG_DEFAULT, LVL_ERROR, 289 "iplink_ev_recv() -> %s", str_error_name(rc));283 "iplink_ev_recv() returned %d", rc); 290 284 } 291 285 } … … 301 295 async_sess_t *sess_in = NULL; 302 296 async_sess_t *sess_out = NULL; 303 chardev_t *chardev_in = NULL;304 chardev_t *chardev_out = NULL;305 297 fid_t fid; 306 298 int rc; … … 344 336 return ENOENT; 345 337 } 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; 355 339 356 340 sess_in = loc_service_connect(svcid, INTERFACE_DDF, 0); … … 363 347 } 364 348 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 372 349 rc = loc_service_register(linkstr, &linksid); 373 350 if (rc != EOK) { … … 386 363 } 387 364 388 fid = fibril_create(slip_recv_fibril, chardev_in);365 fid = fibril_create(slip_recv_fibril, sess_in); 389 366 if (!fid) { 390 367 log_msg(LOG_DEFAULT, LVL_ERROR, … … 398 375 399 376 fail: 400 chardev_close(chardev_out);401 377 if (sess_out) 402 378 async_hangup(sess_out); 403 chardev_close(chardev_in);404 379 if (sess_in) 405 380 async_hangup(sess_in);
Note:
See TracChangeset
for help on using the changeset viewer.