def generate_packet(src, data): min_size = ethhdr.min_size + ip4hdr.min_size + udphdr.min_size packet = bytearray(len(data) + min_size) eth = ethhdr( { 'src': src, 'dst': pnet.HWAddress(u'ff:ff:ff:ff:ff:ff'), 'type': pnet.ETH_P_IP }, buf=packet) ip4 = ip4hdr( { 'dst': ipaddress.IPv4Address(u'255.255.255.255'), 'proto': socket.IPPROTO_UDP, 'len': len(data) + ip4hdr.min_size + udphdr.min_size }, buf=eth.payload) udp = udphdr({ 'sport': 68, 'dport': 67, 'len': len(data) + udphdr.min_size }, buf=ip4.payload) ip4['csum'] = pnet.checksum(ip4.tobytes()) udp['csum'] = pnet.ipv4_checksum(ip4, udp, data) udp.payload = data return packet
def __init__(self, ifname): self.ifname = ifname self.poll = select.epoll() self.sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(pnet.ETH_P_ALL)) self.poll.register( self.sock, select.POLLIN | select.POLLPRI | select.POLLHUP | select.POLLERR) attach_filter(self.sock, bootp_filter()) self.sock.setblocking(0) self.sock.bind((ifname, 3)) ifreq = get_ifreq(self.sock, ifname) self.src = pnet.HWAddress(ifreq[18:24])
def __init__(self, opcode, buf=None, **kwargs): self.opcode = opcode self.htype = 1 # Ethernet self.hops = 0 self.xid = kwargs.get('xid') self.secs = kwargs.get('secs', 0) self.flags = kwargs.get('flags', 0) self.ciaddr = kwargs.get('ciaddr', b'\x00' * 4) self.yiaddr = kwargs.get('yiaddr', b'\x00' * 4) self.siaddr = kwargs.get('siaddr', b'\x00' * 4) self.giaddr = kwargs.get('giaddr', b'\x00' * 4) self.chaddr = pnet.HWAddress(kwargs['chaddr']) self.options = Options(kwargs.get('options', [])) if not self.xid: self.xid = os.urandom(4)
def test_parse_hwaddress(data): address = pnet.HWAddress(data) assert bytes(address) == data assert set(str(address)) <= set('0123456789abcdef:')
def test_parse_invalid_hwaddress_string(data): with pytest.raises(ValueError): pnet.HWAddress(data)
def test_parse_valid_hwaddress_string(data): address = pnet.HWAddress(data) assert str(address) == data.replace('-', ':')