1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
// Copyright (c) 2014, 2015 Robert Clipsham <robert@octarineparrot.com>
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
/// A simple echo server for packets using a test protocol
extern crate pnet;
use pnet::packet::ip::IpNextHeaderProtocols;
use pnet::packet::udp::MutableUdpPacket;
use pnet::packet::{MutablePacket, Packet};
use pnet::transport::TransportChannelType::Layer4;
use pnet::transport::TransportProtocol::Ipv4;
use pnet::transport::{transport_channel, udp_packet_iter};
fn main() {
let protocol = Layer4(Ipv4(IpNextHeaderProtocols::Test1));
// Create a new transport channel, dealing with layer 4 packets on a test protocol
// It has a receive buffer of 4096 bytes.
let (mut tx, mut rx) = match transport_channel(4096, protocol) {
Ok((tx, rx)) => (tx, rx),
Err(e) => panic!(
"An error occurred when creating the transport channel: {}",
e
),
};
// We treat received packets as if they were UDP packets
let mut iter = udp_packet_iter(&mut rx);
loop {
match iter.next() {
Ok((packet, addr)) => {
// Allocate enough space for a new packet
let mut vec: Vec<u8> = vec![0; packet.packet().len()];
let mut new_packet = MutableUdpPacket::new(&mut vec[..]).unwrap();
// Create a clone of the original packet
new_packet.clone_from(&packet);
// Switch the source and destination ports
new_packet.set_source(packet.get_destination());
new_packet.set_destination(packet.get_source());
// Send the packet
match tx.send_to(new_packet, addr) {
Ok(n) => assert_eq!(n, packet.packet().len()),
Err(e) => panic!("failed to send packet: {}", e),
}
}
Err(e) => {
// If an error occurs, we can handle it here
panic!("An error occurred while reading: {}", e);
}
}
}
}
|