From 05d86ed530c05ba3f8648ffd7e67f4a593ae58d8 Mon Sep 17 00:00:00 2001 From: Miguel Date: Thu, 27 Sep 2018 11:03:00 +0200 Subject: ntp --- net/eth.c | 5 ++--- net/icmp.c | 1 + net/inet.c | 7 +++++++ net/inet.h | 4 ++++ net/ipv4.c | 8 +++++++- net/ntp.c | 10 ++++++++++ net/ntp.h | 1 + net/udp.c | 10 ++++++++++ net/udp.h | 1 + 9 files changed, 43 insertions(+), 4 deletions(-) diff --git a/net/eth.c b/net/eth.c index fedcda5..8f0a518 100644 --- a/net/eth.c +++ b/net/eth.c @@ -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; } - - diff --git a/net/icmp.c b/net/icmp.c index 3c071dd..d8877da 100644 --- a/net/icmp.c +++ b/net/icmp.c @@ -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; diff --git a/net/inet.c b/net/inet.c index cd4cfde..99a61d1 100644 --- a/net/inet.c +++ b/net/inet.c @@ -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 diff --git a/net/inet.h b/net/inet.h index 1d75e03..1cb71b2 100644 --- a/net/inet.h +++ b/net/inet.h @@ -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); diff --git a/net/ipv4.c b/net/ipv4.c index f1d4043..78db274 100644 --- a/net/ipv4.c +++ b/net/ipv4.c @@ -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; } diff --git a/net/ntp.c b/net/ntp.c index 137d677..0e9b19d 100644 --- a/net/ntp.c +++ b/net/ntp.c @@ -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 +} + diff --git a/net/ntp.h b/net/ntp.h index 0b7fa00..d5aa457 100644 --- a/net/ntp.h +++ b/net/ntp.h @@ -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); diff --git a/net/udp.c b/net/udp.c index 6913256..c084055 100644 --- a/net/udp.c +++ b/net/udp.c @@ -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; +} diff --git a/net/udp.h b/net/udp.h index 85aa248..ed13493 100644 --- a/net/udp.h +++ b/net/udp.h @@ -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); -- cgit v1.2.3