int sar_CheckPacket(arp_Header *ap) { register arp_Header *op; if ( ap->hwType != wfix(arp_TypeEther) || /* have ethernet hardware, */ ap->protType != wfix(0x800) || /* and internet software, */ ap->opcode != wfix(ARP_REQUEST) || /* and be a resolution req. */ ap->dstIPAddr != lfix(sin_lclINAddr) /* for my addr. */ ) return ( 0 ); /* .... or we ignore it. */ #if CPMAC_DEBUG sys_printf("ARP REQUEST IS VALID\n"); #endif /* format response. */ op = (arp_Header *)sed_FormatPacket(ap->srcEthAddr, 0x806); op->hwType = wfix(arp_TypeEther); op->protType = wfix(0x800); op->hwProtAddrLen = wfix((sizeof(eth_HwAddress) << 8) + sizeof(in_HwAddress)); op->opcode = wfix(ARP_REPLY); op->srcIPAddr = lfix(sin_lclINAddr); MoveW(sed_lclEthAddr, op->srcEthAddr, sizeof(eth_HwAddress)); ap->dstIPAddr = op->srcIPAddr; MoveW(ap->srcEthAddr, op->dstEthAddr, sizeof(eth_HwAddress)); sed_Send(sizeof(arp_Header)); #if CPMAC_DEBUG sys_printf("ARP RESPONSE SENT\n"); #endif return ( 1 ); }
void TTCP_send_fdf(tcp_Socket *s) { tcp_PseudoHeader ph; struct _pkt { in_Header in; tcp_Header tcp; DWORD maxsegopt; } *pkt; BYTE *dp; pkt = (struct _pkt *)sed_FormatPacket(&s->hisethaddr[0], 0x800); dp = (BYTE *)&pkt->maxsegopt; pkt->in.length = sizeof(in_Header) + sizeof(tcp_Header) + s->dataSize; /* tcp header */ pkt->tcp.srcPort = s->myport; pkt->tcp.dstPort = s->hisport; pkt->tcp.seqnum = s->seqnum; pkt->tcp.acknum = s->acknum; pkt->tcp.window = 1024; pkt->tcp.flags = s->flags | 0x5000; /* Header length = 20bytes ;; no option */ pkt->tcp.checksum = 0; pkt->tcp.urgentPointer = 0; if ( s->flags & tcp_FlagSYN ) { pkt->tcp.flags += 0x1000; pkt->in.length += 4; pkt->maxsegopt = 0x02040578; /* 1400 bytes */ dp += 4; } Move(s->datas, dp, s->dataSize); /* copy data to pointer which is next to tcp header */ /* internet header */ pkt->in.vht = 0x4500; /* version 4, hdrlen 5, tos 0 */ pkt->in.identification = tcp_id++; pkt->in.frag = 0; pkt->in.ttlProtocol = (250<<8) + 6; pkt->in.checksum = 0; pkt->in.source = sin_lclINAddr; pkt->in.destination = s->hisaddr; pkt->in.checksum = ~(checksum((WORD *)&pkt->in, sizeof(in_Header))); /* compute tcp checksum */ ph.src = pkt->in.source; ph.dst = pkt->in.destination; ph.mbz = 0; ph.protocol = 6; ph.length = pkt->in.length - sizeof(in_Header); ph.checksum = checksum((WORD *)&pkt->tcp, ph.length); pkt->tcp.checksum = ~checksum((WORD *)&ph, sizeof ph); sed_Send(pkt->in.length); }
int sar_MapIn2Eth(longword ina, eth_HwAddress *ethap) { register arp_Header *op; extern in_HwAddress sin_lclINAddr; longword endTime; longword rxMitTime; endTime = clock_ValueRough() + 2000; while ( endTime > clock_ValueRough() ) { op = (arp_Header *)sed_FormatPacket(&sed_ethBcastAddr[0], 0x806); op->hwType = wfix(arp_TypeEther); op->protType = wfix(0x800); op->hwProtAddrLen = wfix((sizeof(eth_HwAddress) << 8) + sizeof(in_HwAddress)); op->opcode = wfix(ARP_REQUEST); op->srcIPAddr = lfix(sin_lclINAddr); MoveW(sed_lclEthAddr, op->srcEthAddr, sizeof(eth_HwAddress)); if ((ina&net_IpMask)!=(sin_lclINAddr&net_IpMask)) ina=net_Gateway; op->dstIPAddr = lfix(ina); /* ...and send the packet */ sed_Send( sizeof(arp_Header) ); rxMitTime = clock_ValueRough() + 500; while ( rxMitTime > clock_ValueRough() ) { op = (arp_Header *)sed_IsPacket(); if ( op ) { if ((sed_CheckPacket(op, 0x806) == 1) && (op->protType == wfix(0x800)) && (op->srcIPAddr == lfix(ina)) && (op->opcode == wfix(ARP_REPLY)) ) { MoveW(op->srcEthAddr, ethap, sizeof(eth_HwAddress)); return ( 1 ); } } } } return ( 0 ); }
/* * Format and send an outgoing reset segment */ void tcp_Reset( in_Header *ip, tcp_Header *tp ) { tcp_PseudoHeader ph; struct _pkt { in_Header in; tcp_Header tcp; DWORD maxsegopt; } *pkt; pkt = (struct _pkt *)sed_FormatPacket(&(((eth_Header *)ip)-1)->source[0], 0x800); pkt->in.length = sizeof(in_Header) + sizeof(tcp_Header); /* tcp header */ pkt->tcp.srcPort = tp->dstPort; pkt->tcp.dstPort = tp->srcPort; pkt->tcp.seqnum = tp->seqnum; pkt->tcp.acknum = tp->acknum; pkt->tcp.window = 1024; pkt->tcp.flags = tcp_FlagRST | 0x5000; /* Header length = 20bytes ;; no option */ pkt->tcp.checksum = 0; pkt->tcp.urgentPointer = 0; /* internet header */ pkt->in.vht = 0x4500; /* version 4, hdrlen 5, tos 0 */ pkt->in.identification = tcp_id++; pkt->in.frag = 0; pkt->in.ttlProtocol = (250<<8) + 6; pkt->in.checksum = 0; pkt->in.source = sin_lclINAddr; pkt->in.destination = ip->source; pkt->in.checksum = ~(checksum((WORD *)&pkt->in, sizeof(in_Header))); /* compute tcp checksum */ ph.src = pkt->in.source; ph.dst = pkt->in.destination; ph.mbz = 0; ph.protocol = 6; ph.length = pkt->in.length - sizeof(in_Header); ph.checksum = checksum((WORD *)&pkt->tcp, ph.length); pkt->tcp.checksum = ~checksum((WORD *)&ph, sizeof ph); sed_Send(pkt->in.length); }