All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kiszka <jan.kiszka@web.de>
To: Ed Swierk <eswierk@aristanetworks.com>
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: [PATCH] slirp: Remove UDP protocol emulation (talk, cuseeme)
Date: Thu, 23 Jul 2009 08:46:36 +0200	[thread overview]
Message-ID: <4A68074C.1030000@web.de> (raw)
In-Reply-To: <1248310395.14831.22.camel@localhost.localdomain>

[-- Attachment #1: Type: text/plain, Size: 10941 bytes --]

Ed Swierk wrote:
> 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>
> 

As expressed before, I don't feel like I could comment on the usefulness
of the to-be-removed emulation. But if no one speaks up on this, the
patch has my ack.

Jan

> ---
> diff --git a/slirp/misc.h b/slirp/misc.h
> index c335394..da68d09 100644
> --- a/slirp/misc.h
> +++ b/slirp/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/slirp_config.h b/slirp/slirp_config.h
> index 5a0e6c1..e977e77 100644
> --- a/slirp/slirp_config.h
> +++ b/slirp/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/slirp/udp.c b/slirp/udp.c
> index e0a6693..a88b645 100644
> --- a/slirp/udp.c
> +++ b/slirp/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)
> @@ -202,9 +201,6 @@ 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;
> @@ -306,31 +302,9 @@ int udp_output(struct socket *so, struct mbuf *m,
>  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);
>  }
> @@ -344,9 +318,6 @@ udp_detach(struct socket *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}
>  };
>  
> @@ -367,239 +338,6 @@ 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)
> 
> 
> 
> 
> 



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 257 bytes --]

      reply	other threads:[~2009-07-23  6:46 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-07-23  0:53 [Qemu-devel] [PATCH] slirp: Remove UDP protocol emulation (talk, cuseeme) Ed Swierk
2009-07-23  6:46 ` Jan Kiszka [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A68074C.1030000@web.de \
    --to=jan.kiszka@web.de \
    --cc=eswierk@aristanetworks.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.