File: ntp.py

package info (click to toggle)
python-dpkt 1.9.2-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 920 kB
  • sloc: python: 10,440; makefile: 144
file content (103 lines) | stat: -rw-r--r-- 2,253 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# $Id: ntp.py 48 2008-05-27 17:31:15Z yardley $
# -*- coding: utf-8 -*-
"""Network Time Protocol."""
from __future__ import print_function

from . import dpkt
from .decorators import deprecated

# NTP v4

# Leap Indicator (LI) Codes
NO_WARNING = 0
LAST_MINUTE_61_SECONDS = 1
LAST_MINUTE_59_SECONDS = 2
ALARM_CONDITION = 3

# Mode Codes
RESERVED = 0
SYMMETRIC_ACTIVE = 1
SYMMETRIC_PASSIVE = 2
CLIENT = 3
SERVER = 4
BROADCAST = 5
CONTROL_MESSAGE = 6
PRIVATE = 7


class NTP(dpkt.Packet):
    """Network Time Protocol.

    TODO: Longer class information....

    Attributes:
        __hdr__: Header fields of NTP.
        TODO.
    """

    __hdr__ = (
        ('flags', 'B', 0),
        ('stratum', 'B', 0),
        ('interval', 'B', 0),
        ('precision', 'B', 0),
        ('delay', 'I', 0),
        ('dispersion', 'I', 0),
        ('id', '4s', 0),
        ('update_time', '8s', 0),
        ('originate_time', '8s', 0),
        ('receive_time', '8s', 0),
        ('transmit_time', '8s', 0)
    )

    @property
    def v(self):
        return (self.flags >> 3) & 0x7

    @v.setter
    def v(self, v):
        self.flags = (self.flags & ~0x38) | ((v & 0x7) << 3)

    @property
    def li(self):
        return (self.flags >> 6) & 0x3

    @li.setter
    def li(self, li):
        self.flags = (self.flags & ~0xc0) | ((li & 0x3) << 6)

    @property
    def mode(self):
        return self.flags & 0x7

    @mode.setter
    def mode(self, mode):
        self.flags = (self.flags & ~0x7) | (mode & 0x7)


__s = b'\x24\x02\x04\xef\x00\x00\x00\x84\x00\x00\x33\x27\xc1\x02\x04\x02\xc8\x90\xec\x11\x22\xae\x07\xe5\xc8\x90\xf9\xd9\xc0\x7e\x8c\xcd\xc8\x90\xf9\xd9\xda\xc5\xb0\x78\xc8\x90\xf9\xd9\xda\xc6\x8a\x93'


def test_ntp_pack():
    n = NTP(__s)
    assert (__s == bytes(n))


def test_ntp_unpack():
    n = NTP(__s)
    assert (n.li == NO_WARNING)
    assert (n.v == 4)
    assert (n.mode == SERVER)
    assert (n.stratum == 2)
    assert (n.id == b'\xc1\x02\x04\x02')
    # test get/set functions
    n.li = ALARM_CONDITION
    n.v = 3
    n.mode = CLIENT
    assert (n.li == ALARM_CONDITION)
    assert (n.v == 3)
    assert (n.mode == CLIENT)

if __name__ == '__main__':
    test_ntp_pack()
    test_ntp_unpack()
    print('Tests Successful...')