FPS 0.0.3

Flow processing system (under construction).
use n::packet::*;

extract_field!(extract_destination, ethernet, 6, destination);
fill_field!(fill_destination, ethernet, 6, destination);

extract_field!(extract_source, ethernet, 6, source);
fill_field!(fill_source, ethernet, 6, source);

extract_field_value!(extract_protocol_u16, ethernet, protocol, u16);
apply_field_value!(apply_protocol, ethernet, protocol, u16);

extract_field!(extract_protocol, ethernet, 2, protocol);
fill_field!(fill_protocol, ethernet, 2, protocol);

#[millefeuille]
pub fn extract_source_u64(packet: Packet) -> Packet {
    let mut packet = packet;
    let first_4;
    let later_2;
    {
        let field = packet.context.get_field("ethernet::source");
        first_4 = field.read_u32(0) as u64;
        later_2 = field.read_u16(4) as u64;
    }
    let val = (first_4 << 32) | (later_2 & 0xFFFF);
    packet.context.set_u64("ethernet::source_u64", val);
    packet
}

#[millefeuille]
pub fn extract_destination_u64(packet: Packet) -> Packet {
    let mut packet = packet;
    let first_4;
    let later_2;
    {
        let field = packet.context.get_field("ethernet::destination");
        first_4 = field.read_u32(0) as u64;
        later_2 = field.read_u16(4) as u64;
    }
    let val = (first_4 << 32) | (later_2 & 0xFFFF);
    packet.context.set_u64("ethernet::destination_u64", val);
    packet
}

#[millefeuille]
pub fn apply_source(packet: Packet) -> Packet {
    let mut packet = packet;
    let mut field = packet.context.take_field("ethernet::source");
    let value = packet.context.get_u64("ethernet::source_u64");
    field.write_u32(0, (value >> 32) as u32);
    field.write_u16(4, ((value >> 16) & 0xFFFF) as u16);
    packet.context.set_field("ethernet::source", field);
    packet
}

#[millefeuille]
pub fn apply_destination(packet: Packet) -> Packet {
    let mut packet = packet;
    let mut field = packet.context.take_field("ethernet::destination");
    let value = packet.context.get_u64("ethernet::destination_u64");
    field.write_u32(0, (value >> 32) as u32);
    field.write_u16(4, ((value >> 16) & 0xFFFF) as u16);
    packet.context.set_field("ethernet::destination", field);
    packet
}

#[millefeuille]
pub fn extract(packet: Packet) -> Packet {
    let packet = extract_destination(packet);
    let packet = extract_source(packet);
    let packet = extract_protocol(packet);

    packet
}

#[millefeuille]
pub fn fill(packet: Packet) -> Packet {
    let packet = fill_protocol(packet);
    let packet = fill_source(packet);
    let packet = fill_destination(packet);

    packet
}

#[millefeuille]
pub fn swap_address(mut packet: Packet) -> Packet {
    let mut temp_addr = &mut [0u8; 6];
    {
        let mut old_dst = packet.context.take_field("ethernet::destination");
        let mut old_src = packet.context.take_field("ethernet::source");
        move_field(old_dst, temp_addr);
        move_field(old_src, old_dst);
        move_field(temp_addr, old_src);
        packet.context.set_field("ethernet::destination", old_dst);
        packet.context.set_field("ethernet::source", old_src);
    }
    packet
}