📄 packettest.cc
字号:
// -*- c-basic-offset: 4 -*-/* * packettest.{cc,hh} -- regression test element for packets * Eddie Kohler * * Copyright (c) 2002 International Computer Science Institute * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, subject to the conditions * listed in the Click LICENSE file. These conditions include: you must * preserve this copyright notice, and you cannot mention the copyright * holders in advertising related to the Software without their permission. * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This * notice is a summary of the Click LICENSE file; the license in that file is * legally binding. */#include <click/config.h>#include "packettest.hh"#include <click/error.hh>CLICK_DECLSPacketTest::PacketTest(){}PacketTest::~PacketTest(){}#define CHECK(x) if (!(x)) return errh->error("%s:%d: test `%s' failed", __FILE__, __LINE__, #x);#define CHECK_DATA(x, y, l) CHECK(memcmp((x), (y), (l)) == 0)#define CHECK_ALIGNED(x) CHECK((reinterpret_cast<uintptr_t>((x)) & 3) == 0)intPacketTest::initialize(ErrorHandler *errh){ const unsigned char *lowers = (const unsigned char *)"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"; IPAddress addr(String("1.2.3.4")); Packet *p = Packet::make(10, lowers, 20, 30); CHECK(p->headroom() >= 10); CHECK(p->tailroom() >= 30); CHECK(p->length() == 20); CHECK(p->buffer_length() >= 60); CHECK_DATA(p->data(), lowers, 20); CHECK(!p->mac_header()); CHECK(!p->network_header()); CHECK(!p->transport_header()); p->set_mac_header(p->data(), 10); CHECK(p->network_header() == p->data() + 10); p->set_dst_ip_anno(addr); WritablePacket *p1 = p->push(5); // p is dead CHECK(p == p1); CHECK(p1->headroom() >= 5); CHECK(p1->tailroom() >= 30); CHECK(p1->length() == 25); CHECK_DATA(p1->data() + 5, lowers, 20); CHECK(p1->mac_header() == p->data() + 5); CHECK(p1->network_header() == p->data() + 15); CHECK(p1->dst_ip_anno() == addr); Packet *p2 = p1->clone(); CHECK(p2 != p1); CHECK(p2->data() == p1->data()); CHECK(p2->length() == 25); CHECK(p1->shared() && p2->shared()); CHECK(p1->mac_header() == p2->mac_header()); CHECK(p2->dst_ip_anno() == addr); WritablePacket *p3 = p2->push(5); // p2 is dead CHECK(p3 != p1); CHECK(p3->length() == 30); CHECK_DATA(p3->data() + 10, lowers, 20); memcpy(p3->data(), lowers, 10); memcpy(p1->data(), lowers, 5); CHECK_DATA(p3->data(), lowers, 10); CHECK_DATA(p1->data(), lowers, 5); CHECK(p3->mac_header() != p1->mac_header()); CHECK(p3->mac_header() == p3->data() + 10); CHECK(p3->network_header() == p3->data() + 20); CHECK(!p1->shared() && !p3->shared()); CHECK(p3->dst_ip_anno() == addr); p1->kill(); p3->kill();#if 0 // test shift_data() p = Packet::make(10, lowers, 60, 4); CHECK(p->headroom() == 10 && p->tailroom() == 4); p = p->shift_data(-2); CHECK(p->headroom() == 8 && p->tailroom() == 6); CHECK(p->length() == 60); CHECK_DATA(p->data(), lowers, 60); CHECK_ALIGNED(p->data()); p->kill(); p = Packet::make(9, lowers, 60, 4); p = p->shift_data(3); CHECK(p->headroom() == 12 && p->tailroom() == 1 && p->length() == 60); CHECK_DATA(p->data(), lowers, 60); CHECK_ALIGNED(p->data()); p->kill(); p = Packet::make(1, lowers, 60, 4); p = p->shift_data(-5); CHECK(p->tailroom() >= 9 && p->length() == 60); CHECK_DATA(p->data(), lowers, 60); CHECK_ALIGNED(p->data()); p->kill(); p = Packet::make(5, lowers, 60, 2); p = p->shift_data(3); CHECK(p->headroom() >= 8 && p->length() == 60); CHECK_DATA(p->data(), lowers, 60); CHECK_ALIGNED(p->data()); p->kill();#endif errh->message("All tests pass!"); return 0;}CLICK_ENDDECLSEXPORT_ELEMENT(PacketTest)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -