summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-27 11:03:00 +0200
committerMiguel <m.i@gmx.at>2018-09-27 11:03:00 +0200
commit05d86ed530c05ba3f8648ffd7e67f4a593ae58d8 (patch)
treedf959f63050abda6d3ca4f46dfab56ba07443ca4
parent50ad5b31f261eceb715720fbe279a69241770554 (diff)
ntp
-rw-r--r--net/eth.c5
-rw-r--r--net/icmp.c1
-rw-r--r--net/inet.c7
-rw-r--r--net/inet.h4
-rw-r--r--net/ipv4.c8
-rw-r--r--net/ntp.c10
-rw-r--r--net/ntp.h1
-rw-r--r--net/udp.c10
-rw-r--r--net/udp.h1
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);