Changeset 374 for asp3_tinet_ecnl_arm/trunk/ntshell/src/socket_stub.c
- Timestamp:
- Apr 5, 2019, 9:26:53 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_arm/trunk/ntshell/src/socket_stub.c
r364 r374 57 57 #include <netinet/udp_var.h> 58 58 #include <net/net_buf.h> 59 //#include <netinet/tcp_var.h> 59 #include <netinet/udp.h> 60 #include <netinet/udp_var.h> 61 #include <netinet/tcp.h> 62 #include <netinet/tcp_var.h> 60 63 #include <netapp/resolver.h> 61 64 extern const ID tmax_tcp_cepid; … … 64 67 #include "kernel_cfg.h" 65 68 69 #ifdef _DEBUG 70 static const char THIS_FILE[] = __FILE__; 71 #endif 72 66 73 #define SOCKET_TIMEOUT 2000000 74 75 static int tcp_fd_close(struct SHELL_FILE *fp); 76 static size_t tcp_fd_read(struct SHELL_FILE *fp, unsigned char *data, size_t len); 77 static size_t tcp_fd_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len); 78 static off_t tcp_fd_seek(struct SHELL_FILE *fp, off_t ofs, int org); 79 static int tcp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg); 80 static bool_t tcp_fd_readable(struct SHELL_FILE *fp); 81 static void tcp_fd_delete(struct SHELL_FILE *fp); 82 83 static int udp_fd_close(struct SHELL_FILE *fp); 84 static size_t udp_fd_read(struct SHELL_FILE *fp, unsigned char *data, size_t len); 85 static size_t udp_fd_write(struct SHELL_FILE *fp, const unsigned char *data, size_t len); 86 static off_t udp_fd_seek(struct SHELL_FILE *fp, off_t ofs, int org); 87 static int udp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg); 88 static bool_t udp_fd_readable(struct SHELL_FILE *fp); 89 static void udp_fd_delete(struct SHELL_FILE *fp); 90 91 IO_TYPE IO_TYPE_TCP = { tcp_fd_close, tcp_fd_read, tcp_fd_write, tcp_fd_seek, tcp_fd_ioctl, tcp_fd_readable, tcp_fd_delete }; 92 IO_TYPE IO_TYPE_UDP = { udp_fd_close, udp_fd_read, udp_fd_write, udp_fd_seek, udp_fd_ioctl, udp_fd_readable, udp_fd_delete }; 67 93 68 94 typedef struct id_table_t { … … 116 142 } 117 143 118 int delete_tcp_rep(int repid) 119 { 120 return delete_tcp_fd(tmax_tcp_cepid + repid); 121 } 122 123 typedef struct _IO_FILE SOCKET; 144 typedef struct SHELL_FILE SOCKET; 124 145 125 146 int shell_socket(int family, int type, int protocol) … … 141 162 switch (type) { 142 163 case SOCK_STREAM: 143 fp = new_tcp_fd(0); 164 fp = new_fp(&IO_TYPE_TCP, 0, 0); 165 if (fp == NULL) 166 return -ENOMEM; 167 168 fp->exinf = malloc(sizeof(socket_t)); 169 memset(fp->exinf, 0, sizeof(socket_t)); 144 170 break; 145 171 case SOCK_DGRAM: 146 fp = new_udp_fd(0); 172 fp = new_fp(&IO_TYPE_UDP, 0, 1); 173 if (fp == NULL) 174 return -ENOMEM; 175 176 fp->exinf = malloc(sizeof(socket_t)); 177 memset(fp->exinf, 0, sizeof(socket_t)); 147 178 break; 148 179 default: … … 150 181 } 151 182 152 if (fp == NULL) { 153 return -ENOMEM; 154 } 155 156 fp->psock->family = family; 157 fp->psock->type = type; 158 fp->psock->protocol = protocol; 159 fp->psock->flags = flags; 183 socket_t *socket = (socket_t *)fp->exinf; 184 socket->family = family; 185 socket->type = type; 186 socket->protocol = protocol; 187 socket->flags = flags; 160 188 161 189 return fp->fd; … … 167 195 if (fp == NULL) 168 196 return -EBADF; 169 if (fp->psock->family != addr->sa_family) 197 socket_t *socket = (socket_t *)fp->exinf; 198 if (socket->family != addr->sa_family) 170 199 return -EINVAL; 171 200 … … 177 206 } 178 207 struct sockaddr_in *addr_in = (struct sockaddr_in *)addr; 179 memcpy(& fp->psock->laddr4, addr, len);180 switch ( fp->psock->type) {208 memcpy(&socket->laddr4, addr, len); 209 switch (socket->type) { 181 210 case SOCK_STREAM: { 182 211 ID cepid = new_id(tcp_cepid_table, tcp_cepid_table_count); … … 184 213 return -ENOMEM; 185 214 186 fp->psock->buf_size = 512 + 512;187 fp->psock->buf = malloc(fp->psock->buf_size);215 socket->buf_size = 512 + 512; 216 socket->buf = malloc(socket->buf_size); 188 217 #ifdef _DEBUG 189 memset( fp->psock->buf, 0, fp->psock->buf_size);218 memset(socket->buf, 0, socket->buf_size); 190 219 #endif 191 T_TCP_CCEP ccep = { 0, fp->psock->buf, 512, &fp->psock->buf[512], 512, (FP)socket_tcp_callback };220 T_TCP_CCEP ccep = { 0, socket->buf, 512, &socket->buf[512], 512, (FP)socket_tcp_callback }; 192 221 ret = tcp_cre_cep(cepid, &ccep); 193 222 if (ret != E_OK) { … … 196 225 } 197 226 fp->handle = cepid; 198 fp->psock->cepid = cepid;227 socket->cepid = cepid; 199 228 break; 200 229 } … … 211 240 } 212 241 fp->handle = cepid; 213 fp->psock->cepid = cepid;242 socket->cepid = cepid; 214 243 break; 215 244 } … … 223 252 return -EINVAL; 224 253 } 225 memcpy(& fp->psock->laddr4, addr, len);254 memcpy(&socket->laddr4, addr, len); 226 255 break; 227 256 } … … 236 265 if (fp == NULL) 237 266 return -EBADF; 238 if (fp->psock->type != SOCK_STREAM) 267 socket_t *socket = (socket_t *)fp->exinf; 268 if (socket->type != SOCK_STREAM) 239 269 return -EINVAL; 240 270 241 fp->psock->backlog = backlog;271 socket->backlog = backlog; 242 272 243 273 ER ret; 244 switch ( fp->psock->family) {274 switch (socket->family) { 245 275 case AF_INET: { 246 276 ID repid = new_id(tcp_repid_table, tcp_repid_table_count); … … 248 278 return -ENOMEM; 249 279 250 struct sockaddr_in *laddr = & fp->psock->laddr4;280 struct sockaddr_in *laddr = &socket->laddr4; 251 281 T_TCP_CREP crep = { 0, {ntohl(laddr->sin_addr.s_addr), ntohs(laddr->sin_port)} }; 252 282 ret = tcp_cre_rep(repid, &crep); … … 255 285 return -ENOMEM; 256 286 } 257 fp->psock->repid = repid;287 socket->repid = repid; 258 288 break; 259 289 } … … 271 301 if (fp == NULL) 272 302 return -EBADF; 273 if (fp->psock->type != SOCK_STREAM) 303 socket_t *socket = (socket_t *)fp->exinf; 304 if (socket->type != SOCK_STREAM) 274 305 return -EINVAL; 275 306 276 307 ER ret; 277 switch ( fp->psock->family) {308 switch (socket->family) { 278 309 case AF_INET: { 279 310 if (len < 8) { 280 311 return -EINVAL; 281 312 } 282 if ( fp->psock->cepid == 0) {313 if (socket->cepid == 0) { 283 314 ID cepid = new_id(tcp_cepid_table, tcp_cepid_table_count); 284 315 if (cepid < 0) 285 316 return -ENOMEM; 286 317 287 fp->psock->buf_size = 512 + 512;288 fp->psock->buf = malloc(fp->psock->buf_size);318 socket->buf_size = 512 + 512; 319 socket->buf = malloc(socket->buf_size); 289 320 #ifdef _DEBUG 290 memset( fp->psock->buf, 0, fp->psock->buf_size);321 memset(socket->buf, 0, socket->buf_size); 291 322 #endif 292 T_TCP_CCEP ccep = { 0, fp->psock->buf, 512, &fp->psock->buf[512], 512, (FP)socket_tcp_callback };323 T_TCP_CCEP ccep = { 0, socket->buf, 512, &socket->buf[512], 512, (FP)socket_tcp_callback }; 293 324 ret = tcp_cre_cep(cepid, &ccep); 294 325 if (ret != E_OK) { … … 297 328 } 298 329 fp->handle = cepid; 299 fp->psock->cepid = cepid;300 } 301 struct sockaddr_in *laddr = & fp->psock->laddr4;302 struct sockaddr_in *raddr = & fp->psock->raddr4;330 socket->cepid = cepid; 331 } 332 struct sockaddr_in *laddr = &socket->laddr4; 333 struct sockaddr_in *raddr = &socket->raddr4; 303 334 memset(raddr, 0, sizeof(*raddr)); 304 335 memcpy(raddr, addr, len); 305 336 T_IPV4EP lep = { ntohl(laddr->sin_addr.s_addr), ntohs(laddr->sin_port) }; 306 337 T_IPV4EP rep = { ntohl(raddr->sin_addr.s_addr), ntohs(raddr->sin_port) }; 307 ret = tcp_con_cep( fp->psock->cepid, &lep, &rep, SOCKET_TIMEOUT);338 ret = tcp_con_cep(socket->cepid, &lep, &rep, SOCKET_TIMEOUT); 308 339 if (ret < 0) { 309 340 return -EHOSTUNREACH; … … 324 355 if (lfp == NULL) 325 356 return -EBADF; 326 if ( lfp->psock->type != SOCK_STREAM)357 if (((socket_t *)lfp->exinf)->type != SOCK_STREAM) 327 358 return -EINVAL; 328 359 329 SOCKET *fp = new_ tcp_fd(0);330 if (fp == NULL) {360 SOCKET *fp = new_fp(&IO_TYPE_TCP, 0, 0); 361 if (fp == NULL) 331 362 return -ENOMEM; 332 } 333 334 memcpy(fp->psock, lfp->psock, offsetof(socket_t, buf_size)); 363 364 fp->exinf = malloc(sizeof(socket_t)); 365 memset(fp->exinf, 0, sizeof(socket_t)); 366 367 memcpy(fp->exinf, lfp->exinf, offsetof(socket_t, buf_size)); 335 368 336 369 ER ret; 337 switch (fp->psock->family) { 370 socket_t *socket = (socket_t *)fp->exinf; 371 switch (socket->family) { 338 372 case AF_INET: { 339 373 ID cepid; 340 if ( fp->psock->cepid == 0) {374 if (socket->cepid == 0) { 341 375 cepid = new_id(tcp_cepid_table, tcp_cepid_table_count); 342 376 if (cepid < 0) 343 377 return -ENOMEM; 344 378 345 fp->psock->buf_size = 512 + 512;346 fp->psock->buf = malloc(fp->psock->buf_size);379 socket->buf_size = 512 + 512; 380 socket->buf = malloc(socket->buf_size); 347 381 #ifdef _DEBUG 348 memset( fp->psock->buf, 0, fp->psock->buf_size);382 memset(socket->buf, 0, socket->buf_size); 349 383 #endif 350 T_TCP_CCEP ccep = { 0, fp->psock->buf, 512, &fp->psock->buf[512], 512, (FP)socket_tcp_callback };384 T_TCP_CCEP ccep = { 0, socket->buf, 512, &socket->buf[512], 512, (FP)socket_tcp_callback }; 351 385 ret = tcp_cre_cep(cepid, &ccep); 352 386 if (ret != E_OK) { … … 355 389 } 356 390 fp->handle = cepid; 357 fp->psock->cepid = cepid;391 socket->cepid = cepid; 358 392 } 359 393 else { 360 cepid = lfp->psock->cepid;394 cepid = ((socket_t *)lfp->exinf)->cepid; 361 395 fp->handle = cepid; 362 lfp->handle = tmax_tcp_cepid + lfp->psock->repid;363 lfp->psock->cepid = 0;364 lfp->psock->buf_size = 0;365 lfp->psock->buf = 0;396 lfp->handle = tmax_tcp_cepid + ((socket_t *)lfp->exinf)->repid; 397 ((socket_t *)lfp->exinf)->cepid = 0; 398 ((socket_t *)lfp->exinf)->buf_size = 0; 399 ((socket_t *)lfp->exinf)->buf = 0; 366 400 } 367 401 T_IPV4EP rep = { 0, 0 }; 368 ret = tcp_acp_cep( fp->psock->cepid, fp->psock->repid, &rep, TMO_FEVR);402 ret = tcp_acp_cep(socket->cepid, socket->repid, &rep, TMO_FEVR); 369 403 if (ret < 0) { 370 404 return -ENOMEM; 371 405 } 372 struct sockaddr_in *raddr = & fp->psock->raddr4;406 struct sockaddr_in *raddr = &socket->raddr4; 373 407 memset(raddr, 0, sizeof(*raddr)); 374 408 raddr->sin_family = AF_INET; … … 387 421 return -EINVAL; 388 422 } 389 struct sockaddr_in *raddr = & fp->psock->raddr4;423 struct sockaddr_in *raddr = &socket->raddr4; 390 424 if (sz > sizeof(*raddr)) 391 425 sz = sizeof(*raddr); … … 405 439 406 440 int ret = 0; 407 switch (fp->psock->family) { 441 socket_t *socket = (socket_t *)fp->exinf; 442 switch (socket->family) { 408 443 case AF_INET: { 409 switch ( fp->psock->type) {444 switch (socket->type) { 410 445 case SOCK_STREAM: { 411 446 if ((addr != NULL) || (alen != 0)) { … … 414 449 415 450 if (flags & MSG_OOB) { 416 ret = tcp_snd_oob( fp->psock->cepid, (void *)buf, len, SOCKET_TIMEOUT);451 ret = tcp_snd_oob(socket->cepid, (void *)buf, len, SOCKET_TIMEOUT); 417 452 if (ret < 0) { 418 453 return -ECOMM; … … 421 456 else { 422 457 for (;;) { 423 ret = tcp_snd_dat( fp->psock->cepid, (void *)buf, len, SOCKET_TIMEOUT);458 ret = tcp_snd_dat(socket->cepid, (void *)buf, len, SOCKET_TIMEOUT); 424 459 if (ret < 0) { 425 460 if (ret == E_TMOUT) … … 440 475 return -EINVAL; 441 476 } 442 struct sockaddr_in *raddr = & fp->psock->raddr4;477 struct sockaddr_in *raddr = &socket->raddr4; 443 478 memset(raddr, 0, sizeof(*raddr)); 444 479 memcpy(raddr, addr, sz); 445 480 T_IPV4EP rep = { ntohl(raddr->sin_addr.s_addr), ntohs(raddr->sin_port) }; 446 ret = udp_snd_dat( fp->psock->cepid, &rep, (void *)buf, len,447 ( fp->psock->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT);481 ret = udp_snd_dat(socket->cepid, &rep, (void *)buf, len, 482 (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT); 448 483 if (ret < 0) { 449 484 return (ret == E_TMOUT) ? -ETIME : -ECOMM; … … 476 511 477 512 int ret = 0; 478 switch (fp->psock->family) { 513 socket_t *socket = (socket_t *)fp->exinf; 514 switch (socket->family) { 479 515 case AF_INET: { 480 switch ( fp->psock->type) {516 switch (socket->type) { 481 517 case SOCK_STREAM: { 482 518 if (flags & MSG_OOB) { 483 ret = tcp_rcv_oob( fp->psock->cepid, buf, len);519 ret = tcp_rcv_oob(socket->cepid, buf, len); 484 520 if (ret < 0) { 485 521 syslog(LOG_ERROR, "tcp_rcv_oob => %d", ret); … … 489 525 else { 490 526 int rsz, tmp; 491 if ( fp->psock->input == NULL) {527 if (socket->input == NULL) { 492 528 ret = wai_sem(SEM_FILEDESC); 493 529 if (ret < 0) { 494 530 syslog(LOG_ERROR, "wai_sem => %d", ret); 495 531 } 496 fp->psock->len = 0;532 socket->len = 0; 497 533 ret = sig_sem(SEM_FILEDESC); 498 534 if (ret < 0) { 499 535 syslog(LOG_ERROR, "sig_sem => %d", ret); 500 536 } 501 ret = tcp_rcv_buf( fp->psock->cepid, &fp->psock->input, TMO_FEVR);537 ret = tcp_rcv_buf(socket->cepid, &socket->input, TMO_FEVR); 502 538 if (ret < 0) { 503 539 syslog(LOG_ERROR, "tcp_rcv_buf => %d", ret); … … 507 543 } 508 544 else 509 rsz = fp->psock->len;545 rsz = socket->len; 510 546 tmp = rsz; 511 547 if (rsz > len) 512 548 rsz = len; 513 549 if (rsz >= 0) { 514 memcpy(buf, fp->psock->input, rsz);550 memcpy(buf, socket->input, rsz); 515 551 ret = wai_sem(SEM_FILEDESC); 516 552 if (ret < 0) { 517 553 syslog(LOG_ERROR, "wai_sem => %d", ret); 518 554 } 519 fp->psock->len = tmp - rsz;555 socket->len = tmp - rsz; 520 556 ret = sig_sem(SEM_FILEDESC); 521 557 if (ret < 0) { … … 523 559 } 524 560 if (tmp - rsz == 0) { 525 fp->psock->input = NULL;561 socket->input = NULL; 526 562 } 527 563 else 528 fp->psock->input = (void *)&((uint8_t *)fp->psock->input)[rsz];529 ret = tcp_rel_buf( fp->psock->cepid, rsz);564 socket->input = (void *)&((uint8_t *)socket->input)[rsz]; 565 ret = tcp_rel_buf(socket->cepid, rsz); 530 566 if ((ret != E_OBJ) && (ret < 0)) { 531 567 syslog(LOG_ERROR, "tcp_rel_buf => %d", ret); … … 538 574 } 539 575 case SOCK_DGRAM: { 540 struct sockaddr_in *raddr = & fp->psock->raddr4;576 struct sockaddr_in *raddr = &socket->raddr4; 541 577 int rsz; 542 578 ret = wai_sem(SEM_FILEDESC); … … 544 580 syslog(LOG_ERROR, "wai_sem => %d", ret); 545 581 } 546 T_NET_BUF *input = fp->psock->input;582 T_NET_BUF *input = socket->input; 547 583 if (input == NULL) { 548 584 ret = sig_sem(SEM_FILEDESC); … … 552 588 553 589 T_IPV4EP rep = { 0, 0 }; 554 ret = udp_rcv_dat( fp->psock->cepid, &rep, buf, len,555 ( fp->psock->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT);590 ret = udp_rcv_dat(socket->cepid, &rep, buf, len, 591 (socket->flags & O_NONBLOCK) ? TMO_POL : SOCKET_TIMEOUT); 556 592 if (ret < 0) { 557 syslog(LOG_ERROR, "udp_rcv_buf => %d", ret); 593 if ((socket->flags & O_NONBLOCK) == 0) 594 syslog(LOG_ERROR, "udp_rcv_buf => %d", ret); 558 595 return (ret == E_TMOUT) ? -ETIME : -ECOMM; 559 596 } … … 565 602 } 566 603 int sz = *alen; 567 memset(raddr, 0, sizeof( fp->psock->raddr4));604 memset(raddr, 0, sizeof(socket->raddr4)); 568 605 raddr->sin_family = AF_INET; 569 606 raddr->sin_port = htons(rep.portno); 570 607 raddr->sin_addr.s_addr = htonl(rep.ipaddr); 571 if (sz > sizeof( fp->psock->raddr4))572 sz = sizeof( fp->psock->raddr4);608 if (sz > sizeof(socket->raddr4)) 609 sz = sizeof(socket->raddr4); 573 610 memcpy(addr, raddr, sz); 574 611 *alen = sz; … … 580 617 } 581 618 else { 582 rsz = fp->psock->len;583 void *pbuf = fp->psock->buf;584 fp->psock->input = NULL;585 fp->psock->len = 0;586 fp->psock->buf = NULL;619 rsz = socket->len; 620 void *pbuf = socket->buf; 621 socket->input = NULL; 622 socket->len = 0; 623 socket->buf = NULL; 587 624 if ((addr != NULL) && (alen != NULL)) { 588 625 int sz = *alen; 589 if (sz > sizeof( fp->psock->raddr4))590 sz = sizeof( fp->psock->raddr4);626 if (sz > sizeof(socket->raddr4)) 627 sz = sizeof(socket->raddr4); 591 628 memcpy(addr, raddr, sz); 592 629 *alen = sz; … … 632 669 633 670 ER ret; 634 switch (fp->psock->family) { 671 socket_t *socket = (socket_t *)fp->exinf; 672 switch (socket->family) { 635 673 case AF_INET: { 636 switch ( fp->psock->type) {674 switch (socket->type) { 637 675 case SOCK_STREAM: { 638 ret = tcp_sht_cep( fp->psock->cepid);676 ret = tcp_sht_cep(socket->cepid); 639 677 if (ret < 0) { 640 678 return -ECOMM; … … 661 699 662 700 ER ret; 663 switch (fp->psock->family) { 701 socket_t *socket = (socket_t *)fp->exinf; 702 switch (socket->family) { 664 703 case AF_INET: { 665 switch ( fp->psock->type) {704 switch (socket->type) { 666 705 case SOCK_STREAM: { 667 706 switch (level) { … … 669 708 switch (optname) { 670 709 case SO_REUSEADDR: 671 if ( fp->psock->flags & SO_REUSEADDR) {710 if (socket->flags & SO_REUSEADDR) { 672 711 *(bool *)optval = true; 673 712 } … … 677 716 break; 678 717 case SO_KEEPALIVE: 679 if ( fp->psock->flags & SO_KEEPALIVE) {718 if (socket->flags & SO_KEEPALIVE) { 680 719 *(bool *)optval = true; 681 720 } … … 692 731 break; 693 732 case IPPROTO_TCP: 694 ret = tcp_get_opt( fp->psock->cepid, optname, (void *)optval, *optlen);733 ret = tcp_get_opt(socket->cepid, optname, (void *)optval, *optlen); 695 734 if (ret < 0) { 696 735 return -EINVAL; … … 706 745 switch (level) { 707 746 case IPPROTO_UDP: 708 ret = udp_get_opt( fp->psock->cepid, optname, (void *)optval, *optlen);747 ret = udp_get_opt(socket->cepid, optname, (void *)optval, *optlen); 709 748 if (ret < 0) { 710 749 return -EINVAL; … … 736 775 737 776 ER ret; 738 switch (fp->psock->family) { 777 socket_t *socket = (socket_t *)fp->exinf; 778 switch (socket->family) { 739 779 case AF_INET: { 740 switch ( fp->psock->type) {780 switch (socket->type) { 741 781 case SOCK_STREAM: { 742 782 switch (level){ … … 745 785 case SO_REUSEADDR: 746 786 if (*(bool *)optval) { 747 fp->psock->flags |= SO_REUSEADDR;787 socket->flags |= SO_REUSEADDR; 748 788 } 749 789 else { 750 fp->psock->flags &= ~SO_REUSEADDR;790 socket->flags &= ~SO_REUSEADDR; 751 791 } 752 792 break; 753 793 case SO_KEEPALIVE: 754 794 if (*(bool *)optval) { 755 fp->psock->flags |= SO_KEEPALIVE;795 socket->flags |= SO_KEEPALIVE; 756 796 } 757 797 else { 758 fp->psock->flags &= ~SO_KEEPALIVE;798 socket->flags &= ~SO_KEEPALIVE; 759 799 } 760 800 break; … … 764 804 break; 765 805 case IPPROTO_TCP: 766 ret = tcp_set_opt( fp->psock->cepid, optname, (void *)optval, optlen);806 ret = tcp_set_opt(socket->cepid, optname, (void *)optval, optlen); 767 807 if (ret < 0) { 768 808 return -EINVAL; … … 777 817 switch (level){ 778 818 case IPPROTO_UDP: 779 ret = udp_set_opt( fp->psock->cepid, optname, (void *)optval, optlen);819 ret = udp_set_opt(socket->cepid, optname, (void *)optval, optlen); 780 820 if (ret < 0) { 781 821 return -EINVAL; … … 809 849 810 850 socklen_t size = *len; 811 switch (fp->psock->family) { 851 socket_t *socket = (socket_t *)fp->exinf; 852 switch (socket->family) { 812 853 case AF_INET: { 813 struct sockaddr_in *raddr = & fp->psock->raddr4;854 struct sockaddr_in *raddr = &socket->raddr4; 814 855 *len = sizeof(struct sockaddr_in); 815 856 if (size > sizeof(struct sockaddr_in)) … … 837 878 838 879 socklen_t size = *len; 839 switch (fp->psock->family) { 880 socket_t *socket = (socket_t *)fp->exinf; 881 switch (socket->family) { 840 882 case AF_INET: { 841 883 const T_IN4_ADDR *laddr4 = in4_get_ifaddr(0); … … 843 885 laddr.sin_family = AF_INET; 844 886 laddr.sin_addr.s_addr = htonl(*laddr4); 845 laddr.sin_port = fp->psock->laddr4.sin_port;887 laddr.sin_port = socket->laddr4.sin_port; 846 888 memset(&laddr.sin_zero, 0, sizeof(laddr.sin_zero)); 847 889 *len = sizeof(struct sockaddr_in); … … 859 901 } 860 902 861 int tcp_fd_close(struct _IO_FILE *fp)903 int tcp_fd_close(struct SHELL_FILE *fp) 862 904 { 863 905 ER ret, ret2; 864 906 865 switch (fp->psock->family) { 907 socket_t *socket = (socket_t *)fp->exinf; 908 switch (socket->family) { 866 909 case AF_INET: { 867 if ( fp->psock->cepid != 0) {868 ID cepid = fp->psock->cepid;910 if (socket->cepid != 0) { 911 ID cepid = socket->cepid; 869 912 ret = tcp_sht_cep(cepid); 870 913 if (ret < 0) { 871 914 //return -1; 872 915 } 873 ret = tcp_cls_cep(cepid, ( fp->psock->repid != 0) ? 0 : SOCKET_TIMEOUT);916 ret = tcp_cls_cep(cepid, (socket->repid != 0) ? 0 : SOCKET_TIMEOUT); 874 917 ret2 = tcp_del_cep(cepid); 875 free(fp->psock->buf); 876 fp->psock->buf = NULL; 877 delete_tcp_fd(cepid); 918 //delete_fd_by_id(&IO_TYPE_TCP, cepid); 878 919 delete_id(tcp_cepid_table, tcp_cepid_table_count, cepid); 879 920 if ((ret < 0) || (ret2 < 0)) { … … 881 922 } 882 923 } 883 else if ( fp->psock->repid != 0) {884 ID repid = fp->psock->repid;924 else if (socket->repid != 0) { 925 ID repid = socket->repid; 885 926 ret = tcp_del_rep(repid); 886 free(fp->psock->buf); 887 fp->psock->buf = NULL; 888 delete_tcp_fd(tmax_tcp_cepid + repid); 927 //delete_fd_by_id(&IO_TYPE_TCP, tmax_tcp_cepid + repid); 889 928 delete_id(tcp_repid_table, tcp_repid_table_count, repid); 890 929 if (ret < 0) { … … 893 932 } 894 933 else { 895 free(fp->psock->buf);896 fp->psock->buf = NULL;897 934 return -EINVAL; 898 935 } … … 907 944 } 908 945 909 size_t tcp_fd_read(struct _IO_FILE *fp, unsigned char *dst, size_t dstsz)946 size_t tcp_fd_read(struct SHELL_FILE *fp, unsigned char *dst, size_t dstsz) 910 947 { 911 948 return shell_recvfrom(fp->fd, dst, dstsz, 0, NULL, NULL); 912 949 } 913 950 914 size_t tcp_fd_write(struct _IO_FILE *fp, const unsigned char *src, size_t srcsz)951 size_t tcp_fd_write(struct SHELL_FILE *fp, const unsigned char *src, size_t srcsz) 915 952 { 916 953 return shell_sendto(fp->fd, src, srcsz, 0, NULL, 0); 917 954 } 918 955 919 off_t tcp_fd_seek(struct _IO_FILE *fp, off_t ofs, int org)956 off_t tcp_fd_seek(struct SHELL_FILE *fp, off_t ofs, int org) 920 957 { 921 958 return -EPERM; 922 959 } 923 960 924 int tcp_fd_ioctl(struct _IO_FILE *fp, int req, void *arg)961 int tcp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg) 925 962 { 926 963 return -EINVAL; 927 964 } 928 965 929 int udp_fd_close(struct _IO_FILE *fp) 966 bool_t tcp_fd_readable(struct SHELL_FILE *fp) 967 { 968 ER ret; 969 970 socket_t *socket = (socket_t *)fp->exinf; 971 if (socket->cepid != 0) { 972 if (socket->len == 0) { 973 ret = tcp_rcv_buf(socket->cepid, &socket->input, TMO_NBLK); 974 if ((ret != E_WBLK) && (ret != E_OBJ) && (ret < 0)) { 975 syslog(LOG_ERROR, "tcp_rcv_buf => %d", ret); 976 //return ret; 977 } 978 if (ret > 0) { 979 ret = wai_sem(SEM_FILEDESC); 980 if (ret < 0) { 981 syslog(LOG_ERROR, "wai_sem => %d", ret); 982 } 983 socket->len += ret; 984 ret = sig_sem(SEM_FILEDESC); 985 if (ret < 0) { 986 syslog(LOG_ERROR, "sig_sem => %d", ret); 987 } 988 } 989 } 990 else ret = 1; 991 if (ret > 0) { 992 return true; 993 } 994 } 995 996 return false; 997 } 998 999 void tcp_fd_delete(struct SHELL_FILE *fp) 1000 { 1001 socket_t *socket = (socket_t *)fp->exinf; 1002 free(socket->buf); 1003 socket->buf = NULL; 1004 free(fp->exinf); 1005 fp->exinf = NULL; 1006 } 1007 1008 ER socket_tcp_callback(ID cepid, FN fncd, void *p_parblk) 1009 { 1010 struct SHELL_FILE *fp = id_to_fd(&IO_TYPE_TCP, cepid); 1011 FLGPTN flgptn = 0; 1012 ER ret; 1013 int len; 1014 1015 if (fp == NULL) 1016 return E_PAR; 1017 1018 int fd = fp->fd; 1019 FD_SET(fd, (fd_set *)&flgptn); 1020 1021 switch (fncd) { 1022 case TFN_TCP_RCV_BUF: 1023 len = *(int *)p_parblk; 1024 if ((len <= 0) || (fp->exinf == NULL)) 1025 return E_OK; 1026 1027 ret = wai_sem(SEM_FILEDESC); 1028 if (ret < 0) { 1029 syslog(LOG_ERROR, "wai_sem => %d", ret); 1030 } 1031 socket_t *socket = (socket_t *)fp->exinf; 1032 socket->len += len; 1033 ret = sig_sem(SEM_FILEDESC); 1034 if (ret < 0) { 1035 syslog(LOG_ERROR, "sig_sem => %d", ret); 1036 } 1037 1038 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++; 1039 1040 set_flg(FLG_SELECT_WAIT, flgptn); 1041 return E_OK; 1042 1043 case TFN_TCP_RCV_DAT: 1044 len = *(int *)p_parblk; 1045 if ((len <= 0) || (fp->exinf == NULL)) 1046 return E_OK; 1047 1048 ret = wai_sem(SEM_FILEDESC); 1049 if (ret < 0) { 1050 syslog(LOG_ERROR, "wai_sem => %d", ret); 1051 } 1052 socket->len += len; 1053 ret = sig_sem(SEM_FILEDESC); 1054 if (ret < 0) { 1055 syslog(LOG_ERROR, "sig_sem => %d", ret); 1056 } 1057 1058 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++; 1059 1060 set_flg(FLG_SELECT_WAIT, flgptn); 1061 return E_OK; 1062 1063 case TFN_TCP_SND_DAT: 1064 if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++; 1065 1066 set_flg(FLG_SELECT_WAIT, flgptn); 1067 return E_OK; 1068 1069 case TFN_TCP_CAN_CEP: 1070 if (fp->errorevt_w == fp->errorevt_r) fp->errorevt_w++; 1071 1072 set_flg(FLG_SELECT_WAIT, flgptn); 1073 return E_OK; 1074 1075 case TFN_TCP_DEL_REP: 1076 delete_fd_by_id(&IO_TYPE_TCP, tmax_tcp_cepid + cepid); 1077 return E_OK; 1078 1079 case TFN_TCP_DEL_CEP: 1080 delete_fd_by_id(&IO_TYPE_TCP, cepid); 1081 return E_OK; 1082 1083 default: 1084 return E_OK; 1085 } 1086 } 1087 1088 int udp_fd_close(struct SHELL_FILE *fp) 930 1089 { 931 1090 ER ret; 932 1091 ID cepid; 933 1092 934 switch (fp->psock->family) { 1093 socket_t *socket = (socket_t *)fp->exinf; 1094 switch (socket->family) { 935 1095 case AF_INET: { 936 cepid = fp->psock->cepid;1096 cepid = socket->cepid; 937 1097 ret = udp_del_cep(cepid); 938 //free(fp->psock->buf); 939 //fp->psock->buf = NULL; 940 delete_udp_fd(cepid); 1098 //delete_fd_by_id(&IO_TYPE_UDP, cepid); 941 1099 delete_id(udp_cepid_table, udp_cepid_table_count, cepid); 942 1100 if (ret < 0) { … … 953 1111 } 954 1112 955 size_t udp_fd_read(struct _IO_FILE *fp, unsigned char *dst, size_t dstsz)1113 size_t udp_fd_read(struct SHELL_FILE *fp, unsigned char *dst, size_t dstsz) 956 1114 { 957 1115 return shell_recvfrom(fp->fd, dst, dstsz, 0, NULL, NULL); 958 1116 } 959 1117 960 size_t udp_fd_write(struct _IO_FILE *fp, const unsigned char *src, size_t srcsz)1118 size_t udp_fd_write(struct SHELL_FILE *fp, const unsigned char *src, size_t srcsz) 961 1119 { 962 1120 return shell_sendto(fp->fd, src, srcsz, 0, NULL, 0); 963 1121 } 964 1122 965 off_t udp_fd_seek(struct _IO_FILE *fp, off_t ofs, int org)1123 off_t udp_fd_seek(struct SHELL_FILE *fp, off_t ofs, int org) 966 1124 { 967 1125 return -EPERM; 968 1126 } 969 1127 970 int udp_fd_ioctl(struct _IO_FILE *fp, int req, void *arg)1128 int udp_fd_ioctl(struct SHELL_FILE *fp, int req, void *arg) 971 1129 { 972 1130 return -EINVAL; 1131 } 1132 1133 bool_t udp_fd_readable(struct SHELL_FILE *fp) 1134 { 1135 socket_t *socket = (socket_t *)fp->exinf; 1136 if (socket->cepid != 0) { 1137 if (socket->input != NULL) { 1138 return true; 1139 } 1140 } 1141 1142 return false; 1143 } 1144 1145 void udp_fd_delete(struct SHELL_FILE *fp) 1146 { 1147 //socket_t *socket = (socket_t *)fp->exinf; 1148 //free(socket->buf); 1149 //socket->buf = NULL; 1150 free(fp->exinf); 1151 fp->exinf = NULL; 1152 } 1153 1154 ER socket_udp_callback(ID cepid, FN fncd, void *p_parblk) 1155 { 1156 struct SHELL_FILE *fp = id_to_fd(&IO_TYPE_UDP, cepid); 1157 FLGPTN flgptn = 0; 1158 int len; 1159 1160 if (fp == NULL) 1161 return E_PAR; 1162 1163 int fd = fp->fd; 1164 FD_SET(fd, (fd_set *)&flgptn); 1165 1166 switch (fncd) { 1167 case TEV_UDP_RCV_DAT: 1168 { 1169 T_UDP_RCV_DAT_PARA *udppara = (T_UDP_RCV_DAT_PARA *)p_parblk; 1170 len = udppara->len; 1171 if ((len <= 0) || (fp->exinf == NULL)) 1172 return E_OK; 1173 1174 ER ret = wai_sem(SEM_FILEDESC); 1175 if (ret < 0) { 1176 syslog(LOG_ERROR, "wai_sem => %d", ret); 1177 } 1178 socket_t *socket = (socket_t *)fp->exinf; 1179 socket->len = len; 1180 if (socket->input != NULL) { 1181 ret = rel_net_buf(socket->input); 1182 if (ret < 0) { 1183 syslog(LOG_ERROR, "rel_net_buf => %d", ret); 1184 } 1185 } 1186 socket->input = udppara->input; 1187 socket->buf = GET_UDP_SDU(udppara->input, udppara->off); 1188 memset(&socket->raddr4, 0, sizeof(socket->raddr4)); 1189 socket->raddr4.sin_family = AF_INET; 1190 socket->raddr4.sin_port = htons(udppara->rep4.portno); 1191 socket->raddr4.sin_addr.s_addr = htonl(udppara->rep4.ipaddr); 1192 udppara->input->flags |= NB_FLG_NOREL_IFOUT; 1193 ret = sig_sem(SEM_FILEDESC); 1194 if (ret < 0) { 1195 syslog(LOG_ERROR, "sig_sem => %d", ret); 1196 } 1197 1198 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++; 1199 1200 set_flg(FLG_SELECT_WAIT, flgptn); 1201 return E_OK; 1202 } 1203 case TFN_UDP_CRE_CEP: 1204 return E_OK; 1205 1206 case TFN_UDP_RCV_DAT: 1207 len = *(int *)p_parblk; 1208 if ((len <= 0) || (fp->exinf == NULL)) 1209 return E_OK; 1210 1211 if (fp->readevt_w == fp->readevt_r) fp->readevt_w++; 1212 1213 set_flg(FLG_SELECT_WAIT, flgptn); 1214 return E_OK; 1215 1216 case TFN_UDP_SND_DAT: 1217 if (fp->writeevt_w == fp->writeevt_r) fp->writeevt_w++; 1218 1219 set_flg(FLG_SELECT_WAIT, flgptn); 1220 return E_OK; 1221 1222 case TFN_UDP_CAN_CEP: 1223 if (fp->errorevt_w == fp->errorevt_r) fp->errorevt_w++; 1224 1225 set_flg(FLG_SELECT_WAIT, flgptn); 1226 return E_OK; 1227 1228 case TFN_UDP_DEL_CEP: 1229 delete_fd_by_id(&IO_TYPE_UDP, cepid); 1230 return E_OK; 1231 1232 default: 1233 return E_OK; 1234 } 973 1235 } 974 1236
Note:
See TracChangeset
for help on using the changeset viewer.