/* Name: packet.c
*
* Slitheen - a decoy routing system for censorship resistance
* Copyright (C) 2017 Cecylia Bocovich (cbocovic@uwaterloo.ca)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
* Additional permission under GNU GPL version 3 section 7
*
* If you modify this Program, or any covered work, by linking or combining
* it with the OpenSSL library (or a modified version of that library),
* containing parts covered by the terms of the OpenSSL Licence and the
* SSLeay license, the licensors of this Program grant you additional
* permission to convey the resulting work. Corresponding Source for a
* non-source form of such a combination shall include the source code
* for the parts of the OpenSSL library used as well as that of the covered
* work.
*/
#include
#include "packet.h"
#include "util.h"
/** Copies a packet_info structure and returns a pointer to the duplicate.
*/
struct packet_info *copy_packet_info(struct packet_info *src_info){
struct packet_info *dst_info = emalloc(sizeof(struct packet_info));
dst_info->ip_hdr = src_info->ip_hdr;
dst_info->tcp_hdr = src_info->tcp_hdr;
dst_info->size_tcp_hdr = src_info->size_tcp_hdr;
dst_info->size_ip_hdr = src_info->size_ip_hdr;
dst_info->app_data = src_info->app_data;
dst_info->app_data_len = src_info->app_data_len;
return dst_info;
}
/*
* Injects a packet back out the opposite interface
*/
void inject_packet(struct inject_args *iargs, const struct pcap_pkthdr *header, uint8_t *packet){
pcap_t *handle = iargs->write_dev;
//write back out to the MAC ADDR it came in on
//memmove(packet, packet+ETHER_ADDR_LEN, ETHER_ADDR_LEN);
//memcpy(packet+ETHER_ADDR_LEN, iargs->mac_addr, ETHER_ADDR_LEN);
if((pcap_inject(handle, packet, header->len)) < 0 ){
fprintf(stderr, "Error: %s\n", pcap_geterr(handle));
printf("Length: %d\n", header->len);
}
#ifdef DEBUG_EXTRA
fprintf(stderr, "injected the following packet:\n");
for(int i=0; i< header->len; i++){
fprintf(stderr, "%02x ", packet[i]);
}
fprintf(stderr, "\n");
#endif
free(packet);
}