void konlite_call(void) { unsigned short tmp; k_tmr++; for(tmp=0;tmp<ETH_RXBUFNB;tmp++) { buf = get_mac_data(tmp); // буфер принятых данных if(buf->len) { m_pkt=get_mac_pkt(buf); // формирование структуры мак пакета if(check_mac(m_pkt)) // проверка мак адреса назначения { switch(get_eth_type(m_pkt)) { case IP_TYPE: ip_p=ip_rcv(m_pkt); if(check_ip_req(ip_p)) { if(check_mask(ip_p->ip_s)==0) {set_gate_cmd();} // запрос выходит за рамки подсети else{clr_gate_cmd();add_arp_tab(ip_p->ip_s,m_pkt->mac_s);} // запрос в пределах подсети switch(get_ip_type(ip_p)) { case ICMP_TYPE: icmp_p=icmp_rcv(ip_p); if(check_ping(icmp_p)) {ping_echo(icmp_p,ip_p);} break; case UDP_TYPE: udp_p=udp_rcv(ip_p); portudp_scan(udp_p,ip_p); break; case TCP_TYPE: tcp_p=tcp_rcv(ip_p); porttcp_scan(tcp_p,ip_p); break; } } break; case ARP_TYPE: arp_p=arp_rcv(m_pkt); // формирование структуры arp пакета if(check_arp_req(arp_p)) // arp запрос { add_arp_tab(arp_p->ip_s,arp_p->mac_s); arp_answer(arp_p); }else if(check_arp_answer_gate(arp_p)) // arp ответ от шлюза { set_gate_mac(arp_p->mac_s); } break; case UNDEF_TYPE: break; } } unlock_mac_rx(tmp); } } if(k_tmr % GATE_PER == 0) get_gate_mac(); // периодический запрос mac шлюза }
int main(void) { unsigned int num_bytes ; WDTCTL = WDTPW + WDTHOLD ; Init_CLK() ; Init_PSPI() ; P9DIR |= IrDA_OUT; P9OUT &=~IrDA_OUT; MAIN_POWER_ON ; /* for(;;){ for(i=0;i<40;i++) { P9OUT |= IrDA_OUT; __delay_cycles(20000); P9OUT &=~IrDA_OUT; __delay_cycles(20000); } __delay_cycles(5000000); } */ /* for(;;){ for(j=0;j<40;j++){ for(i=0;i<50;i++) { P9OUT &=~IrDA_OUT; __delay_cycles(270); P9OUT |= IrDA_OUT; __delay_cycles(270); } __delay_cycles(20000); } __delay_cycles(5000000); } */ myNode.node.ip = IP4_ADDR(103,1,168,192) ; myNode.node.mask = IP4_ADDR(0,255,255,255) ; myNode.node.gate = IP4_ADDR(1,1,168,192) ; myNode.node.mac[0] = 0x00 ; myNode.node.mac[1] = 0x60 ; myNode.node.mac[2] = 0x97 ; myNode.node.mac[3] = 0x48 ; myNode.node.mac[4] = 0xF4 ; myNode.node.mac[5] = 0xAB ; encInit() ; nicSetMacAddress() ; encPhyWrite(0x14,0x0470) ; arptab_init() ; ENC_SLEEP() ;// TEST ENC_WAKEUP();// TEST while(1) { num_bytes = encPacketReceive(&rxdnetbuf); if(num_bytes > 0) { if(rxdnetbuf.etherframe.protocal==ARP_PACKET) // 收到一个AR请求包 { if(rxdnetbuf.arpframe.operation==0x0100) arp_answer() ; // ARP request,处理arp数据包 else if(rxdnetbuf.arpframe.operation==0x0200) arp_process() ; // ARP answer } else if( (rxdnetbuf.etherframe.protocal == IP_PACKET) // 收到一个IP包 && ((rxdnetbuf.ipframe.verandihl&0xf0) == 0x40) // IP V4 && (rxdnetbuf.ipframe.destip[0] == myNode.nodebytes.ipbytes[0]) && (rxdnetbuf.ipframe.destip[1] == myNode.nodebytes.ipbytes[1]) && (rxdnetbuf.ipframe.destip[2] == myNode.nodebytes.ipbytes[2]) && (rxdnetbuf.ipframe.destip[3] == myNode.nodebytes.ipbytes[3])) { arp_ip_mac() ; if(rxdnetbuf.ipframe.protocal == 1) // ICMP { if(rxdnetbuf.icmpframe.type == 8) // ECHO ping_answer() ; } else if(rxdnetbuf.ipframe.protocal == 17) // UDP { // net_udp_rcv() ; _NOP(); // Clear_UPD_Buf() ; } /* else if(rxdnetbuf.ipframe.protocal == 6) // TCP tcp_rcve(&rxdnetbuf) ; updatearptab() ; */ } } } }