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