Commit 97df1ee542eb5aeec42ce1244fa9da86f9209ee3
Committed by
Anthony Liguori
1 parent
3174ecd1
slirp: Remove UDP protocol emulation (talk, cuseeme)
The UDP emulation code for talk has been commented out since the beginning of time, and unless someone who runs CU-SeeMe on qemu with user-mode networking can vouch that the special magic (a) is necessary and (b) works, let's get rid of the code. Signed-off-by: Ed Swierk <eswierk@aristanetworks.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
3 changed files
with
2 additions
and
272 deletions
slirp/misc.h
slirp/slirp_config.h
slirp/udp.c
... | ... | @@ -42,7 +42,6 @@ |
42 | 42 | #include "ip_icmp.h" |
43 | 43 | |
44 | 44 | static u_int8_t udp_tos(struct socket *so); |
45 | -static void udp_emu(struct socket *so, struct mbuf *m); | |
46 | 45 | |
47 | 46 | void |
48 | 47 | udp_init(Slirp *slirp) |
... | ... | @@ -202,9 +201,6 @@ udp_input(register struct mbuf *m, int iphlen) |
202 | 201 | /* |
203 | 202 | * Now we sendto() the packet. |
204 | 203 | */ |
205 | - if (so->so_emu) | |
206 | - udp_emu(so, m); | |
207 | - | |
208 | 204 | if(sosendto(so,m) == -1) { |
209 | 205 | m->m_len += iphlen; |
210 | 206 | m->m_data -= iphlen; |
... | ... | @@ -306,31 +302,9 @@ int udp_output(struct socket *so, struct mbuf *m, |
306 | 302 | int |
307 | 303 | udp_attach(struct socket *so) |
308 | 304 | { |
309 | - struct sockaddr_in addr; | |
310 | - | |
311 | 305 | if((so->s = socket(AF_INET,SOCK_DGRAM,0)) != -1) { |
312 | - /* | |
313 | - * Here, we bind() the socket. Although not really needed | |
314 | - * (sendto() on an unbound socket will bind it), it's done | |
315 | - * here so that emulation of ytalk etc. don't have to do it | |
316 | - */ | |
317 | - addr.sin_family = AF_INET; | |
318 | - addr.sin_port = 0; | |
319 | - addr.sin_addr.s_addr = INADDR_ANY; | |
320 | - if(bind(so->s, (struct sockaddr *)&addr, sizeof(addr))<0) { | |
321 | - int lasterrno=errno; | |
322 | - closesocket(so->s); | |
323 | - so->s=-1; | |
324 | -#ifdef _WIN32 | |
325 | - WSASetLastError(lasterrno); | |
326 | -#else | |
327 | - errno=lasterrno; | |
328 | -#endif | |
329 | - } else { | |
330 | - /* success, insert in queue */ | |
331 | - so->so_expire = curtime + SO_EXPIRE; | |
332 | - insque(so, &so->slirp->udb); | |
333 | - } | |
306 | + so->so_expire = curtime + SO_EXPIRE; | |
307 | + insque(so, &so->slirp->udb); | |
334 | 308 | } |
335 | 309 | return(so->s); |
336 | 310 | } |
... | ... | @@ -344,9 +318,6 @@ udp_detach(struct socket *so) |
344 | 318 | |
345 | 319 | static const struct tos_t udptos[] = { |
346 | 320 | {0, 53, IPTOS_LOWDELAY, 0}, /* DNS */ |
347 | - {517, 517, IPTOS_LOWDELAY, EMU_TALK}, /* talk */ | |
348 | - {518, 518, IPTOS_LOWDELAY, EMU_NTALK}, /* ntalk */ | |
349 | - {0, 7648, IPTOS_LOWDELAY, EMU_CUSEEME}, /* Cu-Seeme */ | |
350 | 321 | {0, 0, 0, 0} |
351 | 322 | }; |
352 | 323 | |
... | ... | @@ -367,239 +338,6 @@ udp_tos(struct socket *so) |
367 | 338 | return 0; |
368 | 339 | } |
369 | 340 | |
370 | -#ifdef EMULATE_TALK | |
371 | -#include "talkd.h" | |
372 | -#endif | |
373 | - | |
374 | -/* | |
375 | - * Here, talk/ytalk/ntalk requests must be emulated | |
376 | - */ | |
377 | -static void | |
378 | -udp_emu(struct socket *so, struct mbuf *m) | |
379 | -{ | |
380 | - struct sockaddr_in addr; | |
381 | - socklen_t addrlen = sizeof(addr); | |
382 | -#ifdef EMULATE_TALK | |
383 | - CTL_MSG_OLD *omsg; | |
384 | - CTL_MSG *nmsg; | |
385 | - char buff[sizeof(CTL_MSG)]; | |
386 | - u_char type; | |
387 | - | |
388 | -struct talk_request { | |
389 | - struct talk_request *next; | |
390 | - struct socket *udp_so; | |
391 | - struct socket *tcp_so; | |
392 | -} *req; | |
393 | - | |
394 | - static struct talk_request *req_tbl = 0; | |
395 | - | |
396 | -#endif | |
397 | - | |
398 | -struct cu_header { | |
399 | - uint16_t d_family; // destination family | |
400 | - uint16_t d_port; // destination port | |
401 | - uint32_t d_addr; // destination address | |
402 | - uint16_t s_family; // source family | |
403 | - uint16_t s_port; // source port | |
404 | - uint32_t so_addr; // source address | |
405 | - uint32_t seqn; // sequence number | |
406 | - uint16_t message; // message | |
407 | - uint16_t data_type; // data type | |
408 | - uint16_t pkt_len; // packet length | |
409 | -} *cu_head; | |
410 | - | |
411 | - switch(so->so_emu) { | |
412 | - | |
413 | -#ifdef EMULATE_TALK | |
414 | - case EMU_TALK: | |
415 | - case EMU_NTALK: | |
416 | - /* | |
417 | - * Talk emulation. We always change the ctl_addr to get | |
418 | - * some answers from the daemon. When an ANNOUNCE comes, | |
419 | - * we send LEAVE_INVITE to the local daemons. Also when a | |
420 | - * DELETE comes, we send copies to the local daemons. | |
421 | - */ | |
422 | - if (getsockname(so->s, (struct sockaddr *)&addr, &addrlen) < 0) | |
423 | - return; | |
424 | - | |
425 | -#define IS_OLD (so->so_emu == EMU_TALK) | |
426 | - | |
427 | -#define COPY_MSG(dest, src) { dest->type = src->type; \ | |
428 | - dest->id_num = src->id_num; \ | |
429 | - dest->pid = src->pid; \ | |
430 | - dest->addr = src->addr; \ | |
431 | - dest->ctl_addr = src->ctl_addr; \ | |
432 | - memcpy(&dest->l_name, &src->l_name, NAME_SIZE_OLD); \ | |
433 | - memcpy(&dest->r_name, &src->r_name, NAME_SIZE_OLD); \ | |
434 | - memcpy(&dest->r_tty, &src->r_tty, TTY_SIZE); } | |
435 | - | |
436 | -#define OTOSIN(ptr, field) ((struct sockaddr_in *)&ptr->field) | |
437 | -/* old_sockaddr to sockaddr_in */ | |
438 | - | |
439 | - | |
440 | - if (IS_OLD) { /* old talk */ | |
441 | - omsg = mtod(m, CTL_MSG_OLD*); | |
442 | - nmsg = (CTL_MSG *) buff; | |
443 | - type = omsg->type; | |
444 | - OTOSIN(omsg, ctl_addr)->sin_port = addr.sin_port; | |
445 | - OTOSIN(omsg, ctl_addr)->sin_addr = our_addr; | |
446 | - pstrcpy(omsg->l_name, NAME_SIZE_OLD, getlogin()); | |
447 | - } else { /* new talk */ | |
448 | - omsg = (CTL_MSG_OLD *) buff; | |
449 | - nmsg = mtod(m, CTL_MSG *); | |
450 | - type = nmsg->type; | |
451 | - OTOSIN(nmsg, ctl_addr)->sin_port = addr.sin_port; | |
452 | - OTOSIN(nmsg, ctl_addr)->sin_addr = our_addr; | |
453 | - pstrcpy(nmsg->l_name, NAME_SIZE_OLD, getlogin()); | |
454 | - } | |
455 | - | |
456 | - if (type == LOOK_UP) | |
457 | - return; /* for LOOK_UP this is enough */ | |
458 | - | |
459 | - if (IS_OLD) { /* make a copy of the message */ | |
460 | - COPY_MSG(nmsg, omsg); | |
461 | - nmsg->vers = 1; | |
462 | - nmsg->answer = 0; | |
463 | - } else | |
464 | - COPY_MSG(omsg, nmsg); | |
465 | - | |
466 | - /* | |
467 | - * If if is an ANNOUNCE message, we go through the | |
468 | - * request table to see if a tcp port has already | |
469 | - * been redirected for this socket. If not, we solisten() | |
470 | - * a new socket and add this entry to the table. | |
471 | - * The port number of the tcp socket and our IP | |
472 | - * are put to the addr field of the message structures. | |
473 | - * Then a LEAVE_INVITE is sent to both local daemon | |
474 | - * ports, 517 and 518. This is why we have two copies | |
475 | - * of the message, one in old talk and one in new talk | |
476 | - * format. | |
477 | - */ | |
478 | - | |
479 | - if (type == ANNOUNCE) { | |
480 | - int s; | |
481 | - u_short temp_port; | |
482 | - | |
483 | - for(req = req_tbl; req; req = req->next) | |
484 | - if (so == req->udp_so) | |
485 | - break; /* found it */ | |
486 | - | |
487 | - if (!req) { /* no entry for so, create new */ | |
488 | - req = (struct talk_request *) | |
489 | - malloc(sizeof(struct talk_request)); | |
490 | - req->udp_so = so; | |
491 | - req->tcp_so = solisten(0, | |
492 | - OTOSIN(omsg, addr)->sin_addr.s_addr, | |
493 | - OTOSIN(omsg, addr)->sin_port, | |
494 | - SS_FACCEPTONCE); | |
495 | - req->next = req_tbl; | |
496 | - req_tbl = req; | |
497 | - } | |
498 | - | |
499 | - /* replace port number in addr field */ | |
500 | - addrlen = sizeof(addr); | |
501 | - getsockname(req->tcp_so->s, | |
502 | - (struct sockaddr *) &addr, | |
503 | - &addrlen); | |
504 | - OTOSIN(omsg, addr)->sin_port = addr.sin_port; | |
505 | - OTOSIN(omsg, addr)->sin_addr = our_addr; | |
506 | - OTOSIN(nmsg, addr)->sin_port = addr.sin_port; | |
507 | - OTOSIN(nmsg, addr)->sin_addr = our_addr; | |
508 | - | |
509 | - /* send LEAVE_INVITEs */ | |
510 | - temp_port = OTOSIN(omsg, ctl_addr)->sin_port; | |
511 | - OTOSIN(omsg, ctl_addr)->sin_port = 0; | |
512 | - OTOSIN(nmsg, ctl_addr)->sin_port = 0; | |
513 | - omsg->type = nmsg->type = LEAVE_INVITE; | |
514 | - | |
515 | - s = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); | |
516 | - addr.sin_addr = our_addr; | |
517 | - addr.sin_family = AF_INET; | |
518 | - addr.sin_port = htons(517); | |
519 | - sendto(s, (char *)omsg, sizeof(*omsg), 0, | |
520 | - (struct sockaddr *)&addr, sizeof(addr)); | |
521 | - addr.sin_port = htons(518); | |
522 | - sendto(s, (char *)nmsg, sizeof(*nmsg), 0, | |
523 | - (struct sockaddr *) &addr, sizeof(addr)); | |
524 | - closesocket(s) ; | |
525 | - | |
526 | - omsg->type = nmsg->type = ANNOUNCE; | |
527 | - OTOSIN(omsg, ctl_addr)->sin_port = temp_port; | |
528 | - OTOSIN(nmsg, ctl_addr)->sin_port = temp_port; | |
529 | - } | |
530 | - | |
531 | - /* | |
532 | - * If it is a DELETE message, we send a copy to the | |
533 | - * local daemons. Then we delete the entry corresponding | |
534 | - * to our socket from the request table. | |
535 | - */ | |
536 | - | |
537 | - if (type == DELETE) { | |
538 | - struct talk_request *temp_req, *req_next; | |
539 | - int s; | |
540 | - u_short temp_port; | |
541 | - | |
542 | - temp_port = OTOSIN(omsg, ctl_addr)->sin_port; | |
543 | - OTOSIN(omsg, ctl_addr)->sin_port = 0; | |
544 | - OTOSIN(nmsg, ctl_addr)->sin_port = 0; | |
545 | - | |
546 | - s = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); | |
547 | - addr.sin_addr = our_addr; | |
548 | - addr.sin_family = AF_INET; | |
549 | - addr.sin_port = htons(517); | |
550 | - sendto(s, (char *)omsg, sizeof(*omsg), 0, | |
551 | - (struct sockaddr *)&addr, sizeof(addr)); | |
552 | - addr.sin_port = htons(518); | |
553 | - sendto(s, (char *)nmsg, sizeof(*nmsg), 0, | |
554 | - (struct sockaddr *)&addr, sizeof(addr)); | |
555 | - closesocket(s); | |
556 | - | |
557 | - OTOSIN(omsg, ctl_addr)->sin_port = temp_port; | |
558 | - OTOSIN(nmsg, ctl_addr)->sin_port = temp_port; | |
559 | - | |
560 | - /* delete table entry */ | |
561 | - if (so == req_tbl->udp_so) { | |
562 | - temp_req = req_tbl; | |
563 | - req_tbl = req_tbl->next; | |
564 | - free(temp_req); | |
565 | - } else { | |
566 | - temp_req = req_tbl; | |
567 | - for(req = req_tbl->next; req; req = req_next) { | |
568 | - req_next = req->next; | |
569 | - if (so == req->udp_so) { | |
570 | - temp_req->next = req_next; | |
571 | - free(req); | |
572 | - break; | |
573 | - } else { | |
574 | - temp_req = req; | |
575 | - } | |
576 | - } | |
577 | - } | |
578 | - } | |
579 | - | |
580 | - return; | |
581 | -#endif | |
582 | - | |
583 | - case EMU_CUSEEME: | |
584 | - | |
585 | - /* | |
586 | - * Cu-SeeMe emulation. | |
587 | - * Hopefully the packet is more that 16 bytes long. We don't | |
588 | - * do any other tests, just replace the address and port | |
589 | - * fields. | |
590 | - */ | |
591 | - if (m->m_len >= sizeof (*cu_head)) { | |
592 | - if (getsockname(so->s, (struct sockaddr *)&addr, &addrlen) < 0) | |
593 | - return; | |
594 | - cu_head = mtod(m, struct cu_header *); | |
595 | - cu_head->s_port = addr.sin_port; | |
596 | - cu_head->so_addr = our_addr.s_addr; | |
597 | - } | |
598 | - | |
599 | - return; | |
600 | - } | |
601 | -} | |
602 | - | |
603 | 341 | struct socket * |
604 | 342 | udp_listen(Slirp *slirp, u_int32_t haddr, u_int hport, u_int32_t laddr, |
605 | 343 | u_int lport, int flags) | ... | ... |