def handle_dns(self, dpid, inport, ofp_reason, total_frame_len, buffer_id, packet): dnsh = packet.find('dns') if not dnsh: log.err('received invalid DNS packet', system='dnsspy') return CONTINUE log.msg(str(dnsh), system='dnsspy') for answer in dnsh.answers: if answer.qtype == dns.dns.rr.A_TYPE: val = self.ip_records[answer.rddata] if answer.name not in val: val.insert(0, answer.name) log.msg("add dns entry: %s %s" % (answer.rddata, answer.name), system='dnsspy') for addition in dnsh.additional: # WHAT IS THIS?! XXX # for char in addition.name: # # some debugging magic in case we have a bad parse in DNS # if not curses.ascii.isascii(char): # for byte in dnsh.get_layer(): # print '%x' % byte, # print '' # continue if addition.qtype == dns.dns.rr.A_TYPE: val = self.ip_records[addition.rddata] if addition.name not in val: val.insert(0, addition.name) log.msg("additional dns entry: %s %s" % (addition.rddata, addition.name), system='dnsspy') return CONTINUE
def handle_dns(self, dpid, inport, ofp_reason, total_frame_len, buffer_id, packet): eaddr = util.convert_to_eaddr(packet.src) dnsh = packet.find('dns') if not self.permit_ether_addr(eaddr): print "Dropping DNS Packet - MAC Address not allowed" return STOP if not dnsh: print "Invalid DNS packet:", dnsh, packet return CONTINUE print "DNS Packet:", dnsh for question in dnsh.questions: if eaddr in Homework.st['dnsList'] and question.name in Homework.st['dnsList'][eaddr]: print "DNS Resquest blocked for", question.name return STOP flow = util.extract_flow(packet) Homework.install_datapath_flow( dpid, flow, 3, 10, [[openflow.OFPAT_OUTPUT, [-1, openflow.OFPP_NORMAL]]], buffer_id, openflow.OFP_DEFAULT_PRIORITY, inport, packet.arr ) return CONTINUE
def handle_dns(self, dpid, inport, ofp_reason, total_frame_len, buffer_id, packet): dnsh = packet.find('dns') if not dnsh: log.err('received invalid DNS packet',system='dnsspy') return CONTINUE log.msg(str(dnsh),system='dnsspy') for answer in dnsh.answers: if answer.qtype == dns.dns.rr.A_TYPE: val = self.ip_records[answer.rddata] if answer.name not in val: val.insert(0, answer.name) log.msg("add dns entry: %s %s" % (answer.rddata, answer.name), system='dnsspy') for addition in dnsh.additional: # WHAT IS THIS?! XXX # for char in addition.name: # # some debugging magic in case we have a bad parse in DNS # if not curses.ascii.isascii(char): # for byte in dnsh.get_layer(): # print '%x' % byte, # print '' # continue if addition.qtype == dns.dns.rr.A_TYPE: val = self.ip_records[addition.rddata] if addition.name not in val: val.insert(0, addition.name) log.msg("additional dns entry: %s %s" % (addition.rddata, addition.name), system='dnsspy') return CONTINUE
def handle_dns_response(self, dpid, inport, ofp_reason, total_frame_len, buffer_id, packet): eaddr = util.convert_to_eaddr(packet.dst) dnsh = packet.find('dns') if not self.permit_ether_addr(eaddr): print "Dropping DNS Response Packet - MAC Address not allowed" return STOP if not dnsh: print "\n\n +++ +++ Invalid DNS Response packet: ", dnsh print packet print dir(packet) print packet.__dict__ print "\n\n" return CONTINUE print "DNS Response packet:", dnsh print "*******", dir(dnsh) print "*******", dnsh.__dict__ for answer in dnsh.answers: if answer.qtype in dns.rrtype_to_str: domain = answer.name + ":" + dns.rrtype_to_str[answer.qtype] else: domain = answer.name + ":" + str(answer.qtype) if domain not in Homework.st['domains']: Homework.st['domains'][domain] = set([str(answer.rddata)]) else: Homework.st['domains'][domain].add(str(answer.rddata)) flow = util.extract_flow(packet) Homework.install_datapath_flow( dpid, flow, 3, 10, [[openflow.OFPAT_OUTPUT, [-1, openflow.OFPP_NORMAL]]], buffer_id, openflow.OFP_DEFAULT_PRIORITY, inport, dnsh.arr ) return CONTINUE