sntp.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 *rpktp = (struct sntp_pkt_t *)pkt;
  42. struct rtc_time tm;
  43. ulong seconds;
  44. debug ("%s\n", __FUNCTION__);
  45. if (dest != SntpOurPort) return;
  46. /*
  47. * As the RTC's used in U-Boot sepport second resolution only
  48. * we simply ignore the sub-second field.
  49. */
  50. memcpy (&seconds, &rpktp->transmit_timestamp, sizeof(ulong));
  51. to_tm(ntohl(seconds) - 2208988800UL + 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. NetState = NETLOOP_SUCCESS;
  59. }
  60. void
  61. SntpStart (void)
  62. {
  63. debug ("%s\n", __FUNCTION__);
  64. NetSetTimeout (SNTP_TIMEOUT * CFG_HZ, SntpTimeout);
  65. NetSetHandler(SntpHandler);
  66. memset (NetServerEther, 0, 6);
  67. SntpSend ();
  68. }
  69. #endif /* CONFIG_COMMANDS & CFG_CMD_SNTP */