#include "platform.h" #include "eth.h" #include "enc28j60.h" #include "ap.h" #include "arp.h" #include "icmp.h" #include "ip.h" #include "udp.h" #include "stdlib.h" #include "globals.h" /* ========================================================================== UDP receive and decode - zatím nepoužíváme */ void udp (unsigned char *buff) { struct UDP_header *udp; udp = (struct UDP_header *)&buff[34]; switch (udp->UDP_destPort) { case UDP_NAMSER: // name service name_service (buff); break; case UDP_WOL: // wake on lan udp_wol (buff); break; } } /* ========================================================================== UDP generate and send generujeme Etthernetovou + IP + UDP hlavičku, zapíšeme data zapíšeme vlastní data - argumenty - len (délka našich dat) - *buff (pointer na místní buffer, definován v eth.c jako globální proměnná - *p (pointer na pole dat, která chceme odeslat - no jo, ale to nikde neni !!!! ) - nic nevrací */ void udp_send ( unsigned char *buff, char zprava,unsigned int len) { len++; unsigned int sum; unsigned int pomTMR1; struct UDP_header *udp; unsigned int txbuf; unsigned char pomchar; udp = (struct UDP_header *)&buff[34]; len = len + MAXCOSESTALO + 1 ; eth_my(buff); // vyměníme MAC adresy buff[16] = ((IP_UDP_HEADERLENGHT+len) & 0xFF00) >> 8; // výpočet délky (pole v Ethernetové hlavičce) buff[17] = ((IP_UDP_HEADERLENGHT+len) & 0x00FF); ip_my(buff); // vygenerujeme ip hlavičku - výměna adres, IP checksum atd. //nyní vyplníme udp hlavičku // port 15150 3B2E 15151 3B2F udp->UDP_destPort = 0x2e3b; // 15150 neco s endianem - prehodit udp->UDP_sourcePort = 0x2f3b; // 15151 udp->UDP_lenght_h = ((UDP_HEADERLENGHT+len) & 0xFF00) >> 8; // délka udp hlavičky + data udp->UDP_lenght_l = ((UDP_HEADERLENGHT+len) & 0x00FF); // tady byl kontrolni soucet //teď vložíme vlastní data do místního bufferu buff[42]=zprava; pomchar = 0; if(V0) pomchar = pomchar | 0x01; if(V1) pomchar = pomchar | 0x02; if(V2) pomchar = pomchar | 0x04; if(V3) pomchar = pomchar | 0x08; if(V4) pomchar = pomchar | 0x10; /* bity 0 - 4 - stav vetvi .. bit 0 - vetev 0 je to upraveno, 1 na Vx znamena DEN - topime */ if ( casjespravne) pomchar = pomchar | 0x80 ; buff[43] = pomchar; pomTMR1 = TMR1; cosestalo[10] = pomTMR1 & 0x0ff; cosestalo[11] = (pomTMR1 >>8) & 0x0ff; if(zprava == POSILAMDEFPR1) { cosestalo[10] = DEFPR1 & 0x0ff; cosestalo[11] = (DEFPR1 >>8) & 0x0ff; } if(zprava == POSILAMPR1) { pomTMR1 = PR1; cosestalo[10] = pomTMR1 & 0x0ff; cosestalo[11] = (pomTMR1 >>8) & 0x0ff; } for(txbuf=0;txbuf<=MAXCOSESTALO;txbuf++) buff[44+txbuf] = cosestalo[txbuf]; // txbuf zatim k nicemu nepotrebuji, tak ho pouziji cosestalo[0] = 0; // odvyslilal jsem, takze cosestalo je mozno opet pouzit udp->UDP_checksum = 0; // kontrolní součet BYL NAHORE !!!!! sum = checksum (&buff[26], TYPE_UDP + UDP_HEADERLENGHT + len, 16 + len); udp->UDP_checksum = ((sum & 0xFF00) >> 8)|((sum & 0x00FF) << 8); if (!nic_tx_alloc(&txbuf)) return; // místní buffer odešleme do vysílací částí bufferu v ENC netbuf_wr_seek(txbuf, NB_SEEK_SET); netbuf_write(buff, IP_UDP_HEADERLENGHT + ETH_HEADERLENGHT + len); netbuf_close(); nic_tx(IP_UDP_HEADERLENGHT + ETH_HEADERLENGHT + len); // vyšleme buffer z ENC do sítě } /* ========================================================================== UDP - name service */ void name_service (unsigned char *buff) { unsigned char namecount, namecountso; if (buff[44] == 0x01 && buff[45] == 0x10 && buff[47] == 0x01) { namecount = 54; namecountso = 0; while (namecount != 69 && myname[namecountso] == buff[namecount]) { // compare name namecount++; namecountso++; } if (namecount == 69) { // name is ok buff[44] = 0x85; // generate respons buff[45] = 0x00; buff[47] = 0x00; buff[49] = 0x01; buff[92] = 0x00; buff[93] = 0x04; buff[94] = 0x93; buff[95] = 0xE0; buff[96] = 0x00; buff[97] = 0x06; buff[98] = 0x00; buff[99] = 0x00; buff[100] = myip[0]; buff[101] = myip[1]; buff[102] = myip[2]; buff[103] = myip[3]; // udp_send(62,buff); // send } } } /* ========================================================================== UDP - Wake On Line */ void udp_wol (unsigned char *buff) { if (buff[48] == mymac[0] && buff[49] == mymac[1] && buff[50] == mymac[2] && buff[51] == mymac[3] && buff[52] == mymac[4] && buff[53] == mymac[5]) { // do not use } }