120 lines
3.8 KiB
Cython
120 lines
3.8 KiB
Cython
|
|
import cython
|
|
|
|
from .._cache cimport DNSCache
|
|
from .._dns cimport DNSAddress, DNSPointer, DNSQuestion, DNSRecord, DNSRRSet
|
|
from .._history cimport QuestionHistory
|
|
from .._protocol.incoming cimport DNSIncoming
|
|
from .._services.info cimport ServiceInfo
|
|
from .._services.registry cimport ServiceRegistry
|
|
from .answers cimport (
|
|
QuestionAnswers,
|
|
construct_outgoing_multicast_answers,
|
|
construct_outgoing_unicast_answers,
|
|
)
|
|
from .multicast_outgoing_queue cimport MulticastOutgoingQueue
|
|
|
|
|
|
cdef bint TYPE_CHECKING
|
|
cdef cython.uint _ONE_SECOND, _TYPE_PTR, _TYPE_ANY, _TYPE_A, _TYPE_AAAA, _TYPE_SRV, _TYPE_TXT
|
|
cdef str _SERVICE_TYPE_ENUMERATION_NAME
|
|
cdef cython.set _RESPOND_IMMEDIATE_TYPES
|
|
cdef cython.set _ADDRESS_RECORD_TYPES
|
|
cdef object IPVersion, _IPVersion_ALL
|
|
cdef object _TYPE_PTR, _CLASS_IN, _DNS_OTHER_TTL
|
|
|
|
cdef unsigned int _ANSWER_STRATEGY_SERVICE_TYPE_ENUMERATION
|
|
cdef unsigned int _ANSWER_STRATEGY_POINTER
|
|
cdef unsigned int _ANSWER_STRATEGY_ADDRESS
|
|
cdef unsigned int _ANSWER_STRATEGY_SERVICE
|
|
cdef unsigned int _ANSWER_STRATEGY_TEXT
|
|
|
|
cdef list _EMPTY_SERVICES_LIST
|
|
cdef list _EMPTY_TYPES_LIST
|
|
|
|
cdef class _AnswerStrategy:
|
|
|
|
cdef public DNSQuestion question
|
|
cdef public unsigned int strategy_type
|
|
cdef public list types
|
|
cdef public list services
|
|
|
|
|
|
cdef class _QueryResponse:
|
|
|
|
cdef bint _is_probe
|
|
cdef cython.list _questions
|
|
cdef double _now
|
|
cdef DNSCache _cache
|
|
cdef cython.dict _additionals
|
|
cdef cython.set _ucast
|
|
cdef cython.set _mcast_now
|
|
cdef cython.set _mcast_aggregate
|
|
cdef cython.set _mcast_aggregate_last_second
|
|
|
|
@cython.locals(record=DNSRecord)
|
|
cdef void add_qu_question_response(self, cython.dict answers)
|
|
|
|
cdef void add_ucast_question_response(self, cython.dict answers)
|
|
|
|
@cython.locals(answer=DNSRecord, question=DNSQuestion)
|
|
cdef void add_mcast_question_response(self, cython.dict answers)
|
|
|
|
@cython.locals(maybe_entry=DNSRecord)
|
|
cdef bint _has_mcast_within_one_quarter_ttl(self, DNSRecord record)
|
|
|
|
@cython.locals(maybe_entry=DNSRecord)
|
|
cdef bint _has_mcast_record_in_last_second(self, DNSRecord record)
|
|
|
|
cdef QuestionAnswers answers(self)
|
|
|
|
cdef class QueryHandler:
|
|
|
|
cdef object zc
|
|
cdef ServiceRegistry registry
|
|
cdef DNSCache cache
|
|
cdef QuestionHistory question_history
|
|
cdef MulticastOutgoingQueue out_queue
|
|
cdef MulticastOutgoingQueue out_delay_queue
|
|
|
|
@cython.locals(service=ServiceInfo)
|
|
cdef void _add_service_type_enumeration_query_answers(self, list types, cython.dict answer_set, DNSRRSet known_answers)
|
|
|
|
@cython.locals(service=ServiceInfo)
|
|
cdef void _add_pointer_answers(self, list services, cython.dict answer_set, DNSRRSet known_answers)
|
|
|
|
@cython.locals(service=ServiceInfo, dns_address=DNSAddress)
|
|
cdef void _add_address_answers(self, list services, cython.dict answer_set, DNSRRSet known_answers, cython.uint type_)
|
|
|
|
@cython.locals(question_lower_name=str, type_=cython.uint, service=ServiceInfo)
|
|
cdef cython.dict _answer_question(self, DNSQuestion question, unsigned int strategy_type, list types, list services, DNSRRSet known_answers)
|
|
|
|
@cython.locals(
|
|
msg=DNSIncoming,
|
|
msgs=list,
|
|
strategy=_AnswerStrategy,
|
|
question=DNSQuestion,
|
|
answer_set=cython.dict,
|
|
known_answers=DNSRRSet,
|
|
known_answers_set=cython.set,
|
|
is_unicast=bint,
|
|
is_probe=object,
|
|
now=double
|
|
)
|
|
cpdef QuestionAnswers async_response(self, cython.list msgs, cython.bint unicast_source)
|
|
|
|
@cython.locals(name=str, question_lower_name=str)
|
|
cdef list _get_answer_strategies(self, DNSQuestion question)
|
|
|
|
@cython.locals(
|
|
first_packet=DNSIncoming,
|
|
ucast_source=bint,
|
|
)
|
|
cpdef void handle_assembled_query(
|
|
self,
|
|
list packets,
|
|
object addr,
|
|
object port,
|
|
object transport,
|
|
tuple v6_flow_scope
|
|
)
|