///8 Bit unsigned typedef unsigned char u08; ///8 Bit signed typedef signed char s08; ///16 Bit unsigned typedef unsigned short u16; ///16 Bit signed typedef signed short s16; ///32 Bit unsigned typedef unsigned long u32; ///32 Bit signed typedef signed long s32; #define TYPE_IP 0x0008 struct t_etherheader { u08 destmac[6]; u08 srcmac[6]; u16 type; }; #define OFFSET_IP 0x0E struct t_ipheader { u08 hdrlen:4; //4 lowest bits! u08 vers:4; u08 tos; u16 pktlen; u16 pktid; //u16 flags:4; //u16 offset:12; u16 flags_offset; u08 ttl; u08 protocol; u16 hdrchecksum; u32 srcip; u32 destip; }; #define HEADERSIZE_UDP 0x08 struct t_udpheader { u16 srcport; u16 destport; u16 len; u16 checksum; }; struct t_ntp { u08 flag_mode:3; u08 flag_vers:3; u08 flag_leap:2; u08 strat; u08 pollinterval; u08 clockprecision; u32 rootdelay; u32 clockdispersion; u32 refclockid; u08 refclocktime[8]; u08 origtime[8]; u08 recvtime[8]; u08 transmittime[8]; }; //Schickt ein UDP Paket mit einem Sync-Request an einen Server void ntp_timesync(void* buffer) { struct t_etherheader* etherheader = (struct t_etherheader*) buffer; struct t_ipheader* ipheader = (struct t_ipheader*) (buffer + OFFSET_IP); struct t_udpheader* udpheader = (struct t_udpheader*) ((u08*) ipheader + 20); struct t_ntp* ntp = (struct t_ntp*) ((u08*) udpheader + HEADERSIZE_UDP); u16 temp; ntp->flag_mode = 1; ntp->flag_leap = 3; ntp->flag_vers = 3; ntp->strat = 0; ntp->pollinterval = 10; ntp->clockprecision = 0xFA; ntp->rootdelay = 0; ntp->clockdispersion = 0; ntp->refclockid = 0; ntp->refclocktime[0] = 0; ntp->refclocktime[1] = 0; ntp->refclocktime[2] = 0; ntp->refclocktime[3] = 0; ntp->refclocktime[4] = 0; ntp->refclocktime[5] = 0; ntp->refclocktime[6] = 0; ntp->refclocktime[7] = 0; ntp->origtime[0] = 0; ntp->origtime[1] = 0; ntp->origtime[2] = 0; ntp->origtime[3] = 0; ntp->origtime[4] = 0; ntp->origtime[5] = 0; ntp->origtime[6] = 0; ntp->origtime[7] = 0; ntp->recvtime[0] = 0; ntp->recvtime[1] = 0; ntp->recvtime[2] = 0; ntp->recvtime[3] = 0; ntp->recvtime[4] = 0; ntp->recvtime[5] = 0; ntp->recvtime[6] = 0; ntp->recvtime[7] = 0; ntp->transmittime[0] = 0xAA; ntp->transmittime[1] = 0xAA; ntp->transmittime[2] = 0xAA; ntp->transmittime[3] = 0xAA; ntp->transmittime[4] = 0xAA; ntp->transmittime[5] = 0xAA; ntp->transmittime[6] = 0xAA; ntp->transmittime[7] = 0xAA; udpheader->srcport = ((PORT_NTP & 0xFF00) >> 8) | ((PORT_NTP & 0x00FF) << 8); udpheader->destport = ((PORT_NTP & 0xFF00) >> 8) | ((PORT_NTP & 0x00FF) << 8); udpheader->len = ((56 & 0xFF00) >> 8) | ((56 & 0x00FF) << 8); udpheader->checksum = 0; //temp = generatechecksum(udpheader, 56); //udpheader->checksum = ((temp & 0xFF00) >> 8) | ((temp & 0x00FF) << 8); etherheader->srcmac[0] = nic_mymac[0]; etherheader->srcmac[1] = nic_mymac[1]; etherheader->srcmac[2] = nic_mymac[2]; etherheader->srcmac[3] = nic_mymac[3]; etherheader->srcmac[4] = nic_mymac[4]; etherheader->srcmac[5] = nic_mymac[5]; etherheader->destmac[0] = 0x00; etherheader->destmac[1] = 0xE0; etherheader->destmac[2] = 0x7D; etherheader->destmac[3] = 0x7A; etherheader->destmac[4] = 0x36; etherheader->destmac[5] = 0x41; etherheader->type = TYPE_IP; ipheader->vers = 4; ipheader->hdrlen = 20/4; ipheader->tos = 0; temp = 90; ipheader->pktlen = ((temp & 0xFF00) >> 8) | ((temp & 0x00FF) << 8); ipheader->pktid = 0xAAAA; ipheader->flags_offset = 0; ipheader->ttl = 128; ipheader->protocol = PROT_UDP; ipheader->hdrchecksum = 0; ipheader->srcip = *((u32*) nic_myip); ipheader->destip = *((u32*) ntp_serverip); temp = generatechecksum(ipheader, 20); ipheader->hdrchecksum = ((temp & 0xFF00) >> 8) | ((temp & 0x00FF) << 8); nic_putframe(buffer, 90); } //Sendet Inhalt aus buffer mit der länge von bufsize per RDMA an die NIC void nic_putframe(void* buffer, u16 bufsize) { u08* pbuf; u16 i; while (bufsize < 60) { pbuf = buffer + bufsize; *pbuf = 0x00; pbuf++; bufsize++; } nic_putb(NIC_CR, /*(1<> 8) & 0x00FF)); nic_putb(NIC_CR, /*(1<> 8) & 0x00FF); nic_putb(NIC_CR, (1<