diff options
author | Ed Swierk <eswierk@aristanetworks.com> | 2009-07-22 17:53:15 -0700 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-07-27 14:09:15 -0500 |
commit | 1f9c6ef318bfd896a2a5afc728cd5a586ecf8bfb (patch) | |
tree | 8c10b41ad8cc655d9a0224050c2b7012f1a08d64 | |
parent | c9d8a3ee266ca78950e8310436fde8f3af9969fb (diff) | |
download | slirp-1f9c6ef318bfd896a2a5afc728cd5a586ecf8bfb.zip slirp-1f9c6ef318bfd896a2a5afc728cd5a586ecf8bfb.tar.gz slirp-1f9c6ef318bfd896a2a5afc728cd5a586ecf8bfb.tar.bz2 |
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>
-rw-r--r-- | misc.h | 5 | ||||
-rw-r--r-- | slirp_config.h | 3 | ||||
-rw-r--r-- | udp.c | 270 |
3 files changed, 4 insertions, 274 deletions
@@ -36,11 +36,6 @@ void do_wait(int); #define EMU_NOCONNECT 0x10 /* Don't connect */ -/* UDP emulations */ -#define EMU_TALK 0x1 -#define EMU_NTALK 0x2 -#define EMU_CUSEEME 0x3 - struct tos_t { u_int16_t lport; u_int16_t fport; diff --git a/slirp_config.h b/slirp_config.h index b7a62d0..39a9eb8 100644 --- a/slirp_config.h +++ b/slirp_config.h @@ -2,9 +2,6 @@ * User definable configuration options */ -/* Undefine if you don't want talk emulation */ -#undef EMULATE_TALK - /* Define if you want the connection to be probed */ /* XXX Not working yet, so ignore this for now */ #undef PROBE_CONN @@ -42,7 +42,6 @@ #include "ip_icmp.h" static u_int8_t udp_tos(struct socket *so); -static void udp_emu(struct socket *so, struct mbuf *m); void udp_init(Slirp *slirp) { @@ -199,9 +198,6 @@ void udp_input(register struct mbuf *m, int iphlen) /* * Now we sendto() the packet. */ - if (so->so_emu) - udp_emu(so, m); - if (sosendto(so, m) == -1) { m->m_len += iphlen; m->m_data -= iphlen; @@ -301,31 +297,9 @@ int udp_output(struct socket *so, struct mbuf *m, struct sockaddr_in *addr) int udp_attach(struct socket *so) { - struct sockaddr_in addr; - if ((so->s = socket(AF_INET, SOCK_DGRAM, 0)) != -1) { - /* - * Here, we bind() the socket. Although not really needed - * (sendto() on an unbound socket will bind it), it's done - * here so that emulation of ytalk etc. don't have to do it - */ - addr.sin_family = AF_INET; - addr.sin_port = 0; - addr.sin_addr.s_addr = INADDR_ANY; - if (bind(so->s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - int lasterrno = errno; - closesocket(so->s); - so->s = -1; -#ifdef _WIN32 - WSASetLastError(lasterrno); -#else - errno = lasterrno; -#endif - } else { - /* success, insert in queue */ - so->so_expire = curtime + SO_EXPIRE; - insque(so, &so->slirp->udb); - } + so->so_expire = curtime + SO_EXPIRE; + insque(so, &so->slirp->udb); } return (so->s); } @@ -336,13 +310,8 @@ void udp_detach(struct socket *so) sofree(so); } -static const struct tos_t udptos[] = { - { 0, 53, IPTOS_LOWDELAY, 0 }, /* DNS */ - { 517, 517, IPTOS_LOWDELAY, EMU_TALK }, /* talk */ - { 518, 518, IPTOS_LOWDELAY, EMU_NTALK }, /* ntalk */ - { 0, 7648, IPTOS_LOWDELAY, EMU_CUSEEME }, /* Cu-Seeme */ - { 0, 0, 0, 0 } -}; +static const struct tos_t udptos[] = { { 0, 53, IPTOS_LOWDELAY, 0 }, /* DNS */ + { 0, 0, 0, 0 } }; static u_int8_t udp_tos(struct socket *so) { @@ -360,237 +329,6 @@ static u_int8_t udp_tos(struct socket *so) return 0; } -#ifdef EMULATE_TALK -#include "talkd.h" -#endif - -/* - * Here, talk/ytalk/ntalk requests must be emulated - */ -static void udp_emu(struct socket *so, struct mbuf *m) -{ - struct sockaddr_in addr; - socklen_t addrlen = sizeof(addr); -#ifdef EMULATE_TALK - CTL_MSG_OLD *omsg; - CTL_MSG *nmsg; - char buff[sizeof(CTL_MSG)]; - u_char type; - - struct talk_request { - struct talk_request *next; - struct socket *udp_so; - struct socket *tcp_so; - } * req; - - static struct talk_request *req_tbl = 0; - -#endif - - struct cu_header { - uint16_t d_family; // destination family - uint16_t d_port; // destination port - uint32_t d_addr; // destination address - uint16_t s_family; // source family - uint16_t s_port; // source port - uint32_t so_addr; // source address - uint32_t seqn; // sequence number - uint16_t message; // message - uint16_t data_type; // data type - uint16_t pkt_len; // packet length - } * cu_head; - - switch (so->so_emu) { -#ifdef EMULATE_TALK - case EMU_TALK: - case EMU_NTALK: - /* - * Talk emulation. We always change the ctl_addr to get - * some answers from the daemon. When an ANNOUNCE comes, - * we send LEAVE_INVITE to the local daemons. Also when a - * DELETE comes, we send copies to the local daemons. - */ - if (getsockname(so->s, (struct sockaddr *)&addr, &addrlen) < 0) - return; - -#define IS_OLD (so->so_emu == EMU_TALK) - -#define COPY_MSG(dest, src) \ - { \ - dest->type = src->type; \ - dest->id_num = src->id_num; \ - dest->pid = src->pid; \ - dest->addr = src->addr; \ - dest->ctl_addr = src->ctl_addr; \ - memcpy(&dest->l_name, &src->l_name, NAME_SIZE_OLD); \ - memcpy(&dest->r_name, &src->r_name, NAME_SIZE_OLD); \ - memcpy(&dest->r_tty, &src->r_tty, TTY_SIZE); \ - } - -#define OTOSIN(ptr, field) ((struct sockaddr_in *)&ptr->field) - /* old_sockaddr to sockaddr_in */ - - - if (IS_OLD) { /* old talk */ - omsg = mtod(m, CTL_MSG_OLD *); - nmsg = (CTL_MSG *)buff; - type = omsg->type; - OTOSIN(omsg, ctl_addr)->sin_port = addr.sin_port; - OTOSIN(omsg, ctl_addr)->sin_addr = our_addr; - pstrcpy(omsg->l_name, NAME_SIZE_OLD, getlogin()); - } else { /* new talk */ - omsg = (CTL_MSG_OLD *)buff; - nmsg = mtod(m, CTL_MSG *); - type = nmsg->type; - OTOSIN(nmsg, ctl_addr)->sin_port = addr.sin_port; - OTOSIN(nmsg, ctl_addr)->sin_addr = our_addr; - pstrcpy(nmsg->l_name, NAME_SIZE_OLD, getlogin()); - } - - if (type == LOOK_UP) - return; /* for LOOK_UP this is enough */ - - if (IS_OLD) { /* make a copy of the message */ - COPY_MSG(nmsg, omsg); - nmsg->vers = 1; - nmsg->answer = 0; - } else - COPY_MSG(omsg, nmsg); - - /* - * If if is an ANNOUNCE message, we go through the - * request table to see if a tcp port has already - * been redirected for this socket. If not, we solisten() - * a new socket and add this entry to the table. - * The port number of the tcp socket and our IP - * are put to the addr field of the message structures. - * Then a LEAVE_INVITE is sent to both local daemon - * ports, 517 and 518. This is why we have two copies - * of the message, one in old talk and one in new talk - * format. - */ - - if (type == ANNOUNCE) { - int s; - u_short temp_port; - - for (req = req_tbl; req; req = req->next) - if (so == req->udp_so) - break; /* found it */ - - if (!req) { /* no entry for so, create new */ - req = - (struct talk_request *)malloc(sizeof(struct talk_request)); - req->udp_so = so; - req->tcp_so = - solisten(0, OTOSIN(omsg, addr)->sin_addr.s_addr, - OTOSIN(omsg, addr)->sin_port, SS_FACCEPTONCE); - req->next = req_tbl; - req_tbl = req; - } - - /* replace port number in addr field */ - addrlen = sizeof(addr); - getsockname(req->tcp_so->s, (struct sockaddr *)&addr, &addrlen); - OTOSIN(omsg, addr)->sin_port = addr.sin_port; - OTOSIN(omsg, addr)->sin_addr = our_addr; - OTOSIN(nmsg, addr)->sin_port = addr.sin_port; - OTOSIN(nmsg, addr)->sin_addr = our_addr; - - /* send LEAVE_INVITEs */ - temp_port = OTOSIN(omsg, ctl_addr)->sin_port; - OTOSIN(omsg, ctl_addr)->sin_port = 0; - OTOSIN(nmsg, ctl_addr)->sin_port = 0; - omsg->type = nmsg->type = LEAVE_INVITE; - - s = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); - addr.sin_addr = our_addr; - addr.sin_family = AF_INET; - addr.sin_port = htons(517); - sendto(s, (char *)omsg, sizeof(*omsg), 0, (struct sockaddr *)&addr, - sizeof(addr)); - addr.sin_port = htons(518); - sendto(s, (char *)nmsg, sizeof(*nmsg), 0, (struct sockaddr *)&addr, - sizeof(addr)); - closesocket(s); - - omsg->type = nmsg->type = ANNOUNCE; - OTOSIN(omsg, ctl_addr)->sin_port = temp_port; - OTOSIN(nmsg, ctl_addr)->sin_port = temp_port; - } - - /* - * If it is a DELETE message, we send a copy to the - * local daemons. Then we delete the entry corresponding - * to our socket from the request table. - */ - - if (type == DELETE) { - struct talk_request *temp_req, *req_next; - int s; - u_short temp_port; - - temp_port = OTOSIN(omsg, ctl_addr)->sin_port; - OTOSIN(omsg, ctl_addr)->sin_port = 0; - OTOSIN(nmsg, ctl_addr)->sin_port = 0; - - s = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); - addr.sin_addr = our_addr; - addr.sin_family = AF_INET; - addr.sin_port = htons(517); - sendto(s, (char *)omsg, sizeof(*omsg), 0, (struct sockaddr *)&addr, - sizeof(addr)); - addr.sin_port = htons(518); - sendto(s, (char *)nmsg, sizeof(*nmsg), 0, (struct sockaddr *)&addr, - sizeof(addr)); - closesocket(s); - - OTOSIN(omsg, ctl_addr)->sin_port = temp_port; - OTOSIN(nmsg, ctl_addr)->sin_port = temp_port; - - /* delete table entry */ - if (so == req_tbl->udp_so) { - temp_req = req_tbl; - req_tbl = req_tbl->next; - free(temp_req); - } else { - temp_req = req_tbl; - for (req = req_tbl->next; req; req = req_next) { - req_next = req->next; - if (so == req->udp_so) { - temp_req->next = req_next; - free(req); - break; - } else { - temp_req = req; - } - } - } - } - - return; -#endif - - case EMU_CUSEEME: - - /* - * Cu-SeeMe emulation. - * Hopefully the packet is more that 16 bytes long. We don't - * do any other tests, just replace the address and port - * fields. - */ - if (m->m_len >= sizeof(*cu_head)) { - if (getsockname(so->s, (struct sockaddr *)&addr, &addrlen) < 0) - return; - cu_head = mtod(m, struct cu_header *); - cu_head->s_port = addr.sin_port; - cu_head->so_addr = our_addr.s_addr; - } - - return; - } -} - struct socket *udp_listen(Slirp *slirp, u_int32_t haddr, u_int hport, u_int32_t laddr, u_int lport, int flags) { |