sntp.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * SNTP support driver
  3. *
  4. * Masami Komiya <mkomiya@sonare.it> 2005
  5. *
  6. */
  7. #include <common.h>
  8. #include <command.h>
  9. #include <net.h>
  10. #include <rtc.h>
  11. #include "sntp.h"
  12. #if ((CONFIG_COMMANDS & CFG_CMD_NET) && (CONFIG_COMMANDS & CFG_CMD_SNTP))
  13. #define SNTP_TIMEOUT 10
  14. static int SntpOurPort;
  15. static void
  16. SntpSend (void)
  17. {
  18. struct sntp_pkt_t pkt;
  19. int pktlen = SNTP_PACKET_LEN;
  20. int sport;
  21. debug ("%s\n", __FUNCTION__);
  22. memset (&pkt, 0, sizeof(pkt));
  23. pkt.li = NTP_LI_NOLEAP;
  24. pkt.vn = NTP_VERSION;
  25. pkt.mode = NTP_MODE_CLIENT;
  26. memcpy ((char *)NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE, (char *)&pkt, pktlen);
  27. SntpOurPort = 10000 + (get_timer(0) % 4096);
  28. sport = NTP_SERVICE_PORT;
  29. NetSendUDPPacket (NetServerEther, NetNtpServerIP, sport, SntpOurPort, pktlen);
  30. }
  31. static void
  32. SntpTimeout (void)
  33. {
  34. puts ("Timeout\n");
  35. NetState = NETLOOP_FAIL;
  36. return;
  37. }
  38. static void
  39. SntpHandler (uchar *pkt, unsigned dest, unsigned src, unsigned len)
  40. {
  41. struct sntp_pkt_t rpkt;
  42. struct rtc_time tm;
  43. debug ("%s\n", __FUNCTION__);
  44. if (dest != SntpOurPort) return;
  45. memcpy ((unsigned char *)&rpkt, pkt, len);
  46. #if (CONFIG_COMMANDS & CFG_CMD_DATE) || defined(CONFIG_TIMESTAMP)
  47. to_tm(ntohl(rpkt.transmit_timestamp), &tm);
  48. printf ("Date: %4d-%02d-%02d Time: %2d:%02d:%02d\n",
  49. tm.tm_year, tm.tm_mon, tm.tm_mday,
  50. tm.tm_hour, tm.tm_min, tm.tm_sec);
  51. to_tm(ntohl(rpkt.transmit_timestamp) - 2208988800u + NetTimeOffset, &tm);
  52. #if (CONFIG_COMMANDS & CFG_CMD_DATE)
  53. rtc_set (&tm);
  54. #endif
  55. printf ("Date: %4d-%02d-%02d Time: %2d:%02d:%02d\n",
  56. tm.tm_year, tm.tm_mon, tm.tm_mday,
  57. tm.tm_hour, tm.tm_min, tm.tm_sec);
  58. #endif
  59. NetState = NETLOOP_SUCCESS;
  60. }
  61. void
  62. SntpStart (void)
  63. {
  64. debug ("%s\n", __FUNCTION__);
  65. NetSetTimeout (SNTP_TIMEOUT * CFG_HZ, SntpTimeout);
  66. NetSetHandler(SntpHandler);
  67. memset (NetServerEther, 0, 6);
  68. SntpSend ();
  69. }
  70. #endif /* CONFIG_COMMANDS & CFG_CMD_SNTP */