// Path: src/main/java/com/github/ffalcinelli/jdivert/Enums.java
// public enum Protocol {
//     HOPOPT(0), ICMP(1), TCP(6), UDP(17), ROUTING(43), FRAGMENT(44), AH(51), ICMPV6(58), NONE(59), DSTOPTS(60);
//     private int value;
// 
//     Protocol(int value) {
//         this.value = value;
//     }
// 
//     public static Protocol fromValue(int value) {
//         for (Protocol protocol : Protocol.values()) {
//             if (protocol.getValue() == value)
//                 return protocol;
//         }
//         throw new IllegalArgumentException(String.format("Protocol %d is not recognized", value));
//     }
// 
//     public int getValue() {
//         return value;
//     }
// }
// 
// Path: src/main/java/com/github/ffalcinelli/jdivert/Util.java
// public static int unsigned(short value) {
//     return value & 0x0000ffff;
// }
// 
// Path: src/main/java/com/github/ffalcinelli/jdivert/Util.java
// public static byte[] zeroPadArray(byte[] source, int size) {
//     byte[] data = new byte[size];
//     for (int i = 0; i < data.length; i++) {
//         if (i < source.length)
//             data[i] = source[i];
//         else
//             data[i] = 0;
//     }
//     return data;
// }


import java.net.Inet4Address;
import java.nio.ByteBuffer;
import static com.github.ffalcinelli.jdivert.Enums.Protocol;
import static com.github.ffalcinelli.jdivert.Util.unsigned;
import static com.github.ffalcinelli.jdivert.Util.zeroPadArray;
    }

    public int getIHL() {
        return (raw.get(0) & 0x0F);
    }

    public void setIHL(int length) {
        byte first = (byte) (getVersion() << 4);
        byte second = (byte) (length & 0x0F);
        raw.put(0, (byte) (first | second));
    }


    public int getTotalLength() {
        return unsigned(raw.getShort(2));
    }

    public void setTotalLength(int length) {
        raw.putShort(2, (short) length);
    }

    public int getTTL() {
        return unsigned(raw.get(8));
    }

    public void setTTL(int ttl) {
        raw.put(8, (byte) ttl);
    }

    @Override
// Path: src/main/java/com/github/ffalcinelli/jdivert/Enums.java
// public enum Protocol {
//     HOPOPT(0), ICMP(1), TCP(6), UDP(17), ROUTING(43), FRAGMENT(44), AH(51), ICMPV6(58), NONE(59), DSTOPTS(60);
//     private int value;
// 
//     Protocol(int value) {
//         this.value = value;
//     }
// 
//     public static Protocol fromValue(int value) {
//         for (Protocol protocol : Protocol.values()) {
//             if (protocol.getValue() == value)
//                 return protocol;
//         }
//         throw new IllegalArgumentException(String.format("Protocol %d is not recognized", value));
//     }
// 
//     public int getValue() {
//         return value;
//     }
// }
// 
// Path: src/main/java/com/github/ffalcinelli/jdivert/Util.java
// public static int unsigned(short value) {
//     return value & 0x0000ffff;
// }
// 
// Path: src/main/java/com/github/ffalcinelli/jdivert/Util.java
// public static byte[] zeroPadArray(byte[] source, int size) {
//     byte[] data = new byte[size];
//     for (int i = 0; i < data.length; i++) {
//         if (i < source.length)
//             data[i] = source[i];
//         else
//             data[i] = 0;
//     }
//     return data;
// }


// Path: src/main/java/com/github/ffalcinelli/jdivert/headers/Ipv4.java
import java.net.Inet4Address;
import java.nio.ByteBuffer;
import static com.github.ffalcinelli.jdivert.Enums.Protocol;
import static com.github.ffalcinelli.jdivert.Util.unsigned;
import static com.github.ffalcinelli.jdivert.Util.zeroPadArray;

    }

    public int getIHL() {
        return (raw.get(0) & 0x0F);
    }

    public void setIHL(int length) {
        byte first = (byte) (getVersion() << 4);
        byte second = (byte) (length & 0x0F);
        raw.put(0, (byte) (first | second));
    }


    public int getTotalLength() {
        return unsigned(raw.getShort(2));
    }

    public void setTotalLength(int length) {
        raw.putShort(2, (short) length);
    }

    public int getTTL() {
        return unsigned(raw.get(8));
    }

    public void setTTL(int ttl) {
        raw.put(8, (byte) ttl);
    }

    @Override
    public Protocol getNextHeaderProtocol() {