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
@@ -36,11 +36,6 @@ void do_wait(int); | @@ -36,11 +36,6 @@ void do_wait(int); | ||
36 | 36 | ||
37 | #define EMU_NOCONNECT 0x10 /* Don't connect */ | 37 | #define EMU_NOCONNECT 0x10 /* Don't connect */ |
38 | 38 | ||
39 | -/* UDP emulations */ | ||
40 | -#define EMU_TALK 0x1 | ||
41 | -#define EMU_NTALK 0x2 | ||
42 | -#define EMU_CUSEEME 0x3 | ||
43 | - | ||
44 | struct tos_t { | 39 | struct tos_t { |
45 | u_int16_t lport; | 40 | u_int16_t lport; |
46 | u_int16_t fport; | 41 | u_int16_t fport; |
slirp/slirp_config.h
@@ -2,9 +2,6 @@ | @@ -2,9 +2,6 @@ | ||
2 | * User definable configuration options | 2 | * User definable configuration options |
3 | */ | 3 | */ |
4 | 4 | ||
5 | -/* Undefine if you don't want talk emulation */ | ||
6 | -#undef EMULATE_TALK | ||
7 | - | ||
8 | /* Define if you want the connection to be probed */ | 5 | /* Define if you want the connection to be probed */ |
9 | /* XXX Not working yet, so ignore this for now */ | 6 | /* XXX Not working yet, so ignore this for now */ |
10 | #undef PROBE_CONN | 7 | #undef PROBE_CONN |
slirp/udp.c
@@ -42,7 +42,6 @@ | @@ -42,7 +42,6 @@ | ||
42 | #include "ip_icmp.h" | 42 | #include "ip_icmp.h" |
43 | 43 | ||
44 | static u_int8_t udp_tos(struct socket *so); | 44 | static u_int8_t udp_tos(struct socket *so); |
45 | -static void udp_emu(struct socket *so, struct mbuf *m); | ||
46 | 45 | ||
47 | void | 46 | void |
48 | udp_init(Slirp *slirp) | 47 | udp_init(Slirp *slirp) |
@@ -202,9 +201,6 @@ udp_input(register struct mbuf *m, int iphlen) | @@ -202,9 +201,6 @@ udp_input(register struct mbuf *m, int iphlen) | ||
202 | /* | 201 | /* |
203 | * Now we sendto() the packet. | 202 | * Now we sendto() the packet. |
204 | */ | 203 | */ |
205 | - if (so->so_emu) | ||
206 | - udp_emu(so, m); | ||
207 | - | ||
208 | if(sosendto(so,m) == -1) { | 204 | if(sosendto(so,m) == -1) { |
209 | m->m_len += iphlen; | 205 | m->m_len += iphlen; |
210 | m->m_data -= iphlen; | 206 | m->m_data -= iphlen; |
@@ -306,31 +302,9 @@ int udp_output(struct socket *so, struct mbuf *m, | @@ -306,31 +302,9 @@ int udp_output(struct socket *so, struct mbuf *m, | ||
306 | int | 302 | int |
307 | udp_attach(struct socket *so) | 303 | udp_attach(struct socket *so) |
308 | { | 304 | { |
309 | - struct sockaddr_in addr; | ||
310 | - | ||
311 | if((so->s = socket(AF_INET,SOCK_DGRAM,0)) != -1) { | 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 | return(so->s); | 309 | return(so->s); |
336 | } | 310 | } |
@@ -344,9 +318,6 @@ udp_detach(struct socket *so) | @@ -344,9 +318,6 @@ udp_detach(struct socket *so) | ||
344 | 318 | ||
345 | static const struct tos_t udptos[] = { | 319 | static const struct tos_t udptos[] = { |
346 | {0, 53, IPTOS_LOWDELAY, 0}, /* DNS */ | 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 | {0, 0, 0, 0} | 321 | {0, 0, 0, 0} |
351 | }; | 322 | }; |
352 | 323 | ||
@@ -367,239 +338,6 @@ udp_tos(struct socket *so) | @@ -367,239 +338,6 @@ udp_tos(struct socket *so) | ||
367 | return 0; | 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 | struct socket * | 341 | struct socket * |
604 | udp_listen(Slirp *slirp, u_int32_t haddr, u_int hport, u_int32_t laddr, | 342 | udp_listen(Slirp *slirp, u_int32_t haddr, u_int hport, u_int32_t laddr, |
605 | u_int lport, int flags) | 343 | u_int lport, int flags) |