/* vim: set expandtab ts=4 sw=4: */
/*
* You may redistribute this program and/or modify it under the terms of
* the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* 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 .
*/
#include "crypto/AddressCalc.h"
#include "memory/MallocAllocator.h"
#include "memory/Allocator.h"
#include "util/Base32.h"
#include "util/Checksum.h"
#include "util/CString.h"
#include "test/TestFramework.h"
#include "net/Ducttape_pvt.h"
#include
#define PADDING 512
static uint8_t catchResponse(struct Message* msg, struct Interface* iface)
{
iface->receiverContext = msg;
return 0;
}
int main()
{
return 0; // TODO make this work again
char* pingBenc = "d1:q4:ping4:txid4:abcd1:pi2ee";
struct Allocator* alloc = MallocAllocator_new(1<<22);
struct TestFramework* tf = TestFramework_setUp("0123456789abcdefghijklmnopqrstuv", alloc, NULL);
struct Ducttape_pvt* dt = (struct Ducttape_pvt*) tf->ducttape;
struct Allocator* allocator = MallocAllocator_new(85000);
uint16_t buffLen = sizeof(struct Ducttape_IncomingForMe) + 8 + strlen(pingBenc);
uint8_t* buff = Allocator_calloc(allocator, buffLen+PADDING, 1);
struct Headers_SwitchHeader* sh = (struct Headers_SwitchHeader*) (buff + PADDING);
sh->label_be = Endian_hostToBigEndian64(4);
struct Headers_IP6Header* ip6 = (struct Headers_IP6Header*) &sh[1];
uint8_t herPublicKey[32];
Base32_decode(herPublicKey, 32,
(uint8_t*) "0z5tscp8td1sc6cv4htp7jbls79ltqxw9pbg190x0kbm1lguqtx0", 52);
AddressCalc_addressForPublicKey(ip6->sourceAddr, herPublicKey);
struct Headers_UDPHeader* udp = (struct Headers_UDPHeader*) &ip6[1];
ip6->hopLimit = 0;
ip6->nextHeader = 17;
udp->srcPort_be = 0;
udp->destPort_be = 0;
udp->length_be = Endian_hostToBigEndian16(CString_strlen(pingBenc));
CString_strncpy((char*)(udp + 1), pingBenc, CString_strlen(pingBenc));
dt->switchInterface.receiveMessage = catchResponse;
dt->switchInterface.receiverContext = NULL;
// bad checksum
udp->checksum_be = 1;
struct Message m = {
.bytes = buff+PADDING,
.length = buffLen,
.padding = PADDING,
.alloc = alloc
};
Ducttape_injectIncomingForMe(&m, &dt->pub, herPublicKey);
Assert_always(!dt->switchInterface.receiverContext);
// zero checksum
udp->checksum_be = 0;
struct Message m2 = {
.bytes = buff+PADDING,
.length = buffLen,
.padding = PADDING,
.alloc = alloc
};
Ducttape_injectIncomingForMe(&m2, &dt->pub, herPublicKey);
Assert_always(!dt->switchInterface.receiverContext);
// good checksum
udp->checksum_be =
Checksum_udpIp6(ip6->sourceAddr,
(uint8_t*)udp,
CString_strlen(pingBenc) + Headers_UDPHeader_SIZE);
struct Message m3 = {
.bytes = buff+PADDING,
.length = buffLen,
.padding = PADDING,
.alloc = alloc
};
Ducttape_injectIncomingForMe(&m3, &dt->pub, herPublicKey);
Assert_always(dt->switchInterface.receiverContext);
Allocator_free(alloc);
Allocator_free(allocator);
return 0;
}