82 lines
2.4 KiB
C
82 lines
2.4 KiB
C
#pragma once
|
|
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
|
|
#include "lwip.h"
|
|
#include "udp.h"
|
|
#include "dns.h"
|
|
#include "pbuf.h"
|
|
#include "ip_addr.h"
|
|
|
|
#include "debug.h"
|
|
|
|
#define NTP_OFFSET_TIMESTAMPS 40
|
|
#define NTP_OFFSET_ROUNDING 44
|
|
#define SECONDROUNDINGTHRESHOLD 115
|
|
|
|
// the epoch for NTP starts in year 1900 while the epoch in UNIX starts in 1970
|
|
// Unix time starts on Jan 1 1970. 7O years difference in seconds, that's 2208988800 seconds
|
|
#define SEVENTYYEARS 2208988800UL
|
|
|
|
//#define NTP_HOST_NAME "time1.google.com"
|
|
#define NTP_HOST_NAME "pool.ntp.org"
|
|
#define NTP_PORT 123
|
|
|
|
#define NTP_PACKET_SIZE 48 // NTP time stamp is in the first 48 bytes of the message
|
|
#define ntpFirstFourBytes 0xEC0600E3 // NTP request header, first 32 bits
|
|
|
|
#define NTP_OFFSET_LI_VN_MODE 0
|
|
#define NTP_LI_MASK 0xC0
|
|
#define NTP_LI_NO_WARNING (0x00 << 6)
|
|
#define NTP_LI_LAST_MINUTE_61_SEC (0x01 << 6)
|
|
#define NTP_LI_LAST_MINUTE_59_SEC (0x02 << 6)
|
|
#define NTP_LI_ALARM_CONDITION (0x03 << 6) /* (clock not synchronized) */
|
|
|
|
#define NTP_VERSION_MASK 0x38
|
|
#define NTP_VERSION (4/* NTP Version 4*/<<3)
|
|
|
|
#define NTP_MODE_MASK 0x07
|
|
#define NTP_MODE_CLIENT 0x03
|
|
#define NTP_MODE_SERVER 0x04
|
|
#define NTP_MODE_BROADCAST 0x05
|
|
|
|
#define NTP_OFFSET_STRATUM 1
|
|
#define NTP_STRATUM_KOD 0x00
|
|
|
|
#define NTP_OFFSET_ORIGINATE_TIME 24
|
|
#define NTP_OFFSET_RECEIVE_TIME 32
|
|
#define NTP_OFFSET_TRANSMIT_TIME 40
|
|
|
|
typedef enum
|
|
{
|
|
NTP_IDLE,
|
|
NTP_Receiving_DNS,
|
|
NTP_DNS_GOT_IP,
|
|
NTP_Receiving_UDP,
|
|
NTP_GOT_TIME,
|
|
NTP_ERROR
|
|
} NTPState_t;
|
|
|
|
PACK_STRUCT_BEGIN
|
|
typedef struct {
|
|
PACK_STRUCT_FLD_8(uint8_t li_vn_mode);
|
|
PACK_STRUCT_FLD_8(uint8_t stratum);
|
|
PACK_STRUCT_FLD_8(uint8_t poll);
|
|
PACK_STRUCT_FLD_8(uint8_t precision);
|
|
PACK_STRUCT_FIELD(uint32_t root_delay);
|
|
PACK_STRUCT_FIELD(uint32_t root_dispersion);
|
|
PACK_STRUCT_FIELD(uint32_t reference_identifier);
|
|
PACK_STRUCT_FIELD(uint32_t reference_timestamp[2]);
|
|
PACK_STRUCT_FIELD(uint32_t originate_timestamp[2]);
|
|
PACK_STRUCT_FIELD(uint32_t receive_timestamp[2]);
|
|
PACK_STRUCT_FIELD(uint32_t transmit_timestamp[2]);
|
|
} NTP_Frame;
|
|
PACK_STRUCT_END
|
|
|
|
|
|
uint32_t NTPToEpochUnix(void);
|
|
void NTP_DNS_Callback(const char *name, const ip_addr_t *ipaddr, void *callback_arg);
|
|
void NTP_RECV_CALLBACK(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);
|
|
|