slirp: Drop statistic code
As agreed on the mailing list, there is no interest in keeping the usually disabled slirp statistics in the tree. So this patch removes them. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
		
							parent
							
								
									0d62c4cfe2
								
							
						
					
					
						commit
						0fe6a7f284
					
				@ -1733,8 +1733,6 @@ static const mon_cmd_t info_cmds[] = {
 | 
				
			|||||||
      "", "show CPU statistics", },
 | 
					      "", "show CPU statistics", },
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if defined(CONFIG_SLIRP)
 | 
					#if defined(CONFIG_SLIRP)
 | 
				
			||||||
    { "slirp", "", do_info_slirp,
 | 
					 | 
				
			||||||
      "", "show SLIRP statistics", },
 | 
					 | 
				
			||||||
    { "usernet", "", do_info_usernet,
 | 
					    { "usernet", "", do_info_usernet,
 | 
				
			||||||
      "", "show user network stack connection states", },
 | 
					      "", "show user network stack connection states", },
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										5
									
								
								net.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								net.c
									
									
									
									
									
								
							@ -1112,11 +1112,6 @@ void net_slirp_smb(const char *exported_dir)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#endif /* !defined(_WIN32) */
 | 
					#endif /* !defined(_WIN32) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void do_info_slirp(Monitor *mon)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    slirp_stats();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct GuestFwd {
 | 
					struct GuestFwd {
 | 
				
			||||||
    CharDriverState *hd;
 | 
					    CharDriverState *hd;
 | 
				
			||||||
    struct in_addr server;
 | 
					    struct in_addr server;
 | 
				
			||||||
 | 
				
			|||||||
@ -85,8 +85,6 @@ show the current VM name
 | 
				
			|||||||
show the current VM UUID
 | 
					show the current VM UUID
 | 
				
			||||||
@item info cpustats
 | 
					@item info cpustats
 | 
				
			||||||
show CPU statistics
 | 
					show CPU statistics
 | 
				
			||||||
@item info slirp
 | 
					 | 
				
			||||||
show SLIRP statistics (if available)
 | 
					 | 
				
			||||||
@item info usernet
 | 
					@item info usernet
 | 
				
			||||||
show user network stack connection states
 | 
					show user network stack connection states
 | 
				
			||||||
@item info migrate
 | 
					@item info migrate
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										154
									
								
								slirp/debug.c
									
									
									
									
									
								
							
							
						
						
									
										154
									
								
								slirp/debug.c
									
									
									
									
									
								
							@ -10,157 +10,3 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
FILE *dfd = NULL;
 | 
					FILE *dfd = NULL;
 | 
				
			||||||
int slirp_debug = 0;
 | 
					int slirp_debug = 0;
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef LOG_ENABLED
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
ipstats(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	lprint(" \r\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lprint("IP stats:\r\n");
 | 
					 | 
				
			||||||
	lprint("  %6d total packets received (%d were unaligned)\r\n",
 | 
					 | 
				
			||||||
			ipstat.ips_total, ipstat.ips_unaligned);
 | 
					 | 
				
			||||||
	lprint("  %6d with incorrect version\r\n", ipstat.ips_badvers);
 | 
					 | 
				
			||||||
	lprint("  %6d with bad header checksum\r\n", ipstat.ips_badsum);
 | 
					 | 
				
			||||||
	lprint("  %6d with length too short (len < sizeof(iphdr))\r\n", ipstat.ips_tooshort);
 | 
					 | 
				
			||||||
	lprint("  %6d with length too small (len < ip->len)\r\n", ipstat.ips_toosmall);
 | 
					 | 
				
			||||||
	lprint("  %6d with bad header length\r\n", ipstat.ips_badhlen);
 | 
					 | 
				
			||||||
	lprint("  %6d with bad packet length\r\n", ipstat.ips_badlen);
 | 
					 | 
				
			||||||
	lprint("  %6d fragments received\r\n", ipstat.ips_fragments);
 | 
					 | 
				
			||||||
	lprint("  %6d fragments dropped\r\n", ipstat.ips_fragdropped);
 | 
					 | 
				
			||||||
	lprint("  %6d fragments timed out\r\n", ipstat.ips_fragtimeout);
 | 
					 | 
				
			||||||
	lprint("  %6d packets reassembled ok\r\n", ipstat.ips_reassembled);
 | 
					 | 
				
			||||||
	lprint("  %6d outgoing packets fragmented\r\n", ipstat.ips_fragmented);
 | 
					 | 
				
			||||||
	lprint("  %6d total outgoing fragments\r\n", ipstat.ips_ofragments);
 | 
					 | 
				
			||||||
	lprint("  %6d with bad protocol field\r\n", ipstat.ips_noproto);
 | 
					 | 
				
			||||||
	lprint("  %6d total packets delivered\r\n", ipstat.ips_delivered);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
tcpstats(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	lprint(" \r\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lprint("TCP stats:\r\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lprint("  %6d packets sent\r\n", tcpstat.tcps_sndtotal);
 | 
					 | 
				
			||||||
	lprint("          %6d data packets (%d bytes)\r\n",
 | 
					 | 
				
			||||||
			tcpstat.tcps_sndpack, tcpstat.tcps_sndbyte);
 | 
					 | 
				
			||||||
	lprint("          %6d data packets retransmitted (%d bytes)\r\n",
 | 
					 | 
				
			||||||
			tcpstat.tcps_sndrexmitpack, tcpstat.tcps_sndrexmitbyte);
 | 
					 | 
				
			||||||
	lprint("          %6d ack-only packets (%d delayed)\r\n",
 | 
					 | 
				
			||||||
			tcpstat.tcps_sndacks, tcpstat.tcps_delack);
 | 
					 | 
				
			||||||
	lprint("          %6d URG only packets\r\n", tcpstat.tcps_sndurg);
 | 
					 | 
				
			||||||
	lprint("          %6d window probe packets\r\n", tcpstat.tcps_sndprobe);
 | 
					 | 
				
			||||||
	lprint("          %6d window update packets\r\n", tcpstat.tcps_sndwinup);
 | 
					 | 
				
			||||||
	lprint("          %6d control (SYN/FIN/RST) packets\r\n", tcpstat.tcps_sndctrl);
 | 
					 | 
				
			||||||
	lprint("          %6d times tcp_output did nothing\r\n", tcpstat.tcps_didnuttin);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lprint("  %6d packets received\r\n", tcpstat.tcps_rcvtotal);
 | 
					 | 
				
			||||||
	lprint("          %6d acks (for %d bytes)\r\n",
 | 
					 | 
				
			||||||
			tcpstat.tcps_rcvackpack, tcpstat.tcps_rcvackbyte);
 | 
					 | 
				
			||||||
	lprint("          %6d duplicate acks\r\n", tcpstat.tcps_rcvdupack);
 | 
					 | 
				
			||||||
	lprint("          %6d acks for unsent data\r\n", tcpstat.tcps_rcvacktoomuch);
 | 
					 | 
				
			||||||
	lprint("          %6d packets received in sequence (%d bytes)\r\n",
 | 
					 | 
				
			||||||
			tcpstat.tcps_rcvpack, tcpstat.tcps_rcvbyte);
 | 
					 | 
				
			||||||
        lprint("          %6d completely duplicate packets (%d bytes)\r\n",
 | 
					 | 
				
			||||||
			tcpstat.tcps_rcvduppack, tcpstat.tcps_rcvdupbyte);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lprint("          %6d packets with some duplicate data (%d bytes duped)\r\n",
 | 
					 | 
				
			||||||
			tcpstat.tcps_rcvpartduppack, tcpstat.tcps_rcvpartdupbyte);
 | 
					 | 
				
			||||||
	lprint("          %6d out-of-order packets (%d bytes)\r\n",
 | 
					 | 
				
			||||||
			tcpstat.tcps_rcvoopack, tcpstat.tcps_rcvoobyte);
 | 
					 | 
				
			||||||
	lprint("          %6d packets of data after window (%d bytes)\r\n",
 | 
					 | 
				
			||||||
			tcpstat.tcps_rcvpackafterwin, tcpstat.tcps_rcvbyteafterwin);
 | 
					 | 
				
			||||||
	lprint("          %6d window probes\r\n", tcpstat.tcps_rcvwinprobe);
 | 
					 | 
				
			||||||
	lprint("          %6d window update packets\r\n", tcpstat.tcps_rcvwinupd);
 | 
					 | 
				
			||||||
	lprint("          %6d packets received after close\r\n", tcpstat.tcps_rcvafterclose);
 | 
					 | 
				
			||||||
	lprint("          %6d discarded for bad checksums\r\n", tcpstat.tcps_rcvbadsum);
 | 
					 | 
				
			||||||
	lprint("          %6d discarded for bad header offset fields\r\n",
 | 
					 | 
				
			||||||
			tcpstat.tcps_rcvbadoff);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lprint("  %6d connection requests\r\n", tcpstat.tcps_connattempt);
 | 
					 | 
				
			||||||
	lprint("  %6d connection accepts\r\n", tcpstat.tcps_accepts);
 | 
					 | 
				
			||||||
	lprint("  %6d connections established (including accepts)\r\n", tcpstat.tcps_connects);
 | 
					 | 
				
			||||||
	lprint("  %6d connections closed (including %d drop)\r\n",
 | 
					 | 
				
			||||||
			tcpstat.tcps_closed, tcpstat.tcps_drops);
 | 
					 | 
				
			||||||
	lprint("  %6d embryonic connections dropped\r\n", tcpstat.tcps_conndrops);
 | 
					 | 
				
			||||||
	lprint("  %6d segments we tried to get rtt (%d succeeded)\r\n",
 | 
					 | 
				
			||||||
			tcpstat.tcps_segstimed, tcpstat.tcps_rttupdated);
 | 
					 | 
				
			||||||
	lprint("  %6d retransmit timeouts\r\n", tcpstat.tcps_rexmttimeo);
 | 
					 | 
				
			||||||
	lprint("          %6d connections dropped by rxmt timeout\r\n",
 | 
					 | 
				
			||||||
			tcpstat.tcps_timeoutdrop);
 | 
					 | 
				
			||||||
	lprint("  %6d persist timeouts\r\n", tcpstat.tcps_persisttimeo);
 | 
					 | 
				
			||||||
	lprint("  %6d keepalive timeouts\r\n", tcpstat.tcps_keeptimeo);
 | 
					 | 
				
			||||||
	lprint("          %6d keepalive probes sent\r\n", tcpstat.tcps_keepprobe);
 | 
					 | 
				
			||||||
	lprint("          %6d connections dropped by keepalive\r\n", tcpstat.tcps_keepdrops);
 | 
					 | 
				
			||||||
	lprint("  %6d correct ACK header predictions\r\n", tcpstat.tcps_predack);
 | 
					 | 
				
			||||||
	lprint("  %6d correct data packet header predictions\n", tcpstat.tcps_preddat);
 | 
					 | 
				
			||||||
	lprint("  %6d TCP cache misses\r\n", tcpstat.tcps_socachemiss);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
udpstats(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
        lprint(" \r\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lprint("UDP stats:\r\n");
 | 
					 | 
				
			||||||
	lprint("  %6d datagrams received\r\n", udpstat.udps_ipackets);
 | 
					 | 
				
			||||||
	lprint("  %6d with packets shorter than header\r\n", udpstat.udps_hdrops);
 | 
					 | 
				
			||||||
	lprint("  %6d with bad checksums\r\n", udpstat.udps_badsum);
 | 
					 | 
				
			||||||
	lprint("  %6d with data length larger than packet\r\n", udpstat.udps_badlen);
 | 
					 | 
				
			||||||
	lprint("  %6d UDP socket cache misses\r\n", udpstat.udpps_pcbcachemiss);
 | 
					 | 
				
			||||||
	lprint("  %6d datagrams sent\r\n", udpstat.udps_opackets);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
icmpstats(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	lprint(" \r\n");
 | 
					 | 
				
			||||||
	lprint("ICMP stats:\r\n");
 | 
					 | 
				
			||||||
	lprint("  %6d ICMP packets received\r\n", icmpstat.icps_received);
 | 
					 | 
				
			||||||
	lprint("  %6d were too short\r\n", icmpstat.icps_tooshort);
 | 
					 | 
				
			||||||
	lprint("  %6d with bad checksums\r\n", icmpstat.icps_checksum);
 | 
					 | 
				
			||||||
	lprint("  %6d with type not supported\r\n", icmpstat.icps_notsupp);
 | 
					 | 
				
			||||||
	lprint("  %6d with bad type feilds\r\n", icmpstat.icps_badtype);
 | 
					 | 
				
			||||||
	lprint("  %6d ICMP packets sent in reply\r\n", icmpstat.icps_reflect);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
mbufstats(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct mbuf *m;
 | 
					 | 
				
			||||||
	int i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        lprint(" \r\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lprint("Mbuf stats:\r\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lprint("  %6d mbufs allocated (%d max)\r\n", mbuf_alloced, mbuf_max);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	i = 0;
 | 
					 | 
				
			||||||
	for (m = m_freelist.m_next; m != &m_freelist; m = m->m_next)
 | 
					 | 
				
			||||||
		i++;
 | 
					 | 
				
			||||||
	lprint("  %6d mbufs on free list\r\n",  i);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	i = 0;
 | 
					 | 
				
			||||||
	for (m = m_usedlist.m_next; m != &m_usedlist; m = m->m_next)
 | 
					 | 
				
			||||||
		i++;
 | 
					 | 
				
			||||||
	lprint("  %6d mbufs on used list\r\n",  i);
 | 
					 | 
				
			||||||
        lprint("  %6d mbufs queued as packets\r\n\r\n", if_queued);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					 | 
				
			||||||
slirp_stats(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
#ifdef LOG_ENABLED
 | 
					 | 
				
			||||||
    ipstats();
 | 
					 | 
				
			||||||
    tcpstats();
 | 
					 | 
				
			||||||
    udpstats();
 | 
					 | 
				
			||||||
    icmpstats();
 | 
					 | 
				
			||||||
    mbufstats();
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    lprint("SLIRP statistics code not compiled.\n");
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -33,20 +33,6 @@
 | 
				
			|||||||
#ifndef _NETINET_ICMP_VAR_H_
 | 
					#ifndef _NETINET_ICMP_VAR_H_
 | 
				
			||||||
#define _NETINET_ICMP_VAR_H_
 | 
					#define _NETINET_ICMP_VAR_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Variables related to this implementation
 | 
					 | 
				
			||||||
 * of the internet control message protocol.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct icmpstat {
 | 
					 | 
				
			||||||
/* statistics related to input messages processed */
 | 
					 | 
				
			||||||
	u_long  icps_received;		/* #ICMP packets received */
 | 
					 | 
				
			||||||
	u_long	icps_tooshort;		/* packet < ICMP_MINLEN */
 | 
					 | 
				
			||||||
	u_long	icps_checksum;		/* bad checksum */
 | 
					 | 
				
			||||||
	u_long	icps_notsupp;		/* #ICMP packets not supported */
 | 
					 | 
				
			||||||
	u_long  icps_badtype;		/* #with bad type feild */
 | 
					 | 
				
			||||||
	u_long	icps_reflect;		/* number of responses */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Names for ICMP sysctl objects
 | 
					 * Names for ICMP sysctl objects
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@ -60,8 +46,4 @@ struct icmpstat {
 | 
				
			|||||||
	{ "stats", CTLTYPE_STRUCT }, \
 | 
						{ "stats", CTLTYPE_STRUCT }, \
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef LOG_ENABLED
 | 
					 | 
				
			||||||
extern struct icmpstat icmpstat;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										20
									
								
								slirp/if.h
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								slirp/if.h
									
									
									
									
									
								
							@ -28,24 +28,4 @@ extern	struct mbuf *next_m;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define ifs_init(ifm) ((ifm)->ifs_next = (ifm)->ifs_prev = (ifm))
 | 
					#define ifs_init(ifm) ((ifm)->ifs_next = (ifm)->ifs_prev = (ifm))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef LOG_ENABLED
 | 
					 | 
				
			||||||
/* Interface statistics */
 | 
					 | 
				
			||||||
struct slirp_ifstats {
 | 
					 | 
				
			||||||
	u_int out_pkts;		/* Output packets */
 | 
					 | 
				
			||||||
	u_int out_bytes;		/* Output bytes */
 | 
					 | 
				
			||||||
	u_int out_errpkts;	/* Output Error Packets */
 | 
					 | 
				
			||||||
	u_int out_errbytes;	/* Output Error Bytes */
 | 
					 | 
				
			||||||
	u_int in_pkts;		/* Input packets */
 | 
					 | 
				
			||||||
	u_int in_bytes;		/* Input bytes */
 | 
					 | 
				
			||||||
	u_int in_errpkts;		/* Input Error Packets */
 | 
					 | 
				
			||||||
	u_int in_errbytes;	/* Input Error Bytes */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	u_int bytes_saved;	/* Number of bytes that compression "saved" */
 | 
					 | 
				
			||||||
				/* ie: number of bytes that didn't need to be sent over the link
 | 
					 | 
				
			||||||
				 * because of compression */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	u_int in_mbad;		/* Bad incoming packets */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										37
									
								
								slirp/ip.h
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								slirp/ip.h
									
									
									
									
									
								
							@ -250,43 +250,6 @@ struct ipoption {
 | 
				
			|||||||
	int8_t	ipopt_list[MAX_IPOPTLEN];	/* options proper */
 | 
						int8_t	ipopt_list[MAX_IPOPTLEN];	/* options proper */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef LOG_ENABLED
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Structure attached to inpcb.ip_moptions and
 | 
					 | 
				
			||||||
 * passed to ip_output when IP multicast options are in use.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct	ipstat {
 | 
					 | 
				
			||||||
	u_long	ips_total;		/* total packets received */
 | 
					 | 
				
			||||||
	u_long	ips_badsum;		/* checksum bad */
 | 
					 | 
				
			||||||
	u_long	ips_tooshort;		/* packet too short */
 | 
					 | 
				
			||||||
	u_long	ips_toosmall;		/* not enough data */
 | 
					 | 
				
			||||||
	u_long	ips_badhlen;		/* ip header length < data size */
 | 
					 | 
				
			||||||
	u_long	ips_badlen;		/* ip length < ip header length */
 | 
					 | 
				
			||||||
	u_long	ips_fragments;		/* fragments received */
 | 
					 | 
				
			||||||
	u_long	ips_fragdropped;	/* frags dropped (dups, out of space) */
 | 
					 | 
				
			||||||
	u_long	ips_fragtimeout;	/* fragments timed out */
 | 
					 | 
				
			||||||
	u_long	ips_forward;		/* packets forwarded */
 | 
					 | 
				
			||||||
	u_long	ips_cantforward;	/* packets rcvd for unreachable dest */
 | 
					 | 
				
			||||||
	u_long	ips_redirectsent;	/* packets forwarded on same net */
 | 
					 | 
				
			||||||
	u_long	ips_noproto;		/* unknown or unsupported protocol */
 | 
					 | 
				
			||||||
	u_long	ips_delivered;		/* datagrams delivered to upper level*/
 | 
					 | 
				
			||||||
	u_long	ips_localout;		/* total ip packets generated here */
 | 
					 | 
				
			||||||
	u_long	ips_odropped;		/* lost packets due to nobufs, etc. */
 | 
					 | 
				
			||||||
	u_long	ips_reassembled;	/* total packets reassembled ok */
 | 
					 | 
				
			||||||
	u_long	ips_fragmented;		/* datagrams successfully fragmented */
 | 
					 | 
				
			||||||
	u_long	ips_ofragments;		/* output fragments created */
 | 
					 | 
				
			||||||
	u_long	ips_cantfrag;		/* don't fragment flag was set, etc. */
 | 
					 | 
				
			||||||
	u_long	ips_badoptions;		/* error in option processing */
 | 
					 | 
				
			||||||
	u_long	ips_noroute;		/* packets discarded due to no route */
 | 
					 | 
				
			||||||
	u_long	ips_badvers;		/* ip version != 4 */
 | 
					 | 
				
			||||||
	u_long	ips_rawout;		/* total raw ip packets generated */
 | 
					 | 
				
			||||||
	u_long	ips_unaligned;		/* times the ip packet was not aligned */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern struct	ipstat	ipstat;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern struct	ipq	ipq;			/* ip reass. queue */
 | 
					extern struct	ipq	ipq;			/* ip reass. queue */
 | 
				
			||||||
extern u_int16_t	ip_id;				/* ip packet ctr, for ids */
 | 
					extern u_int16_t	ip_id;				/* ip packet ctr, for ids */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -33,10 +33,6 @@
 | 
				
			|||||||
#include "slirp.h"
 | 
					#include "slirp.h"
 | 
				
			||||||
#include "ip_icmp.h"
 | 
					#include "ip_icmp.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef LOG_ENABLED
 | 
					 | 
				
			||||||
struct icmpstat icmpstat;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* The message sent when emulating PING */
 | 
					/* The message sent when emulating PING */
 | 
				
			||||||
/* Be nice and tell them it's just a pseudo-ping packet */
 | 
					/* Be nice and tell them it's just a pseudo-ping packet */
 | 
				
			||||||
static const char icmp_ping_msg[] = "This is a pseudo-PING packet used by Slirp to emulate ICMP ECHO-REQUEST packets.\n";
 | 
					static const char icmp_ping_msg[] = "This is a pseudo-PING packet used by Slirp to emulate ICMP ECHO-REQUEST packets.\n";
 | 
				
			||||||
@ -78,14 +74,11 @@ icmp_input(struct mbuf *m, int hlen)
 | 
				
			|||||||
  DEBUG_ARG("m = %lx", (long )m);
 | 
					  DEBUG_ARG("m = %lx", (long )m);
 | 
				
			||||||
  DEBUG_ARG("m_len = %d", m->m_len);
 | 
					  DEBUG_ARG("m_len = %d", m->m_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  STAT(icmpstat.icps_received++);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /*
 | 
					  /*
 | 
				
			||||||
   * Locate icmp structure in mbuf, and check
 | 
					   * Locate icmp structure in mbuf, and check
 | 
				
			||||||
   * that its not corrupted and of at least minimum length.
 | 
					   * that its not corrupted and of at least minimum length.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  if (icmplen < ICMP_MINLEN) {          /* min 8 bytes payload */
 | 
					  if (icmplen < ICMP_MINLEN) {          /* min 8 bytes payload */
 | 
				
			||||||
    STAT(icmpstat.icps_tooshort++);
 | 
					 | 
				
			||||||
  freeit:
 | 
					  freeit:
 | 
				
			||||||
    m_freem(m);
 | 
					    m_freem(m);
 | 
				
			||||||
    goto end_error;
 | 
					    goto end_error;
 | 
				
			||||||
@ -95,7 +88,6 @@ icmp_input(struct mbuf *m, int hlen)
 | 
				
			|||||||
  m->m_data += hlen;
 | 
					  m->m_data += hlen;
 | 
				
			||||||
  icp = mtod(m, struct icmp *);
 | 
					  icp = mtod(m, struct icmp *);
 | 
				
			||||||
  if (cksum(m, icmplen)) {
 | 
					  if (cksum(m, icmplen)) {
 | 
				
			||||||
    STAT(icmpstat.icps_checksum++);
 | 
					 | 
				
			||||||
    goto freeit;
 | 
					    goto freeit;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  m->m_len += hlen;
 | 
					  m->m_len += hlen;
 | 
				
			||||||
@ -159,12 +151,10 @@ icmp_input(struct mbuf *m, int hlen)
 | 
				
			|||||||
  case ICMP_TSTAMP:
 | 
					  case ICMP_TSTAMP:
 | 
				
			||||||
  case ICMP_MASKREQ:
 | 
					  case ICMP_MASKREQ:
 | 
				
			||||||
  case ICMP_REDIRECT:
 | 
					  case ICMP_REDIRECT:
 | 
				
			||||||
    STAT(icmpstat.icps_notsupp++);
 | 
					 | 
				
			||||||
    m_freem(m);
 | 
					    m_freem(m);
 | 
				
			||||||
    break;
 | 
					    break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  default:
 | 
					  default:
 | 
				
			||||||
    STAT(icmpstat.icps_badtype++);
 | 
					 | 
				
			||||||
    m_freem(m);
 | 
					    m_freem(m);
 | 
				
			||||||
  } /* swith */
 | 
					  } /* swith */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -299,8 +289,6 @@ icmp_error(struct mbuf *msrc, u_char type, u_char code, int minsize,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  (void ) ip_output((struct socket *)NULL, m);
 | 
					  (void ) ip_output((struct socket *)NULL, m);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  STAT(icmpstat.icps_reflect++);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
end_error:
 | 
					end_error:
 | 
				
			||||||
  return;
 | 
					  return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -354,6 +342,4 @@ icmp_reflect(struct mbuf *m)
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (void ) ip_output((struct socket *)NULL, m);
 | 
					  (void ) ip_output((struct socket *)NULL, m);
 | 
				
			||||||
 | 
					 | 
				
			||||||
  STAT(icmpstat.icps_reflect++);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -42,10 +42,6 @@
 | 
				
			|||||||
#include <osdep.h>
 | 
					#include <osdep.h>
 | 
				
			||||||
#include "ip_icmp.h"
 | 
					#include "ip_icmp.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef LOG_ENABLED
 | 
					 | 
				
			||||||
struct ipstat ipstat;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct ipq ipq;
 | 
					struct ipq ipq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct ip *ip_reass(register struct ip *ip,
 | 
					static struct ip *ip_reass(register struct ip *ip,
 | 
				
			||||||
@ -82,24 +78,19 @@ ip_input(struct mbuf *m)
 | 
				
			|||||||
	DEBUG_ARG("m = %lx", (long)m);
 | 
						DEBUG_ARG("m = %lx", (long)m);
 | 
				
			||||||
	DEBUG_ARG("m_len = %d", m->m_len);
 | 
						DEBUG_ARG("m_len = %d", m->m_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	STAT(ipstat.ips_total++);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (m->m_len < sizeof (struct ip)) {
 | 
						if (m->m_len < sizeof (struct ip)) {
 | 
				
			||||||
		STAT(ipstat.ips_toosmall++);
 | 
					 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ip = mtod(m, struct ip *);
 | 
						ip = mtod(m, struct ip *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (ip->ip_v != IPVERSION) {
 | 
						if (ip->ip_v != IPVERSION) {
 | 
				
			||||||
		STAT(ipstat.ips_badvers++);
 | 
					 | 
				
			||||||
		goto bad;
 | 
							goto bad;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	hlen = ip->ip_hl << 2;
 | 
						hlen = ip->ip_hl << 2;
 | 
				
			||||||
	if (hlen<sizeof(struct ip ) || hlen>m->m_len) {/* min header length */
 | 
						if (hlen<sizeof(struct ip ) || hlen>m->m_len) {/* min header length */
 | 
				
			||||||
	  STAT(ipstat.ips_badhlen++);                     /* or packet too short */
 | 
						  goto bad;                                  /* or packet too short */
 | 
				
			||||||
	  goto bad;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* keep ip header intact for ICMP reply
 | 
					        /* keep ip header intact for ICMP reply
 | 
				
			||||||
@ -107,7 +98,6 @@ ip_input(struct mbuf *m)
 | 
				
			|||||||
	 * if (ip->ip_sum) {
 | 
						 * if (ip->ip_sum) {
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	if(cksum(m,hlen)) {
 | 
						if(cksum(m,hlen)) {
 | 
				
			||||||
	  STAT(ipstat.ips_badsum++);
 | 
					 | 
				
			||||||
	  goto bad;
 | 
						  goto bad;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -116,7 +106,6 @@ ip_input(struct mbuf *m)
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
	NTOHS(ip->ip_len);
 | 
						NTOHS(ip->ip_len);
 | 
				
			||||||
	if (ip->ip_len < hlen) {
 | 
						if (ip->ip_len < hlen) {
 | 
				
			||||||
		STAT(ipstat.ips_badlen++);
 | 
					 | 
				
			||||||
		goto bad;
 | 
							goto bad;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	NTOHS(ip->ip_id);
 | 
						NTOHS(ip->ip_id);
 | 
				
			||||||
@ -129,7 +118,6 @@ ip_input(struct mbuf *m)
 | 
				
			|||||||
	 * Drop packet if shorter than we expect.
 | 
						 * Drop packet if shorter than we expect.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	if (m->m_len < ip->ip_len) {
 | 
						if (m->m_len < ip->ip_len) {
 | 
				
			||||||
		STAT(ipstat.ips_tooshort++);
 | 
					 | 
				
			||||||
		goto bad;
 | 
							goto bad;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -210,11 +198,9 @@ ip_input(struct mbuf *m)
 | 
				
			|||||||
		 * attempt reassembly; if it succeeds, proceed.
 | 
							 * attempt reassembly; if it succeeds, proceed.
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		if (ip->ip_tos & 1 || ip->ip_off) {
 | 
							if (ip->ip_tos & 1 || ip->ip_off) {
 | 
				
			||||||
			STAT(ipstat.ips_fragments++);
 | 
					 | 
				
			||||||
			ip = ip_reass(ip, fp);
 | 
								ip = ip_reass(ip, fp);
 | 
				
			||||||
                        if (ip == NULL)
 | 
					                        if (ip == NULL)
 | 
				
			||||||
				return;
 | 
									return;
 | 
				
			||||||
			STAT(ipstat.ips_reassembled++);
 | 
					 | 
				
			||||||
			m = dtom(ip);
 | 
								m = dtom(ip);
 | 
				
			||||||
		} else
 | 
							} else
 | 
				
			||||||
			if (fp)
 | 
								if (fp)
 | 
				
			||||||
@ -226,7 +212,6 @@ ip_input(struct mbuf *m)
 | 
				
			|||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Switch out to protocol's input routine.
 | 
						 * Switch out to protocol's input routine.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	STAT(ipstat.ips_delivered++);
 | 
					 | 
				
			||||||
	switch (ip->ip_p) {
 | 
						switch (ip->ip_p) {
 | 
				
			||||||
	 case IPPROTO_TCP:
 | 
						 case IPPROTO_TCP:
 | 
				
			||||||
		tcp_input(m, hlen, (struct socket *)NULL);
 | 
							tcp_input(m, hlen, (struct socket *)NULL);
 | 
				
			||||||
@ -238,7 +223,6 @@ ip_input(struct mbuf *m)
 | 
				
			|||||||
		icmp_input(m, hlen);
 | 
							icmp_input(m, hlen);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	 default:
 | 
						 default:
 | 
				
			||||||
		STAT(ipstat.ips_noproto++);
 | 
					 | 
				
			||||||
		m_free(m);
 | 
							m_free(m);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
@ -399,7 +383,6 @@ insert:
 | 
				
			|||||||
	return ip;
 | 
						return ip;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dropfrag:
 | 
					dropfrag:
 | 
				
			||||||
	STAT(ipstat.ips_fragdropped++);
 | 
					 | 
				
			||||||
	m_freem(m);
 | 
						m_freem(m);
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -468,7 +451,6 @@ ip_slowtimo(void)
 | 
				
			|||||||
        struct ipq *fp = container_of(l, struct ipq, ip_link);
 | 
					        struct ipq *fp = container_of(l, struct ipq, ip_link);
 | 
				
			||||||
        l = l->next;
 | 
					        l = l->next;
 | 
				
			||||||
		if (--fp->ipq_ttl == 0) {
 | 
							if (--fp->ipq_ttl == 0) {
 | 
				
			||||||
			STAT(ipstat.ips_fragtimeout++);
 | 
					 | 
				
			||||||
			ip_freef(fp);
 | 
								ip_freef(fp);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -671,7 +653,6 @@ typedef u_int32_t n_time;
 | 
				
			|||||||
bad:
 | 
					bad:
 | 
				
			||||||
 	icmp_error(m, type, code, 0, 0);
 | 
					 	icmp_error(m, type, code, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	STAT(ipstat.ips_badoptions++);
 | 
					 | 
				
			||||||
	return (1);
 | 
						return (1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -72,7 +72,6 @@ ip_output(struct socket *so, struct mbuf *m0)
 | 
				
			|||||||
	ip->ip_off &= IP_DF;
 | 
						ip->ip_off &= IP_DF;
 | 
				
			||||||
	ip->ip_id = htons(ip_id++);
 | 
						ip->ip_id = htons(ip_id++);
 | 
				
			||||||
	ip->ip_hl = hlen >> 2;
 | 
						ip->ip_hl = hlen >> 2;
 | 
				
			||||||
	STAT(ipstat.ips_localout++);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * If small enough for interface, can just send directly.
 | 
						 * If small enough for interface, can just send directly.
 | 
				
			||||||
@ -93,7 +92,6 @@ ip_output(struct socket *so, struct mbuf *m0)
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
	if (ip->ip_off & IP_DF) {
 | 
						if (ip->ip_off & IP_DF) {
 | 
				
			||||||
		error = -1;
 | 
							error = -1;
 | 
				
			||||||
		STAT(ipstat.ips_cantfrag++);
 | 
					 | 
				
			||||||
		goto bad;
 | 
							goto bad;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -118,7 +116,6 @@ ip_output(struct socket *so, struct mbuf *m0)
 | 
				
			|||||||
	  m = m_get();
 | 
						  m = m_get();
 | 
				
			||||||
          if (m == NULL) {
 | 
					          if (m == NULL) {
 | 
				
			||||||
	    error = -1;
 | 
						    error = -1;
 | 
				
			||||||
	    STAT(ipstat.ips_odropped++);
 | 
					 | 
				
			||||||
	    goto sendorfree;
 | 
						    goto sendorfree;
 | 
				
			||||||
	  }
 | 
						  }
 | 
				
			||||||
	  m->m_data += IF_MAXLINKHDR;
 | 
						  m->m_data += IF_MAXLINKHDR;
 | 
				
			||||||
@ -145,7 +142,6 @@ ip_output(struct socket *so, struct mbuf *m0)
 | 
				
			|||||||
	  mhip->ip_sum = cksum(m, mhlen);
 | 
						  mhip->ip_sum = cksum(m, mhlen);
 | 
				
			||||||
	  *mnext = m;
 | 
						  *mnext = m;
 | 
				
			||||||
	  mnext = &m->m_nextpkt;
 | 
						  mnext = &m->m_nextpkt;
 | 
				
			||||||
	  STAT(ipstat.ips_ofragments++);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Update first fragment by trimming what's been copied out
 | 
						 * Update first fragment by trimming what's been copied out
 | 
				
			||||||
@ -166,9 +162,6 @@ sendorfree:
 | 
				
			|||||||
		else
 | 
							else
 | 
				
			||||||
			m_freem(m);
 | 
								m_freem(m);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (error == 0)
 | 
					 | 
				
			||||||
		STAT(ipstat.ips_fragmented++);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
done:
 | 
					done:
 | 
				
			||||||
 | 
				
			|||||||
@ -26,7 +26,6 @@ int slirp_remove_hostfwd(int is_udp, struct in_addr host_addr, int host_port);
 | 
				
			|||||||
int slirp_add_exec(int do_pty, const void *args, struct in_addr guest_addr,
 | 
					int slirp_add_exec(int do_pty, const void *args, struct in_addr guest_addr,
 | 
				
			||||||
                   int guest_port);
 | 
					                   int guest_port);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void slirp_stats(void);
 | 
					 | 
				
			||||||
void slirp_connection_info(Monitor *mon);
 | 
					void slirp_connection_info(Monitor *mon);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void slirp_socket_recv(struct in_addr guest_addr, int guest_port,
 | 
					void slirp_socket_recv(struct in_addr guest_addr, int guest_port,
 | 
				
			||||||
 | 
				
			|||||||
@ -17,10 +17,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <slirp.h>
 | 
					#include <slirp.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int mbuf_alloced = 0;
 | 
					static int mbuf_alloced;
 | 
				
			||||||
struct mbuf m_freelist, m_usedlist;
 | 
					struct mbuf m_freelist, m_usedlist;
 | 
				
			||||||
#define MBUF_THRESH 30
 | 
					#define MBUF_THRESH 30
 | 
				
			||||||
int mbuf_max = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Find a nice value for msize
 | 
					 * Find a nice value for msize
 | 
				
			||||||
@ -57,8 +56,6 @@ m_get(void)
 | 
				
			|||||||
		mbuf_alloced++;
 | 
							mbuf_alloced++;
 | 
				
			||||||
		if (mbuf_alloced > MBUF_THRESH)
 | 
							if (mbuf_alloced > MBUF_THRESH)
 | 
				
			||||||
			flags = M_DOFREE;
 | 
								flags = M_DOFREE;
 | 
				
			||||||
		if (mbuf_alloced > mbuf_max)
 | 
					 | 
				
			||||||
			mbuf_max = mbuf_alloced;
 | 
					 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		m = m_freelist.m_next;
 | 
							m = m_freelist.m_next;
 | 
				
			||||||
		remque(m);
 | 
							remque(m);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										12
									
								
								slirp/mbuf.h
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								slirp/mbuf.h
									
									
									
									
									
								
							@ -114,19 +114,7 @@ struct mbuf {
 | 
				
			|||||||
#define M_DOFREE		0x08	/* when m_free is called on the mbuf, free()
 | 
					#define M_DOFREE		0x08	/* when m_free is called on the mbuf, free()
 | 
				
			||||||
					 * it rather than putting it on the free list */
 | 
										 * it rather than putting it on the free list */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Mbuf statistics. XXX
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct mbstat {
 | 
					 | 
				
			||||||
	int mbs_alloced;		/* Number of mbufs allocated */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern struct	mbstat mbstat;
 | 
					 | 
				
			||||||
extern int mbuf_alloced;
 | 
					 | 
				
			||||||
extern struct mbuf m_freelist, m_usedlist;
 | 
					extern struct mbuf m_freelist, m_usedlist;
 | 
				
			||||||
extern int mbuf_max;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void m_init _P((void));
 | 
					void m_init _P((void));
 | 
				
			||||||
struct mbuf * m_get _P((void));
 | 
					struct mbuf * m_get _P((void));
 | 
				
			||||||
 | 
				
			|||||||
@ -3,15 +3,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
//#define DEBUG 1
 | 
					//#define DEBUG 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uncomment the following line to enable SLIRP statistics printing in Qemu
 | 
					 | 
				
			||||||
//#define LOG_ENABLED
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef LOG_ENABLED
 | 
					 | 
				
			||||||
#define STAT(expr) expr
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
#define STAT(expr) do { } while(0)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "config-host.h"
 | 
					#include "config-host.h"
 | 
				
			||||||
#include "slirp_config.h"
 | 
					#include "slirp_config.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -75,8 +75,6 @@ tcp_seq tcp_iss;                /* tcp initial send seq # */
 | 
				
			|||||||
                       tp->t_flags |= TF_DELACK; \
 | 
					                       tp->t_flags |= TF_DELACK; \
 | 
				
			||||||
               (tp)->rcv_nxt += (ti)->ti_len; \
 | 
					               (tp)->rcv_nxt += (ti)->ti_len; \
 | 
				
			||||||
               flags = (ti)->ti_flags & TH_FIN; \
 | 
					               flags = (ti)->ti_flags & TH_FIN; \
 | 
				
			||||||
               STAT(tcpstat.tcps_rcvpack++);         \
 | 
					 | 
				
			||||||
               STAT(tcpstat.tcps_rcvbyte += (ti)->ti_len);   \
 | 
					 | 
				
			||||||
               if (so->so_emu) { \
 | 
					               if (so->so_emu) { \
 | 
				
			||||||
		       if (tcp_emu((so),(m))) sbappend((so), (m)); \
 | 
							       if (tcp_emu((so),(m))) sbappend((so), (m)); \
 | 
				
			||||||
	       } else \
 | 
						       } else \
 | 
				
			||||||
@ -94,8 +92,6 @@ tcp_seq tcp_iss;                /* tcp initial send seq # */
 | 
				
			|||||||
		tp->t_flags |= TF_DELACK; \
 | 
							tp->t_flags |= TF_DELACK; \
 | 
				
			||||||
		(tp)->rcv_nxt += (ti)->ti_len; \
 | 
							(tp)->rcv_nxt += (ti)->ti_len; \
 | 
				
			||||||
		flags = (ti)->ti_flags & TH_FIN; \
 | 
							flags = (ti)->ti_flags & TH_FIN; \
 | 
				
			||||||
		STAT(tcpstat.tcps_rcvpack++);        \
 | 
					 | 
				
			||||||
		STAT(tcpstat.tcps_rcvbyte += (ti)->ti_len);  \
 | 
					 | 
				
			||||||
		if (so->so_emu) { \
 | 
							if (so->so_emu) { \
 | 
				
			||||||
			if (tcp_emu((so),(m))) sbappend(so, (m)); \
 | 
								if (tcp_emu((so),(m))) sbappend(so, (m)); \
 | 
				
			||||||
		} else \
 | 
							} else \
 | 
				
			||||||
@ -145,8 +141,6 @@ tcp_reass(register struct tcpcb *tp, register struct tcpiphdr *ti,
 | 
				
			|||||||
		i = q->ti_seq + q->ti_len - ti->ti_seq;
 | 
							i = q->ti_seq + q->ti_len - ti->ti_seq;
 | 
				
			||||||
		if (i > 0) {
 | 
							if (i > 0) {
 | 
				
			||||||
			if (i >= ti->ti_len) {
 | 
								if (i >= ti->ti_len) {
 | 
				
			||||||
				STAT(tcpstat.tcps_rcvduppack++);
 | 
					 | 
				
			||||||
				STAT(tcpstat.tcps_rcvdupbyte += ti->ti_len);
 | 
					 | 
				
			||||||
				m_freem(m);
 | 
									m_freem(m);
 | 
				
			||||||
				/*
 | 
									/*
 | 
				
			||||||
				 * Try to present any queued data
 | 
									 * Try to present any queued data
 | 
				
			||||||
@ -162,8 +156,6 @@ tcp_reass(register struct tcpcb *tp, register struct tcpiphdr *ti,
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		q = tcpiphdr_next(q);
 | 
							q = tcpiphdr_next(q);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	STAT(tcpstat.tcps_rcvoopack++);
 | 
					 | 
				
			||||||
	STAT(tcpstat.tcps_rcvoobyte += ti->ti_len);
 | 
					 | 
				
			||||||
	ti->ti_mbuf = m;
 | 
						ti->ti_mbuf = m;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
@ -263,8 +255,6 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *inso)
 | 
				
			|||||||
		goto cont_conn;
 | 
							goto cont_conn;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
	STAT(tcpstat.tcps_rcvtotal++);
 | 
					 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Get IP and TCP header together in first mbuf.
 | 
						 * Get IP and TCP header together in first mbuf.
 | 
				
			||||||
	 * Note: IP leaves IP header in first mbuf.
 | 
						 * Note: IP leaves IP header in first mbuf.
 | 
				
			||||||
@ -295,7 +285,6 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *inso)
 | 
				
			|||||||
	ti->ti_len = htons((u_int16_t)tlen);
 | 
						ti->ti_len = htons((u_int16_t)tlen);
 | 
				
			||||||
	len = sizeof(struct ip ) + tlen;
 | 
						len = sizeof(struct ip ) + tlen;
 | 
				
			||||||
	if(cksum(m, len)) {
 | 
						if(cksum(m, len)) {
 | 
				
			||||||
	  STAT(tcpstat.tcps_rcvbadsum++);
 | 
					 | 
				
			||||||
	  goto drop;
 | 
						  goto drop;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -305,7 +294,6 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *inso)
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
	off = ti->ti_off << 2;
 | 
						off = ti->ti_off << 2;
 | 
				
			||||||
	if (off < sizeof (struct tcphdr) || off > tlen) {
 | 
						if (off < sizeof (struct tcphdr) || off > tlen) {
 | 
				
			||||||
	  STAT(tcpstat.tcps_rcvbadoff++);
 | 
					 | 
				
			||||||
	  goto drop;
 | 
						  goto drop;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	tlen -= off;
 | 
						tlen -= off;
 | 
				
			||||||
@ -353,7 +341,6 @@ findso:
 | 
				
			|||||||
			       ti->ti_dst, ti->ti_dport);
 | 
								       ti->ti_dst, ti->ti_dport);
 | 
				
			||||||
		if (so)
 | 
							if (so)
 | 
				
			||||||
			tcp_last_so = so;
 | 
								tcp_last_so = so;
 | 
				
			||||||
		STAT(tcpstat.tcps_socachemiss++);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
@ -460,13 +447,10 @@ findso:
 | 
				
			|||||||
				/*
 | 
									/*
 | 
				
			||||||
				 * this is a pure ack for outstanding data.
 | 
									 * this is a pure ack for outstanding data.
 | 
				
			||||||
				 */
 | 
									 */
 | 
				
			||||||
				STAT(tcpstat.tcps_predack++);
 | 
					 | 
				
			||||||
				if (tp->t_rtt &&
 | 
									if (tp->t_rtt &&
 | 
				
			||||||
				    SEQ_GT(ti->ti_ack, tp->t_rtseq))
 | 
									    SEQ_GT(ti->ti_ack, tp->t_rtseq))
 | 
				
			||||||
					tcp_xmit_timer(tp, tp->t_rtt);
 | 
										tcp_xmit_timer(tp, tp->t_rtt);
 | 
				
			||||||
				acked = ti->ti_ack - tp->snd_una;
 | 
									acked = ti->ti_ack - tp->snd_una;
 | 
				
			||||||
				STAT(tcpstat.tcps_rcvackpack++);
 | 
					 | 
				
			||||||
				STAT(tcpstat.tcps_rcvackbyte += acked);
 | 
					 | 
				
			||||||
				sbdrop(&so->so_snd, acked);
 | 
									sbdrop(&so->so_snd, acked);
 | 
				
			||||||
				tp->snd_una = ti->ti_ack;
 | 
									tp->snd_una = ti->ti_ack;
 | 
				
			||||||
				m_freem(m);
 | 
									m_freem(m);
 | 
				
			||||||
@ -503,10 +487,7 @@ findso:
 | 
				
			|||||||
			 * with nothing on the reassembly queue and
 | 
								 * with nothing on the reassembly queue and
 | 
				
			||||||
			 * we have enough buffer space to take it.
 | 
								 * we have enough buffer space to take it.
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
			STAT(tcpstat.tcps_preddat++);
 | 
					 | 
				
			||||||
			tp->rcv_nxt += ti->ti_len;
 | 
								tp->rcv_nxt += ti->ti_len;
 | 
				
			||||||
			STAT(tcpstat.tcps_rcvpack++);
 | 
					 | 
				
			||||||
			STAT(tcpstat.tcps_rcvbyte += ti->ti_len);
 | 
					 | 
				
			||||||
			/*
 | 
								/*
 | 
				
			||||||
			 * Add data to socket buffer.
 | 
								 * Add data to socket buffer.
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
@ -658,7 +639,6 @@ findso:
 | 
				
			|||||||
	  tp->t_flags |= TF_ACKNOW;
 | 
						  tp->t_flags |= TF_ACKNOW;
 | 
				
			||||||
	  tp->t_state = TCPS_SYN_RECEIVED;
 | 
						  tp->t_state = TCPS_SYN_RECEIVED;
 | 
				
			||||||
	  tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
 | 
						  tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
 | 
				
			||||||
	  STAT(tcpstat.tcps_accepts++);
 | 
					 | 
				
			||||||
	  goto trimthenstep6;
 | 
						  goto trimthenstep6;
 | 
				
			||||||
	} /* case TCPS_LISTEN */
 | 
						} /* case TCPS_LISTEN */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -699,7 +679,6 @@ findso:
 | 
				
			|||||||
		tcp_rcvseqinit(tp);
 | 
							tcp_rcvseqinit(tp);
 | 
				
			||||||
		tp->t_flags |= TF_ACKNOW;
 | 
							tp->t_flags |= TF_ACKNOW;
 | 
				
			||||||
		if (tiflags & TH_ACK && SEQ_GT(tp->snd_una, tp->iss)) {
 | 
							if (tiflags & TH_ACK && SEQ_GT(tp->snd_una, tp->iss)) {
 | 
				
			||||||
			STAT(tcpstat.tcps_connects++);
 | 
					 | 
				
			||||||
			soisfconnected(so);
 | 
								soisfconnected(so);
 | 
				
			||||||
			tp->t_state = TCPS_ESTABLISHED;
 | 
								tp->t_state = TCPS_ESTABLISHED;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -726,8 +705,6 @@ trimthenstep6:
 | 
				
			|||||||
			m_adj(m, -todrop);
 | 
								m_adj(m, -todrop);
 | 
				
			||||||
			ti->ti_len = tp->rcv_wnd;
 | 
								ti->ti_len = tp->rcv_wnd;
 | 
				
			||||||
			tiflags &= ~TH_FIN;
 | 
								tiflags &= ~TH_FIN;
 | 
				
			||||||
			STAT(tcpstat.tcps_rcvpackafterwin++);
 | 
					 | 
				
			||||||
			STAT(tcpstat.tcps_rcvbyteafterwin += todrop);
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		tp->snd_wl1 = ti->ti_seq - 1;
 | 
							tp->snd_wl1 = ti->ti_seq - 1;
 | 
				
			||||||
		tp->rcv_up = ti->ti_seq;
 | 
							tp->rcv_up = ti->ti_seq;
 | 
				
			||||||
@ -768,11 +745,6 @@ trimthenstep6:
 | 
				
			|||||||
			 */
 | 
								 */
 | 
				
			||||||
			tp->t_flags |= TF_ACKNOW;
 | 
								tp->t_flags |= TF_ACKNOW;
 | 
				
			||||||
			todrop = ti->ti_len;
 | 
								todrop = ti->ti_len;
 | 
				
			||||||
			STAT(tcpstat.tcps_rcvduppack++);
 | 
					 | 
				
			||||||
			STAT(tcpstat.tcps_rcvdupbyte += todrop);
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			STAT(tcpstat.tcps_rcvpartduppack++);
 | 
					 | 
				
			||||||
			STAT(tcpstat.tcps_rcvpartdupbyte += todrop);
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		m_adj(m, todrop);
 | 
							m_adj(m, todrop);
 | 
				
			||||||
		ti->ti_seq += todrop;
 | 
							ti->ti_seq += todrop;
 | 
				
			||||||
@ -791,7 +763,6 @@ trimthenstep6:
 | 
				
			|||||||
	if ((so->so_state & SS_NOFDREF) &&
 | 
						if ((so->so_state & SS_NOFDREF) &&
 | 
				
			||||||
	    tp->t_state > TCPS_CLOSE_WAIT && ti->ti_len) {
 | 
						    tp->t_state > TCPS_CLOSE_WAIT && ti->ti_len) {
 | 
				
			||||||
		tp = tcp_close(tp);
 | 
							tp = tcp_close(tp);
 | 
				
			||||||
		STAT(tcpstat.tcps_rcvafterclose++);
 | 
					 | 
				
			||||||
		goto dropwithreset;
 | 
							goto dropwithreset;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -801,9 +772,7 @@ trimthenstep6:
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
	todrop = (ti->ti_seq+ti->ti_len) - (tp->rcv_nxt+tp->rcv_wnd);
 | 
						todrop = (ti->ti_seq+ti->ti_len) - (tp->rcv_nxt+tp->rcv_wnd);
 | 
				
			||||||
	if (todrop > 0) {
 | 
						if (todrop > 0) {
 | 
				
			||||||
		STAT(tcpstat.tcps_rcvpackafterwin++);
 | 
					 | 
				
			||||||
		if (todrop >= ti->ti_len) {
 | 
							if (todrop >= ti->ti_len) {
 | 
				
			||||||
			STAT(tcpstat.tcps_rcvbyteafterwin += ti->ti_len);
 | 
					 | 
				
			||||||
			/*
 | 
								/*
 | 
				
			||||||
			 * If a new connection request is received
 | 
								 * If a new connection request is received
 | 
				
			||||||
			 * while in TIME_WAIT, drop the old connection
 | 
								 * while in TIME_WAIT, drop the old connection
 | 
				
			||||||
@ -826,11 +795,10 @@ trimthenstep6:
 | 
				
			|||||||
			 */
 | 
								 */
 | 
				
			||||||
			if (tp->rcv_wnd == 0 && ti->ti_seq == tp->rcv_nxt) {
 | 
								if (tp->rcv_wnd == 0 && ti->ti_seq == tp->rcv_nxt) {
 | 
				
			||||||
				tp->t_flags |= TF_ACKNOW;
 | 
									tp->t_flags |= TF_ACKNOW;
 | 
				
			||||||
				STAT(tcpstat.tcps_rcvwinprobe++);
 | 
								} else {
 | 
				
			||||||
			} else
 | 
					 | 
				
			||||||
				goto dropafterack;
 | 
									goto dropafterack;
 | 
				
			||||||
		} else
 | 
								}
 | 
				
			||||||
			STAT(tcpstat.tcps_rcvbyteafterwin += todrop);
 | 
							}
 | 
				
			||||||
		m_adj(m, -todrop);
 | 
							m_adj(m, -todrop);
 | 
				
			||||||
		ti->ti_len -= todrop;
 | 
							ti->ti_len -= todrop;
 | 
				
			||||||
		tiflags &= ~(TH_PUSH|TH_FIN);
 | 
							tiflags &= ~(TH_PUSH|TH_FIN);
 | 
				
			||||||
@ -854,7 +822,6 @@ trimthenstep6:
 | 
				
			|||||||
	case TCPS_FIN_WAIT_2:
 | 
						case TCPS_FIN_WAIT_2:
 | 
				
			||||||
	case TCPS_CLOSE_WAIT:
 | 
						case TCPS_CLOSE_WAIT:
 | 
				
			||||||
		tp->t_state = TCPS_CLOSED;
 | 
							tp->t_state = TCPS_CLOSED;
 | 
				
			||||||
		STAT(tcpstat.tcps_drops++);
 | 
					 | 
				
			||||||
		tp = tcp_close(tp);
 | 
							tp = tcp_close(tp);
 | 
				
			||||||
		goto drop;
 | 
							goto drop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -893,7 +860,6 @@ trimthenstep6:
 | 
				
			|||||||
		if (SEQ_GT(tp->snd_una, ti->ti_ack) ||
 | 
							if (SEQ_GT(tp->snd_una, ti->ti_ack) ||
 | 
				
			||||||
		    SEQ_GT(ti->ti_ack, tp->snd_max))
 | 
							    SEQ_GT(ti->ti_ack, tp->snd_max))
 | 
				
			||||||
			goto dropwithreset;
 | 
								goto dropwithreset;
 | 
				
			||||||
		STAT(tcpstat.tcps_connects++);
 | 
					 | 
				
			||||||
		tp->t_state = TCPS_ESTABLISHED;
 | 
							tp->t_state = TCPS_ESTABLISHED;
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * The sent SYN is ack'ed with our sequence number +1
 | 
							 * The sent SYN is ack'ed with our sequence number +1
 | 
				
			||||||
@ -944,7 +910,6 @@ trimthenstep6:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		if (SEQ_LEQ(ti->ti_ack, tp->snd_una)) {
 | 
							if (SEQ_LEQ(ti->ti_ack, tp->snd_una)) {
 | 
				
			||||||
			if (ti->ti_len == 0 && tiwin == tp->snd_wnd) {
 | 
								if (ti->ti_len == 0 && tiwin == tp->snd_wnd) {
 | 
				
			||||||
			  STAT(tcpstat.tcps_rcvdupack++);
 | 
					 | 
				
			||||||
			  DEBUG_MISC((dfd," dup ack  m = %lx  so = %lx \n",
 | 
								  DEBUG_MISC((dfd," dup ack  m = %lx  so = %lx \n",
 | 
				
			||||||
				      (long )m, (long )so));
 | 
									      (long )m, (long )so));
 | 
				
			||||||
				/*
 | 
									/*
 | 
				
			||||||
@ -1012,12 +977,9 @@ trimthenstep6:
 | 
				
			|||||||
			tp->snd_cwnd = tp->snd_ssthresh;
 | 
								tp->snd_cwnd = tp->snd_ssthresh;
 | 
				
			||||||
		tp->t_dupacks = 0;
 | 
							tp->t_dupacks = 0;
 | 
				
			||||||
		if (SEQ_GT(ti->ti_ack, tp->snd_max)) {
 | 
							if (SEQ_GT(ti->ti_ack, tp->snd_max)) {
 | 
				
			||||||
			STAT(tcpstat.tcps_rcvacktoomuch++);
 | 
					 | 
				
			||||||
			goto dropafterack;
 | 
								goto dropafterack;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		acked = ti->ti_ack - tp->snd_una;
 | 
							acked = ti->ti_ack - tp->snd_una;
 | 
				
			||||||
		STAT(tcpstat.tcps_rcvackpack++);
 | 
					 | 
				
			||||||
		STAT(tcpstat.tcps_rcvackbyte += acked);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * If transmit timer is running and timed sequence
 | 
							 * If transmit timer is running and timed sequence
 | 
				
			||||||
@ -1138,10 +1100,6 @@ step6:
 | 
				
			|||||||
	    (SEQ_LT(tp->snd_wl1, ti->ti_seq) ||
 | 
						    (SEQ_LT(tp->snd_wl1, ti->ti_seq) ||
 | 
				
			||||||
	    (tp->snd_wl1 == ti->ti_seq && (SEQ_LT(tp->snd_wl2, ti->ti_ack) ||
 | 
						    (tp->snd_wl1 == ti->ti_seq && (SEQ_LT(tp->snd_wl2, ti->ti_ack) ||
 | 
				
			||||||
	    (tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd))))) {
 | 
						    (tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd))))) {
 | 
				
			||||||
		/* keep track of pure window updates */
 | 
					 | 
				
			||||||
		if (ti->ti_len == 0 &&
 | 
					 | 
				
			||||||
		    tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd)
 | 
					 | 
				
			||||||
			STAT(tcpstat.tcps_rcvwinupd++);
 | 
					 | 
				
			||||||
		tp->snd_wnd = tiwin;
 | 
							tp->snd_wnd = tiwin;
 | 
				
			||||||
		tp->snd_wl1 = ti->ti_seq;
 | 
							tp->snd_wl1 = ti->ti_seq;
 | 
				
			||||||
		tp->snd_wl2 = ti->ti_ack;
 | 
							tp->snd_wl2 = ti->ti_ack;
 | 
				
			||||||
@ -1425,7 +1383,6 @@ tcp_xmit_timer(register struct tcpcb *tp, int rtt)
 | 
				
			|||||||
	DEBUG_ARG("tp = %lx", (long)tp);
 | 
						DEBUG_ARG("tp = %lx", (long)tp);
 | 
				
			||||||
	DEBUG_ARG("rtt = %d", rtt);
 | 
						DEBUG_ARG("rtt = %d", rtt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	STAT(tcpstat.tcps_rttupdated++);
 | 
					 | 
				
			||||||
	if (tp->t_srtt != 0) {
 | 
						if (tp->t_srtt != 0) {
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * srtt is stored as fixed point with 3 bits after the
 | 
							 * srtt is stored as fixed point with 3 bits after the
 | 
				
			||||||
 | 
				
			|||||||
@ -247,8 +247,6 @@ again:
 | 
				
			|||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * No reason to send a segment, just return.
 | 
						 * No reason to send a segment, just return.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	STAT(tcpstat.tcps_didnuttin++);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return (0);
 | 
						return (0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
send:
 | 
					send:
 | 
				
			||||||
@ -292,16 +290,6 @@ send:
 | 
				
			|||||||
	 * the template for sends on this connection.
 | 
						 * the template for sends on this connection.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	if (len) {
 | 
						if (len) {
 | 
				
			||||||
		if (tp->t_force && len == 1)
 | 
					 | 
				
			||||||
			STAT(tcpstat.tcps_sndprobe++);
 | 
					 | 
				
			||||||
		else if (SEQ_LT(tp->snd_nxt, tp->snd_max)) {
 | 
					 | 
				
			||||||
			STAT(tcpstat.tcps_sndrexmitpack++);
 | 
					 | 
				
			||||||
			STAT(tcpstat.tcps_sndrexmitbyte += len);
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			STAT(tcpstat.tcps_sndpack++);
 | 
					 | 
				
			||||||
			STAT(tcpstat.tcps_sndbyte += len);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		m = m_get();
 | 
							m = m_get();
 | 
				
			||||||
		if (m == NULL) {
 | 
							if (m == NULL) {
 | 
				
			||||||
			error = 1;
 | 
								error = 1;
 | 
				
			||||||
@ -322,15 +310,6 @@ send:
 | 
				
			|||||||
		if (off + len == so->so_snd.sb_cc)
 | 
							if (off + len == so->so_snd.sb_cc)
 | 
				
			||||||
			flags |= TH_PUSH;
 | 
								flags |= TH_PUSH;
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if (tp->t_flags & TF_ACKNOW)
 | 
					 | 
				
			||||||
			STAT(tcpstat.tcps_sndacks++);
 | 
					 | 
				
			||||||
		else if (flags & (TH_SYN|TH_FIN|TH_RST))
 | 
					 | 
				
			||||||
			STAT(tcpstat.tcps_sndctrl++);
 | 
					 | 
				
			||||||
		else if (SEQ_GT(tp->snd_up, tp->snd_una))
 | 
					 | 
				
			||||||
			STAT(tcpstat.tcps_sndurg++);
 | 
					 | 
				
			||||||
		else
 | 
					 | 
				
			||||||
			STAT(tcpstat.tcps_sndwinup++);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		m = m_get();
 | 
							m = m_get();
 | 
				
			||||||
		if (m == NULL) {
 | 
							if (m == NULL) {
 | 
				
			||||||
			error = 1;
 | 
								error = 1;
 | 
				
			||||||
@ -436,7 +415,6 @@ send:
 | 
				
			|||||||
			if (tp->t_rtt == 0) {
 | 
								if (tp->t_rtt == 0) {
 | 
				
			||||||
				tp->t_rtt = 1;
 | 
									tp->t_rtt = 1;
 | 
				
			||||||
				tp->t_rtseq = startseq;
 | 
									tp->t_rtseq = startseq;
 | 
				
			||||||
				STAT(tcpstat.tcps_segstimed++);
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -481,7 +459,6 @@ send:
 | 
				
			|||||||
out:
 | 
					out:
 | 
				
			||||||
		return (error);
 | 
							return (error);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	STAT(tcpstat.tcps_sndtotal++);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Data sent (as far as we can tell).
 | 
						 * Data sent (as far as we can tell).
 | 
				
			||||||
 | 
				
			|||||||
@ -222,9 +222,7 @@ struct tcpcb *tcp_drop(struct tcpcb *tp, int err)
 | 
				
			|||||||
	if (TCPS_HAVERCVDSYN(tp->t_state)) {
 | 
						if (TCPS_HAVERCVDSYN(tp->t_state)) {
 | 
				
			||||||
		tp->t_state = TCPS_CLOSED;
 | 
							tp->t_state = TCPS_CLOSED;
 | 
				
			||||||
		(void) tcp_output(tp);
 | 
							(void) tcp_output(tp);
 | 
				
			||||||
		STAT(tcpstat.tcps_drops++);
 | 
						}
 | 
				
			||||||
	} else
 | 
					 | 
				
			||||||
		STAT(tcpstat.tcps_conndrops++);
 | 
					 | 
				
			||||||
	return (tcp_close(tp));
 | 
						return (tcp_close(tp));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -261,7 +259,6 @@ tcp_close(struct tcpcb *tp)
 | 
				
			|||||||
	sbfree(&so->so_rcv);
 | 
						sbfree(&so->so_rcv);
 | 
				
			||||||
	sbfree(&so->so_snd);
 | 
						sbfree(&so->so_snd);
 | 
				
			||||||
	sofree(so);
 | 
						sofree(so);
 | 
				
			||||||
	STAT(tcpstat.tcps_closed++);
 | 
					 | 
				
			||||||
	return ((struct tcpcb *)0);
 | 
						return ((struct tcpcb *)0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -442,8 +439,6 @@ tcp_connect(struct socket *inso)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	tcp_template(tp);
 | 
						tcp_template(tp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	STAT(tcpstat.tcps_connattempt++);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	tp->t_state = TCPS_SYN_SENT;
 | 
						tp->t_state = TCPS_SYN_SENT;
 | 
				
			||||||
	tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
 | 
						tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
 | 
				
			||||||
	tp->iss = tcp_iss;
 | 
						tp->iss = tcp_iss;
 | 
				
			||||||
 | 
				
			|||||||
@ -32,10 +32,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <slirp.h>
 | 
					#include <slirp.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef LOG_ENABLED
 | 
					 | 
				
			||||||
struct   tcpstat tcpstat;        /* tcp statistics */
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
u_int32_t        tcp_now;                /* for RFC 1323 timestamps */
 | 
					u_int32_t        tcp_now;                /* for RFC 1323 timestamps */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer);
 | 
					static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer);
 | 
				
			||||||
@ -58,7 +54,6 @@ tcp_fasttimo(void)
 | 
				
			|||||||
		    (tp->t_flags & TF_DELACK)) {
 | 
							    (tp->t_flags & TF_DELACK)) {
 | 
				
			||||||
			tp->t_flags &= ~TF_DELACK;
 | 
								tp->t_flags &= ~TF_DELACK;
 | 
				
			||||||
			tp->t_flags |= TF_ACKNOW;
 | 
								tp->t_flags |= TF_ACKNOW;
 | 
				
			||||||
			STAT(tcpstat.tcps_delack++);
 | 
					 | 
				
			||||||
			(void) tcp_output(tp);
 | 
								(void) tcp_output(tp);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -180,7 +175,6 @@ tcp_timers(register struct tcpcb *tp, int timer)
 | 
				
			|||||||
				 * We tried our best, now the connection must die!
 | 
									 * We tried our best, now the connection must die!
 | 
				
			||||||
				 */
 | 
									 */
 | 
				
			||||||
				tp->t_rxtshift = TCP_MAXRXTSHIFT;
 | 
									tp->t_rxtshift = TCP_MAXRXTSHIFT;
 | 
				
			||||||
				STAT(tcpstat.tcps_timeoutdrop++);
 | 
					 | 
				
			||||||
				tp = tcp_drop(tp, tp->t_softerror);
 | 
									tp = tcp_drop(tp, tp->t_softerror);
 | 
				
			||||||
				/* tp->t_softerror : ETIMEDOUT); */ /* XXX */
 | 
									/* tp->t_softerror : ETIMEDOUT); */ /* XXX */
 | 
				
			||||||
				return (tp); /* XXX */
 | 
									return (tp); /* XXX */
 | 
				
			||||||
@ -192,7 +186,6 @@ tcp_timers(register struct tcpcb *tp, int timer)
 | 
				
			|||||||
			 */
 | 
								 */
 | 
				
			||||||
			tp->t_rxtshift = 6;
 | 
								tp->t_rxtshift = 6;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		STAT(tcpstat.tcps_rexmttimeo++);
 | 
					 | 
				
			||||||
		rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift];
 | 
							rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift];
 | 
				
			||||||
		TCPT_RANGESET(tp->t_rxtcur, rexmt,
 | 
							TCPT_RANGESET(tp->t_rxtcur, rexmt,
 | 
				
			||||||
		    (short)tp->t_rttmin, TCPTV_REXMTMAX); /* XXX */
 | 
							    (short)tp->t_rttmin, TCPTV_REXMTMAX); /* XXX */
 | 
				
			||||||
@ -254,7 +247,6 @@ tcp_timers(register struct tcpcb *tp, int timer)
 | 
				
			|||||||
	 * Force a byte to be output, if possible.
 | 
						 * Force a byte to be output, if possible.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	case TCPT_PERSIST:
 | 
						case TCPT_PERSIST:
 | 
				
			||||||
		STAT(tcpstat.tcps_persisttimeo++);
 | 
					 | 
				
			||||||
		tcp_setpersist(tp);
 | 
							tcp_setpersist(tp);
 | 
				
			||||||
		tp->t_force = 1;
 | 
							tp->t_force = 1;
 | 
				
			||||||
		(void) tcp_output(tp);
 | 
							(void) tcp_output(tp);
 | 
				
			||||||
@ -266,7 +258,6 @@ tcp_timers(register struct tcpcb *tp, int timer)
 | 
				
			|||||||
	 * or drop connection if idle for too long.
 | 
						 * or drop connection if idle for too long.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	case TCPT_KEEP:
 | 
						case TCPT_KEEP:
 | 
				
			||||||
		STAT(tcpstat.tcps_keeptimeo++);
 | 
					 | 
				
			||||||
		if (tp->t_state < TCPS_ESTABLISHED)
 | 
							if (tp->t_state < TCPS_ESTABLISHED)
 | 
				
			||||||
			goto dropit;
 | 
								goto dropit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -285,7 +276,6 @@ tcp_timers(register struct tcpcb *tp, int timer)
 | 
				
			|||||||
			 * by the protocol spec, this requires the
 | 
								 * by the protocol spec, this requires the
 | 
				
			||||||
			 * correspondent TCP to respond.
 | 
								 * correspondent TCP to respond.
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
			STAT(tcpstat.tcps_keepprobe++);
 | 
					 | 
				
			||||||
			tcp_respond(tp, &tp->t_template, (struct mbuf *)NULL,
 | 
								tcp_respond(tp, &tp->t_template, (struct mbuf *)NULL,
 | 
				
			||||||
			    tp->rcv_nxt, tp->snd_una - 1, 0);
 | 
								    tp->rcv_nxt, tp->snd_una - 1, 0);
 | 
				
			||||||
			tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL;
 | 
								tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL;
 | 
				
			||||||
@ -294,7 +284,6 @@ tcp_timers(register struct tcpcb *tp, int timer)
 | 
				
			|||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dropit:
 | 
						dropit:
 | 
				
			||||||
		STAT(tcpstat.tcps_keepdrops++);
 | 
					 | 
				
			||||||
		tp = tcp_drop(tp, 0);
 | 
							tp = tcp_drop(tp, 0);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -158,69 +158,6 @@ struct tcpcb {
 | 
				
			|||||||
#define	TCP_REXMTVAL(tp) \
 | 
					#define	TCP_REXMTVAL(tp) \
 | 
				
			||||||
	(((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar)
 | 
						(((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef LOG_ENABLED
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * TCP statistics.
 | 
					 | 
				
			||||||
 * Many of these should be kept per connection,
 | 
					 | 
				
			||||||
 * but that's inconvenient at the moment.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct tcpstat {
 | 
					 | 
				
			||||||
	u_long	tcps_connattempt;	/* connections initiated */
 | 
					 | 
				
			||||||
	u_long	tcps_accepts;		/* connections accepted */
 | 
					 | 
				
			||||||
	u_long	tcps_connects;		/* connections established */
 | 
					 | 
				
			||||||
	u_long	tcps_drops;		/* connections dropped */
 | 
					 | 
				
			||||||
	u_long	tcps_conndrops;		/* embryonic connections dropped */
 | 
					 | 
				
			||||||
	u_long	tcps_closed;		/* conn. closed (includes drops) */
 | 
					 | 
				
			||||||
	u_long	tcps_segstimed;		/* segs where we tried to get rtt */
 | 
					 | 
				
			||||||
	u_long	tcps_rttupdated;	/* times we succeeded */
 | 
					 | 
				
			||||||
	u_long	tcps_delack;		/* delayed acks sent */
 | 
					 | 
				
			||||||
	u_long	tcps_timeoutdrop;	/* conn. dropped in rxmt timeout */
 | 
					 | 
				
			||||||
	u_long	tcps_rexmttimeo;	/* retransmit timeouts */
 | 
					 | 
				
			||||||
	u_long	tcps_persisttimeo;	/* persist timeouts */
 | 
					 | 
				
			||||||
	u_long	tcps_keeptimeo;		/* keepalive timeouts */
 | 
					 | 
				
			||||||
	u_long	tcps_keepprobe;		/* keepalive probes sent */
 | 
					 | 
				
			||||||
	u_long	tcps_keepdrops;		/* connections dropped in keepalive */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	u_long	tcps_sndtotal;		/* total packets sent */
 | 
					 | 
				
			||||||
	u_long	tcps_sndpack;		/* data packets sent */
 | 
					 | 
				
			||||||
	u_long	tcps_sndbyte;		/* data bytes sent */
 | 
					 | 
				
			||||||
	u_long	tcps_sndrexmitpack;	/* data packets retransmitted */
 | 
					 | 
				
			||||||
	u_long	tcps_sndrexmitbyte;	/* data bytes retransmitted */
 | 
					 | 
				
			||||||
	u_long	tcps_sndacks;		/* ack-only packets sent */
 | 
					 | 
				
			||||||
	u_long	tcps_sndprobe;		/* window probes sent */
 | 
					 | 
				
			||||||
	u_long	tcps_sndurg;		/* packets sent with URG only */
 | 
					 | 
				
			||||||
	u_long	tcps_sndwinup;		/* window update-only packets sent */
 | 
					 | 
				
			||||||
	u_long	tcps_sndctrl;		/* control (SYN|FIN|RST) packets sent */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	u_long	tcps_rcvtotal;		/* total packets received */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvpack;		/* packets received in sequence */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvbyte;		/* bytes received in sequence */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvbadsum;		/* packets received with ccksum errs */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvbadoff;		/* packets received with bad offset */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvduppack;	/* duplicate-only packets received */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvdupbyte;	/* duplicate-only bytes received */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvpartduppack;	/* packets with some duplicate data */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvpartdupbyte;	/* dup. bytes in part-dup. packets */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvoopack;		/* out-of-order packets received */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvoobyte;		/* out-of-order bytes received */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvpackafterwin;	/* packets with data after window */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvbyteafterwin;	/* bytes rcvd after window */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvafterclose;	/* packets rcvd after "close" */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvwinprobe;	/* rcvd window probe packets */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvdupack;		/* rcvd duplicate acks */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvacktoomuch;	/* rcvd acks for unsent data */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvackpack;	/* rcvd ack packets */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvackbyte;	/* bytes acked by rcvd acks */
 | 
					 | 
				
			||||||
	u_long	tcps_rcvwinupd;		/* rcvd window update packets */
 | 
					 | 
				
			||||||
	u_long	tcps_predack;		/* times hdr predict ok for acks */
 | 
					 | 
				
			||||||
	u_long	tcps_preddat;		/* times hdr predict ok for data pkts */
 | 
					 | 
				
			||||||
	u_long	tcps_socachemiss;	/* tcp_last_so misses */
 | 
					 | 
				
			||||||
	u_long	tcps_didnuttin;		/* Times tcp_output didn't do anything XXX */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern struct	tcpstat tcpstat;	/* tcp statistics */
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern u_int32_t	tcp_now;		/* for RFC 1323 timestamps */
 | 
					extern u_int32_t	tcp_now;		/* for RFC 1323 timestamps */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										11
									
								
								slirp/udp.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								slirp/udp.c
									
									
									
									
									
								
							@ -41,10 +41,6 @@
 | 
				
			|||||||
#include <slirp.h>
 | 
					#include <slirp.h>
 | 
				
			||||||
#include "ip_icmp.h"
 | 
					#include "ip_icmp.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef LOG_ENABLED
 | 
					 | 
				
			||||||
struct udpstat udpstat;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct socket udb;
 | 
					struct socket udb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u_int8_t udp_tos(struct socket *so);
 | 
					static u_int8_t udp_tos(struct socket *so);
 | 
				
			||||||
@ -74,8 +70,6 @@ udp_input(register struct mbuf *m, int iphlen)
 | 
				
			|||||||
	DEBUG_ARG("m = %lx", (long)m);
 | 
						DEBUG_ARG("m = %lx", (long)m);
 | 
				
			||||||
	DEBUG_ARG("iphlen = %d", iphlen);
 | 
						DEBUG_ARG("iphlen = %d", iphlen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	STAT(udpstat.udps_ipackets++);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Strip IP options, if any; should skip this,
 | 
						 * Strip IP options, if any; should skip this,
 | 
				
			||||||
	 * make available to user, and use on returned packets,
 | 
						 * make available to user, and use on returned packets,
 | 
				
			||||||
@ -101,7 +95,6 @@ udp_input(register struct mbuf *m, int iphlen)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (ip->ip_len != len) {
 | 
						if (ip->ip_len != len) {
 | 
				
			||||||
		if (len > ip->ip_len) {
 | 
							if (len > ip->ip_len) {
 | 
				
			||||||
			STAT(udpstat.udps_badlen++);
 | 
					 | 
				
			||||||
			goto bad;
 | 
								goto bad;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		m_adj(m, len - ip->ip_len);
 | 
							m_adj(m, len - ip->ip_len);
 | 
				
			||||||
@ -123,7 +116,6 @@ udp_input(register struct mbuf *m, int iphlen)
 | 
				
			|||||||
	  ((struct ipovly *)ip)->ih_x1 = 0;
 | 
						  ((struct ipovly *)ip)->ih_x1 = 0;
 | 
				
			||||||
	  ((struct ipovly *)ip)->ih_len = uh->uh_ulen;
 | 
						  ((struct ipovly *)ip)->ih_len = uh->uh_ulen;
 | 
				
			||||||
	  if(cksum(m, len + sizeof(struct ip))) {
 | 
						  if(cksum(m, len + sizeof(struct ip))) {
 | 
				
			||||||
	    STAT(udpstat.udps_badsum++);
 | 
					 | 
				
			||||||
	    goto bad;
 | 
						    goto bad;
 | 
				
			||||||
	  }
 | 
						  }
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -165,7 +157,6 @@ udp_input(register struct mbuf *m, int iphlen)
 | 
				
			|||||||
		if (tmp == &udb) {
 | 
							if (tmp == &udb) {
 | 
				
			||||||
		  so = NULL;
 | 
							  so = NULL;
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
		  STAT(udpstat.udpps_pcbcachemiss++);
 | 
					 | 
				
			||||||
		  udp_last_so = so;
 | 
							  udp_last_so = so;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -279,8 +270,6 @@ int udp_output2(struct socket *so, struct mbuf *m,
 | 
				
			|||||||
	((struct ip *)ui)->ip_ttl = IPDEFTTL;
 | 
						((struct ip *)ui)->ip_ttl = IPDEFTTL;
 | 
				
			||||||
	((struct ip *)ui)->ip_tos = iptos;
 | 
						((struct ip *)ui)->ip_tos = iptos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	STAT(udpstat.udps_opackets++);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	error = ip_output(so, m);
 | 
						error = ip_output(so, m);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (error);
 | 
						return (error);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										20
									
								
								slirp/udp.h
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								slirp/udp.h
									
									
									
									
									
								
							@ -67,32 +67,12 @@ struct udpiphdr {
 | 
				
			|||||||
#define ui_ulen         ui_u.uh_ulen
 | 
					#define ui_ulen         ui_u.uh_ulen
 | 
				
			||||||
#define ui_sum          ui_u.uh_sum
 | 
					#define ui_sum          ui_u.uh_sum
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef LOG_ENABLED
 | 
					 | 
				
			||||||
struct udpstat {
 | 
					 | 
				
			||||||
	                                /* input statistics: */
 | 
					 | 
				
			||||||
	        u_long  udps_ipackets;          /* total input packets */
 | 
					 | 
				
			||||||
	        u_long  udps_hdrops;            /* packet shorter than header */
 | 
					 | 
				
			||||||
	        u_long  udps_badsum;            /* checksum error */
 | 
					 | 
				
			||||||
	        u_long  udps_badlen;            /* data length larger than packet */
 | 
					 | 
				
			||||||
	        u_long  udps_noport;            /* no socket on port */
 | 
					 | 
				
			||||||
	        u_long  udps_noportbcast;       /* of above, arrived as broadcast */
 | 
					 | 
				
			||||||
	        u_long  udps_fullsock;          /* not delivered, input socket full */
 | 
					 | 
				
			||||||
	        u_long  udpps_pcbcachemiss;     /* input packets missing pcb cache */
 | 
					 | 
				
			||||||
	                                /* output statistics: */
 | 
					 | 
				
			||||||
	        u_long  udps_opackets;          /* total output packets */
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Names for UDP sysctl objects
 | 
					 * Names for UDP sysctl objects
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define UDPCTL_CHECKSUM         1       /* checksum UDP packets */
 | 
					#define UDPCTL_CHECKSUM         1       /* checksum UDP packets */
 | 
				
			||||||
#define UDPCTL_MAXID            2
 | 
					#define UDPCTL_MAXID            2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef LOG_ENABLED
 | 
					 | 
				
			||||||
extern struct udpstat udpstat;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern struct socket udb;
 | 
					extern struct socket udb;
 | 
				
			||||||
struct mbuf;
 | 
					struct mbuf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user