📄 tcpstuff.c
字号:
/* tcpstuff.c: * Absolute minimum to properly refuse TCP connection requests to this * device. The processTCP function is called if the incoming protocol is * TCP, but this code simply responds with a TCP RESET which is essentially * a refusal to establish the connection request being made from a remote * machine. * This is similar in functionality to the ICMP "destination unreachable * message". Note that this is not an absolute necessity but it does * provide a "clean" response to the remote machine that is making the * connection request. Without it, the remote machine would keep trying * to connect. * For more details, refer to TCP/IP Comer 3rd Edition pg 216-219. * * General notice: * This code is part of a boot-monitor package developed as a generic base * platform for embedded system designs. As such, it is likely to be * distributed to various projects beyond the control of the original * author. Please notify the author of any enhancements made or bugs found * so that all may benefit from the changes. In addition, notification back * to the author will allow the new user to pick up changes that may have * been made by other users after this version of the code was distributed. * * Note1: the majority of this code was edited with 4-space tabs. * Note2: as more and more contributions are accepted, the term "author" * is becoming a mis-representation of credit. * * Original author: Ed Sutter * Email: esutter@lucent.com * Phone: 908-582-2351 */#include "config.h"#if INCLUDE_ETHERNET#include "genlib.h"#include "ether.h"#include "stddefs.h"/* SendTcpConnectionReset(): * Called in response to any incoming TCP request. * It is used to let the sender know that the TCP connection is being * refused. */intSendTcpConnectionReset(re)struct ether_header *re;{ int datalen; ulong ackno; struct ether_header *te; struct ip *ti, *ri; struct tcphdr *ttcp, *rtcp; ri = (struct ip *) (re + 1); datalen = ri->ip_len - ((ri->ip_vhl & 0x0f) * 4); te = EtherCopy(re); ti = (struct ip *) (te + 1); ti->ip_vhl = ri->ip_vhl; ti->ip_tos = ri->ip_tos; ti->ip_len = ri->ip_len; ti->ip_id = ri->ip_id; ti->ip_off = IP_DONTFRAG; ti->ip_ttl = ri->ip_ttl/2; ti->ip_p = ri->ip_p; memcpy((char *)&(ti->ip_src.s_addr),(char *)&(ri->ip_dst.s_addr), sizeof(struct in_addr)); memcpy((char *)&(ti->ip_dst.s_addr),(char *)&(ri->ip_src.s_addr), sizeof(struct in_addr)); ttcp = (struct tcphdr *) (ti + 1); rtcp = (struct tcphdr *) (ri + 1); ttcp->flags = rtcp->flags &= ~TCP_FLAGMASK; ttcp->flags = rtcp->flags | TCP_ACK | TCP_RESET; ttcp->sport = rtcp->dport; ttcp->dport = rtcp->sport; memset((char *)&ttcp->seqno,0,4); memcpy((char *)&ackno,(char *)&rtcp->seqno,4); ackno+=1; memcpy((char *)&ttcp->ackno,(char *)&ackno,4); ttcp->windowsize = 0; ttcp->urgentptr = 0; memcpy((char *)(ttcp+1),(char *)(rtcp+1),datalen-sizeof(struct tcphdr)); ipChksum(ti); /* compute checksum of ip hdr: (3rd Edition Comer pg 100) */ tcpChksum(ti); /* Compute TCP checksum */ sendBuffer(sizeof(struct ether_header) + ti->ip_len); return(0);}/* tcpChksum(): * Compute the checksum of the TCP packet. * The incoming pointer is to an ip header, the tcp header after that ip * header is directly populated with the result. Similar to the udp * checksum calculation. This one is mandatory. */voidtcpChksum(ihdr)struct ip *ihdr;{ register int i; register ushort *sp; register ulong t; int len; struct tcphdr *thdr; struct UdpPseudohdr pseudohdr; thdr = (struct tcphdr *)(ihdr+1); thdr->tcpcsum = 0; /* Start by building the pseudo header: */ memcpy((char *)&pseudohdr.ip_src.s_addr,(char *)&ihdr->ip_src.s_addr,4); memcpy((char *)&pseudohdr.ip_dst.s_addr,(char *)&ihdr->ip_dst.s_addr,4); pseudohdr.zero = 0; pseudohdr.proto = ihdr->ip_p; pseudohdr.ulen = ihdr->ip_len - sizeof(struct ip); /* Get checksum of pseudo header: */ sp = (ushort *) &pseudohdr; for (i=0,t=0;i<(sizeof(struct UdpPseudohdr)/sizeof(ushort));i++,sp++) t += *sp; /* If length is odd, pad and add one. */ len = pseudohdr.ulen; if (len & 1) { uchar *ucp; ucp = (uchar *)thdr; ucp[len] = 0; len++; } len >>= 1; sp = (ushort *) thdr; for (i=0;i<len;i++,sp++) t += *sp; t = (t & 0xffff) + (t >> 16); thdr->tcpcsum = ~t;}voidtcperrmsg(msg)char *msg;{ printf("TCP error: %s\n",msg);}voidprocessTCP(struct ether_header *ehdr,ushort size){ struct ip *ipp; struct tcphdr *tcpp; ipp = (struct ip *)(ehdr + 1); tcpp = (struct tcphdr *)((char *)ipp + IP_HLEN(ipp)); SendTcpConnectionReset(ehdr); return;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -