def __init__(self, ism, rtid, pkt):
        #OSPF neighbor information
        self.state = NSM_STATE['NSM_Down']           # NSM status.
        self._inactive_timer = None
        self._dd_exstart_timer = None
        self.lsr_resend_timer = None

        self.dd_flags = 0        # DD bit flags. Slave or master.
        self.dd_seqnum = 0       # DD Sequence Number.

        #Last sent Database Description packet.
        self.last_send = None   # just the packet, not tuple
        #Timestemp when last Database Description packet was sent
        self.last_send_ts = 0   # not used
        #Last received Database Description packet.
        self.last_recv = tuple()     # pattern: (ddseq, init, more, ms)

        #LSA data.
        self.ls_rxmt = list()       # Link state retransmission list
        self.db_sum = list()        # Database summary list
        self.ls_req = list()        # Link state request list

        self.ism = ism
        self.rtid = rtid        # neighbor router id

        self.nsm = dict()

        #Neighbor Information from Hello.
        self.src = pkt['H']['SRC']
        self.options = pkt['V']['V']['OPTS']
        self.priority = pkt['V']['V']['PRIO']
        self.d_router = pkt['V']['V']['DESIG']
        self.bd_router = pkt['V']['V']['BDESIG']

        #inactive timer is equal to dead interval
        self.inactive_timer_interval = self.ism.dead_interval

        self.ep = ExchangeProtocol(self)
        self.fp = FloodProtocol(self)

        #register all nsm events
        for nsmEvent in NSM_EVENT.keys():
            if nsmEvent == 'NSM_PacketReceived':
                self.nsm[nsmEvent] = self._hello_received
            elif nsmEvent == 'NSM_TwoWayReceived':
                self.nsm[nsmEvent] = self._two_way_or_exstart
            elif nsmEvent == 'NSM_OneWayReceived':
                self.nsm[nsmEvent] = self._init
            elif nsmEvent == 'NSM_NegotiationDone':
                self.nsm[nsmEvent] = self._exchange
            elif nsmEvent == 'NSM_SeqNumberMismatch':
                self.nsm[nsmEvent] = self._seq_mismatch_or_bad_lsr
            elif nsmEvent == 'NSM_ExchangeDone':
                self.nsm[nsmEvent] = self._loading
            elif nsmEvent == 'NSM_BadLSReq':
                self.nsm[nsmEvent] = self._seq_mismatch_or_bad_lsr
            elif nsmEvent == 'NSM_LoadingDone':
                self.nsm[nsmEvent] = self._full
            else:
                continue