00001 /* 00002 * Copyright (c) 1997, 1998 The Regents of the University of California. 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions 00007 * are met: 00008 * 1. Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * 3. All advertising materials mentioning features or use of this software 00014 * must display the following acknowledgement: 00015 * This product includes software developed by the MASH Research 00016 * Group at the University of California, Berkeley. 00017 * 4. Neither the name of the University nor of the Research Group may be used 00018 * to endorse or promote products derived from this software without 00019 * specific prior written permission. 00020 * 00021 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 00022 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00023 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00024 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 00025 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00026 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 00027 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00028 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00029 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 00030 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00031 * SUCH DAMAGE. 00032 * 00033 * @(#) $Header: /cvsroot/nsnam/ns-2/emulate/tcptap.h,v 1.5 2003/02/15 00:46:49 buchheim Exp $ (ISI) 00034 */ 00035 00036 #ifndef tcptap_h 00037 #define tcptap_h 00038 00039 #include "tap.h" 00040 #include <netinet/in.h> 00041 #include <netinet/in_systm.h> 00042 #include <netinet/ip.h> 00043 #include <netinet/tcp.h> 00044 #include <sys/socket.h> 00045 #include "tcp.h" 00046 #include "ip.h" 00047 00048 00049 #define TCP_HEADER_LEN (sizeof(struct tcphdr)) 00050 #define IP_HEADER_LEN (sizeof(struct ip)) 00051 #define DEFAULT_ADV_WINDOW 65535 /* Large enough so that min(cong, adv 00052 window) is cong */ 00053 #define DEFAULT_EXT_PORT 8192 00054 #define DEFAULT_EXT_ADDR "192.168.123.116" 00055 00056 #define DEFAULT_NS_PORT 16384 00057 #define DEFAULT_NS_ADDR "192.168.123.253" 00058 00059 00060 #define TCPIP_BASE_PKTSIZE 40 /* base TCP/IP header in real life */ 00061 /* Grabbed from tcp-full-bay.h */ 00062 00063 /* 00064 Used in the ns TCP packets created by the TCPTap. We don't have any 00065 more information in the TCPTap Agent to deduce any other reason. 00066 So we set it as unknown. 00067 */ 00068 #define REASON_UNKNOWN 10 /* To support TCP debugging in TCP header 00069 reason field. */ 00070 00071 00072 struct pseudohdr { 00073 struct in_addr source_address; 00074 struct in_addr dest_address; 00075 unsigned char place_holder; 00076 unsigned char protocol; 00077 unsigned short length; 00078 } pseudohdr; 00079 00080 00081 00082 00083 class TCPTapAgent : public TapAgent { 00084 private: 00085 struct sockaddr_in nsnode, extnode; 00086 unsigned short adv_window; 00087 int dropp; 00088 00089 unsigned short trans_check(unsigned char, char *, int , 00090 struct in_addr, struct in_addr); 00091 unsigned short in_cksum(unsigned short *,int); 00092 void ip_gen(char *, unsigned char, struct in_addr, struct in_addr, 00093 unsigned short, unsigned char ); 00094 void tcp_gen(char *, unsigned short, unsigned short, Packet *); 00095 void recvpkt(); 00096 int sendpkt(Packet*); 00097 void processpkt(Packet *, const struct timeval &); 00098 static void pkt_handler(void *, Packet *, const struct timeval &); 00099 00100 public: 00101 TCPTapAgent(); 00102 int command(int, const char*const*); 00103 00104 }; 00105 00106 #endif /* tcptap_h */ 00107 00108 00109 00110 00111 00112