aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEd Swierk <eswierk@aristanetworks.com>2009-07-22 17:53:15 -0700
committerAnthony Liguori <aliguori@us.ibm.com>2009-07-27 14:09:15 -0500
commit1f9c6ef318bfd896a2a5afc728cd5a586ecf8bfb (patch)
tree8c10b41ad8cc655d9a0224050c2b7012f1a08d64
parentc9d8a3ee266ca78950e8310436fde8f3af9969fb (diff)
downloadslirp-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.h5
-rw-r--r--slirp_config.h3
-rw-r--r--udp.c270
3 files changed, 4 insertions, 274 deletions
diff --git a/misc.h b/misc.h
index b298f43..63e4327 100644
--- a/misc.h
+++ b/misc.h
@@ -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
diff --git a/udp.c b/udp.c
index 718b3a9..8b5d878 100644
--- a/udp.c
+++ b/udp.c
@@ -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)
{