diff options
| author | Miguel <m.i@gmx.at> | 2018-09-27 11:03:00 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-09-27 11:03:00 +0200 |
| commit | 05d86ed530c05ba3f8648ffd7e67f4a593ae58d8 (patch) | |
| tree | df959f63050abda6d3ca4f46dfab56ba07443ca4 | |
| parent | 50ad5b31f261eceb715720fbe279a69241770554 (diff) | |
ntp
| -rw-r--r-- | net/eth.c | 5 | ||||
| -rw-r--r-- | net/icmp.c | 1 | ||||
| -rw-r--r-- | net/inet.c | 7 | ||||
| -rw-r--r-- | net/inet.h | 4 | ||||
| -rw-r--r-- | net/ipv4.c | 8 | ||||
| -rw-r--r-- | net/ntp.c | 10 | ||||
| -rw-r--r-- | net/ntp.h | 1 | ||||
| -rw-r--r-- | net/udp.c | 10 | ||||
| -rw-r--r-- | net/udp.h | 1 |
9 files changed, 43 insertions, 4 deletions
@@ -1,6 +1,7 @@ +#include "eth.h" + #include "net_sys.h" #include "inet.h" -#include "eth.h" #include "netdev.h" uint32_t eth_generic(struct netdev *dev, uint32_t ip, uint16_t type, uint8_t* pos,uint32_t *end) @@ -21,5 +22,3 @@ uint32_t eth_generic(struct netdev *dev, uint32_t ip, uint16_t type, uint8_t* po return pos; } - - @@ -71,6 +71,7 @@ bool icmp_incoming(struct netdev *dev,struct eth_hdr *hdr) struct icmp_v4 *data=(uint32_t *)ipv4+ipv4->ihl; // klog ("icmp type=%d",data->type); +// // klog ("icmp code=%d",data->code); // klog ("icmp csum=0x%04x",ntohs(data->csum)); data->csum=0; @@ -8,11 +8,18 @@ uint16_t ntohs(uint16_t val) { return val<<8|val>>8; } + uint16_t htons(uint16_t val) { return val<<8|val>>8; } +uint32_t ntohl(uint32_t val) +{ + return val<<24|val>>24|((0x00ff0000&val)>>8)|((0x0000ff00&val)<<8); +} + + uint16_t checksum(void *addr, int count) { /* Compute Internet Checksum for "count" bytes @@ -23,6 +23,10 @@ #define ICMP_ECHO_REQUEST 8 uint16_t checksum(void *addr, int count); + uint16_t ntohs(uint16_t val); uint16_t htons(uint16_t val); +uint32_t ntohl(uint32_t val); +uint32_t htonl(uint32_t val); + bool net_packet(struct netdev *dev); @@ -3,11 +3,12 @@ #include "inet.h" #include "eth.h" #include "icmp.h" +#include "udp.h" bool ipv4_incoming(struct netdev *dev,struct eth_hdr *hdr) { struct ipv4_hdr *ipv4=hdr->payload; -// klog("ipv4 incoming with checksum: 0x%04X",ntohs(ipv4->csum)); + //klog("ipv4 incoming with checksum: 0x%04X",ntohs(ipv4->csum)); ipv4->csum=0; // klog("expected checksum: 0x%04X",checksum(ipv4,ntohs(ipv4->len))); // klog("ipv4 header len=%d",ipv4->ihl); @@ -16,6 +17,11 @@ bool ipv4_incoming(struct netdev *dev,struct eth_hdr *hdr) { icmp_incoming(dev,hdr); } + + if(ipv4->proto==IPV4_P_UDP) + { + udp_incoming(hdr,ipv4+1); + } return true; } @@ -1,4 +1,6 @@ #include "udp.h" +#include "inet.h" +#include "net_sys.h" #include "ntp.h" uint32_t ntp_generic(struct netdev *dev, uint32_t ip, uint16_t src, uint16_t dst, uint8_t* pos,uint8_t *end) @@ -34,3 +36,11 @@ uint32_t ntp_generic(struct netdev *dev, uint32_t ip, uint16_t src, uint16_t dst return udp_generic(dev, ip, src, dst, pos,end); } +uint32_t ntp_incoming(uint8_t* start, uint8_t *pos) +{ + struct udp_v4_ntp *ntp=pos; + klog("0x%08X",ntohl(ntp->txTm_s)); // timestamp recevived + klog("google's NTP says that %d seconds elapsed since 1 jan 1970",ntohl(ntp->txTm_s)); // timestamp recevived + return 0; // all ok +} + @@ -32,3 +32,4 @@ struct udp_v4_ntp } __attribute__((packed)); uint32_t ntp_generic(struct netdev *dev, uint32_t ip, uint16_t src, uint16_t dst, uint8_t* pos,uint8_t *end); +uint32_t ntp_incoming(uint8_t* start, uint8_t *pos); @@ -1,6 +1,7 @@ #include "udp.h" #include "inet.h" #include "ipv4.h" +#include "ntp.h" uint32_t udp_generic(struct netdev *dev, uint32_t ip, uint16_t src, uint16_t dst, uint8_t* pos,uint8_t *end) { @@ -14,3 +15,12 @@ uint32_t udp_generic(struct netdev *dev, uint32_t ip, uint16_t src, uint16_t dst return ipv4_generic(dev,ip,IPV4_P_UDP,pos,end); } + +uint32_t udp_incoming(uint8_t* start,uint8_t *pos) +{ + struct udp_v4 *udp=pos; + pos+=8; //header 64 bytes + + if(udp->src_port==htons(123)) return ntp_incoming(start, pos); + return 0; +} @@ -9,3 +9,4 @@ struct udp_v4{ } __attribute__((packed)); uint32_t udp_generic(struct netdev *dev, uint32_t ip, uint16_t src, uint16_t dst, uint8_t* pos,uint8_t *end); +uint32_t udp_incoming(uint8_t* start,uint8_t *pos); |
