import socket
import struct


def build_ip_header(src_ip, dst_ip):
    """Builds a valid IP header and returns it

    Parameters:
      - src_ip: A string with a valid IP address which will be used as 
                SRC IP
      - dst_ip: A string with a valid IP address where the packets will be
                sent to
    
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |Version|  IHL  |Type of Service|          Total Length         |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |         Identification        |Flags|      Fragment Offset    |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |  Time to Live |    Protocol   |         Header Checksum       |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                       Source Address                          |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                    Destination Address                        |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                    Options                    |    Padding    |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    """

    ihl = 5
    version = 4
    ip_ihl_ver = (version << 4) | ihl
    ip_tos = 0
    ip_tot_len = 0  # kernel will fill the correct total length
    ip_id = 0xbeef  # Id of this packet
    ip_frag_off = 0
    ip_ttl = 255
    ip_proto = socket.IPPROTO_UDP
    ip_check = 0    # kernel will fill the correct checksum
    ip_saddr = socket.inet_aton (src_ip)  # Spoof the src IP if you want to
    ip_daddr = socket.inet_aton (dst_ip)

    # the ! in the pack format string means network order
    #   see http://docs.python.org/2/library/struct.html#format-characters
    ip_header = struct.pack('!BBHHHBBH4s4s' , 
        ip_ihl_ver, ip_tos, ip_tot_len, ip_id, ip_frag_off, ip_ttl, ip_proto, 
        ip_check, ip_saddr, ip_daddr)
    return ip_header