Open erkinalp opened 4 years ago
Yes, but that's a huge work, and I have absolutely no time to do that. :/
new files
IPv6Packet.java
add public class IPv6Packet {
. An example.IPv6PacketBuffer.java
add public class IPv6PacketBuffer {
IPv6Header.java
add public class IPv6Header {
Consequentially, add
public IPv6Packet packetizeEmptyPayload() {
public IPv6Packet packetize(ReadableByteChannel channel, int maxChunkSize) throws IOException {
public IPv6Packet packetize(ReadableByteChannel channel) throws IOException {
private IPv6Packet inflate() {
protected boolean sendToClient(IPv6Packet packet) {
public void sendToNetwork(IPv6Packet packet) {
private IPv6Packet read() {
private void pushToClient(IPv6Packet packet) {
public void sendToNetwork(IPv6Packet packet) {
private void handlePacket(IPv6Packet packet) {
private void handleFirstPacket(IPv6Packet packet) {
private void handleDuplicateSyn(IPv6Packet packet) {
private void handleAck(IPv6Packet packet) {
private IPv6Packet createEmptyResponsePacket(int flags) {
public IPv6Packet get() {
private void updateAcknowledgementNumber(IPv6Packet packet) {
void sendToNetwork(IPv6Packet packet){
Tests (besides PacketizerTest.java
, TCPHeaderTest.java
, etc.)
public class IPv6PacketBufferTest {
public void testParseIPv6PacketBuffer() throws IOException {
public void testParseFragmentedIPv6PacketBuffer() throws IOException {
private static void checkPacketHeaders(IPv6Packet packet) {
in IPv6PacketTest.java public class IPv6PacketTest {
.
in IPv6HeaderTest.java public class IPv6HeaderTest {
.
as well as headers
public void computeChecksum(IPv6Header ipv6Header, ByteBuffer payload) {
public void computeChecksum(IPv6Header ipv6Header, ByteBuffer payload) {
void computeChecksum(IPv6Header ipv6Header, ByteBuffer payload);
brew install gnirehtet
is rust version according to README.md.
ipv6_packet.rs
add pub struct Ipv6Packet<'a> {
, An example.ipv6_packet_buffer.rs
add pub struct Ipv6PacketBuffer {
ipv6_header.rs
struct Ipv6Header<'a> {
struct Ipv6HeaderMut<'a> {
pub fn bind<'c, 'a: 'c, 'b: 'c>(&'a self, raw: &'b [u8]) -> Ipv6Header<'c> {
pub fn bind_mut<'c, 'a: 'c, 'b: 'c>(&'a mut self, raw: &'b mut [u8]) -> Ipv6HeaderMut<'c> {
pub fn data(&self) -> &Ipv6HeaderData {
pub fn data_mut(&mut self) -> &mut Ipv6HeaderData {
Consequentially, add
pub fn packetize_empty_payload(&mut self) -> Ipv6Packet {
pub fn packetize<R: DatagramReceiver>(&mut self, source: &mut R) -> io::Result<Ipv6Packet> {
pub fn ipv6_header_mut(&mut self) -> Ipv6HeaderMut {
pub fn inflate(&mut self, packet_length: u16) -> Ipv6Packet {
pub fn create(selector: &mut Selector, id: ConnectionId, client: Weak<RefCell<Client>>, ipv6_header: Ipv6 Header, transport_header: TransportHeader,)
fn send_to_network(&mut self, selector: &mut Selector, _: &mut ClientChannel, ipv6_packet: &ipv6Packet,)
, pub fn create(selector: &mut Selector, id: ConnectionId, client: Weak<RefCell<Client>>, ipv6_header: Ipv6Header, transport_header: TransportHeader,) -> io::Result<Rc<RefCell<Self>>> {
, fn send_to_client(client: &Weak<RefCell<Client>>, selector: &mut Selector, ipv6_packet: &Ipv6Packet, ) -> io::Result<()> {
, fn tcp_header_of_packet<'a>(ipv6_packet: &'a Ipv6Packet) -> TcpHeader<'a> {
, fn handle_packet(&mut self, selector: &mut Selector, client_channel: &mut ClientChannel, ipv6_packet: &Ipv6Packet,) {
, fn handle_first_packet(&mut self, selector: &mut Selector, client_channel: &mut ClientChannel, ipv6_packet: &Ipv6Packet,) {
, fn handle_duplicate_syn(&mut self, selector: &mut Selector, client_channel: &mut ClientChannel, ipv6_packet: &Ipv6Packet,) {
, fn handle_ack(&mut self, _selector: &mut Selector, _client_channel: &mut ClientChannel, ipv6_packet: &Ipv6Packet,) {
, fn send_to_network(&mut self, selector: &mut Selector, client_channel: &mut ClientChannel, ipv6_packet: &Ipv6Packet,) {
in connection.rs and router.rs pub fn send_to_network(&mut self, selector: &mut Selector, client_channel: &mut ClientChannel, ipv6_packet: &Ipv6Packet,) {
in net.rs
fn to_addr(ipv6: u32) -> Ipv6Addr {
pub fn to_socket_addr(ipv6: u32, port: u16) -> SocketAddrV6 {
pub fn update_checksum(&mut self, _ipv6_header_data: &Ipv6HeaderData, _payload: &[u8]) {
pub fn update_checksum(&mut self, ipv6_header_data: &Ipv6HeaderData, payload: &[u8]) {
pub fn update_checksum(&mut self, ipv6_header_data: &Ipv6HeaderData, payload: &[u8]) {
gnirehteT currently only supports IPv4. IPv6 is becoming increasingly commoner.
Hi @rom1v , any reference code for IPv4Packet.java? Maybe original reference has IPv6Packet
as well.
Any reference code for IPv4Packet.java?
This is the original code. Also, adding IPv6 support requires more than just some renaming :wink:
TO DO for java part
For java
TODOs for IPv6 headers and Tests as well as new classes. Pay attention to IPv6 format.
Packetizer and their tests (messed up one file with 1, one file with 3).
Connection (TCP, UDP) and their tests. UDP seems easier than TCP.
Other codes and more tests.
gnirehteT currently only supports IPv4. IPv6 is becoming increasingly commoner.