Changeset View
Changeset View
Standalone View
Standalone View
tests/sys/netgraph/bridge.c
Show All 37 Lines | |||||
#include <net/ethernet.h> | #include <net/ethernet.h> | ||||
#include <netinet/in.h> | #include <netinet/in.h> | ||||
#include <netinet/ip.h> | #include <netinet/ip.h> | ||||
#include <netinet/ip6.h> | #include <netinet/ip6.h> | ||||
#include "util.h" | #include "util.h" | ||||
#include <netgraph/ng_bridge.h> | #include <netgraph/ng_bridge.h> | ||||
static void get_data0(void *data, size_t len, void *ctx); | |||||
static void get_data1(void *data, size_t len, void *ctx); | |||||
static void get_data2(void *data, size_t len, void *ctx); | |||||
static void get_data3(void *data, size_t len, void *ctx); | |||||
static void get_tablesize(char const *source, struct ng_mesg *msg, void *ctx); | static void get_tablesize(char const *source, struct ng_mesg *msg, void *ctx); | ||||
struct gettable | struct gettable | ||||
{ | { | ||||
u_int32_t tok; | u_int32_t tok; | ||||
int cnt; | int cnt; | ||||
}; | }; | ||||
struct frame4 | struct frame4 | ||||
Show All 26 Lines | |||||
ATF_TC(basic); | ATF_TC(basic); | ||||
ATF_TC_HEAD(basic, conf) | ATF_TC_HEAD(basic, conf) | ||||
{ | { | ||||
atf_tc_set_md_var(conf, "require.user", "root"); | atf_tc_set_md_var(conf, "require.user", "root"); | ||||
} | } | ||||
ATF_TC_BODY(basic, dummy) | ATF_TC_BODY(basic, dummy) | ||||
{ | { | ||||
int r[4]; | ng_counter_t r; | ||||
struct gettable rm; | struct gettable rm; | ||||
ng_init(); | ng_init(); | ||||
ng_errors(PASS); | ng_errors(PASS); | ||||
ng_shutdown("bridge:"); | ng_shutdown("bridge:"); | ||||
ng_errors(FAIL); | ng_errors(FAIL); | ||||
ng_mkpeer(".", "a", "bridge", "link0"); | ng_mkpeer(".", "a", "bridge", "link0"); | ||||
ng_name("a", "bridge"); | ng_name("a", "bridge"); | ||||
ng_connect(".", "b", "bridge:", "link1"); | ng_connect(".", "b", "bridge:", "link1"); | ||||
ng_connect(".", "c", "bridge:", "link2"); | ng_connect(".", "c", "bridge:", "link2"); | ||||
/* do not bounce back */ | /* do not bounce back */ | ||||
ng_register_data("a", get_data0); | ng_register_data("a", get_data0); | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 1; | msg4.eh.ether_shost[5] = 1; | ||||
ng_send_data("a", &msg4, sizeof(msg4)); | ng_send_data("a", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0); | ATF_CHECK(r[0] == 0); | ||||
/* send to others */ | /* send to others */ | ||||
ng_register_data("b", get_data1); | ng_register_data("b", get_data1); | ||||
ng_register_data("c", get_data2); | ng_register_data("c", get_data2); | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 1; | msg4.eh.ether_shost[5] = 1; | ||||
ng_send_data("a", &msg4, sizeof(msg4)); | ng_send_data("a", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1); | ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1); | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 2; | msg4.eh.ether_shost[5] = 2; | ||||
ng_send_data("b", &msg4, sizeof(msg4)); | ng_send_data("b", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 1); | ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 1); | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 3; | msg4.eh.ether_shost[5] = 3; | ||||
ng_send_data("c", &msg4, sizeof(msg4)); | ng_send_data("c", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 1 && r[1] == 1 && r[2] == 0); | ATF_CHECK(r[0] == 1 && r[1] == 1 && r[2] == 0); | ||||
/* send to learned unicast */ | /* send to learned unicast */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 1; | msg4.eh.ether_shost[5] = 1; | ||||
msg4.eh.ether_dhost[5] = 3; | msg4.eh.ether_dhost[5] = 3; | ||||
ng_send_data("a", &msg4, sizeof(msg4)); | ng_send_data("a", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0 && r[1] == 0 && r[2] == 1); | ATF_CHECK(r[0] == 0 && r[1] == 0 && r[2] == 1); | ||||
/* inspect mac table */ | /* inspect mac table */ | ||||
ng_register_msg(get_tablesize); | ng_register_msg(get_tablesize); | ||||
rm.tok = ng_send_msg("bridge:", "gettable"); | rm.tok = ng_send_msg("bridge:", "gettable"); | ||||
rm.cnt = 0; | rm.cnt = 0; | ||||
ng_handle_events(50, &rm); | ng_handle_events(50, &rm); | ||||
ATF_CHECK(rm.cnt == 3); | ATF_CHECK(rm.cnt == 3); | ||||
/* remove a link */ | /* remove a link */ | ||||
ng_rmhook(".", "b"); | ng_rmhook(".", "b"); | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 1; | msg4.eh.ether_shost[5] = 1; | ||||
msg4.eh.ether_dhost[5] = 0; | msg4.eh.ether_dhost[5] = 0; | ||||
ng_send_data("a", &msg4, sizeof(msg4)); | ng_send_data("a", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0 && r[1] == 0 && r[2] == 1); | ATF_CHECK(r[0] == 0 && r[1] == 0 && r[2] == 1); | ||||
/* inspect mac table */ | /* inspect mac table */ | ||||
ng_register_msg(get_tablesize); | ng_register_msg(get_tablesize); | ||||
Show All 30 Lines | |||||
ATF_TC(loop); | ATF_TC(loop); | ||||
ATF_TC_HEAD(loop, conf) | ATF_TC_HEAD(loop, conf) | ||||
{ | { | ||||
atf_tc_set_md_var(conf, "require.user", "root"); | atf_tc_set_md_var(conf, "require.user", "root"); | ||||
} | } | ||||
ATF_TC_BODY(loop, dummy) | ATF_TC_BODY(loop, dummy) | ||||
{ | { | ||||
int r[4], i; | ng_counter_t r; | ||||
int i; | |||||
ng_init(); | ng_init(); | ||||
ng_errors(PASS); | ng_errors(PASS); | ||||
ng_shutdown("bridge1:"); | ng_shutdown("bridge1:"); | ||||
ng_shutdown("bridge2:"); | ng_shutdown("bridge2:"); | ||||
ng_errors(FAIL); | ng_errors(FAIL); | ||||
ng_mkpeer(".", "a", "bridge", "link0"); | ng_mkpeer(".", "a", "bridge", "link0"); | ||||
ng_name("a", "bridge1"); | ng_name("a", "bridge1"); | ||||
ng_mkpeer(".", "b", "bridge", "link1"); | ng_mkpeer(".", "b", "bridge", "link1"); | ||||
ng_name("b", "bridge2"); | ng_name("b", "bridge2"); | ||||
ng_register_data("a", get_data0); | ng_register_data("a", get_data0); | ||||
ng_register_data("b", get_data1); | ng_register_data("b", get_data1); | ||||
/*- | /*- | ||||
* Open loop | * Open loop | ||||
* | * | ||||
* /-- bridge1 | * /-- bridge1 | ||||
* . < | | * . < | | ||||
* \-- bridge2 | * \-- bridge2 | ||||
*/ | */ | ||||
ng_connect("bridge1:", "link11", "bridge2:", "link11"); | ng_connect("bridge1:", "link11", "bridge2:", "link11"); | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 1; | msg4.eh.ether_shost[5] = 1; | ||||
ng_send_data("a", &msg4, sizeof(msg4)); | ng_send_data("a", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0 && r[1] == 1); | ATF_CHECK(r[0] == 0 && r[1] == 1); | ||||
/*- | /*- | ||||
* Closed loop, DANGEROUS! | * Closed loop, DANGEROUS! | ||||
* | * | ||||
* /-- bridge1 -\ | * /-- bridge1 -\ | ||||
* . < | | | * . < | | | ||||
* \-- bridge2 -/ | * \-- bridge2 -/ | ||||
*/ | */ | ||||
ng_connect("bridge1:", "link12", "bridge2:", "link12"); | ng_connect("bridge1:", "link12", "bridge2:", "link12"); | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 1; | msg4.eh.ether_shost[5] = 1; | ||||
ng_errors(PASS); | ng_errors(PASS); | ||||
ng_send_data("a", &msg4, sizeof(msg4)); | ng_send_data("a", &msg4, sizeof(msg4)); | ||||
ATF_CHECK_ERRNO(ELOOP, errno != 0); /* loop might be detected */ | ATF_CHECK_ERRNO(ELOOP, errno != 0); /* loop might be detected */ | ||||
ng_errors(FAIL); | ng_errors(FAIL); | ||||
for (i = 0; i < 10; i++) /* don't run forever */ | for (i = 0; i < 10; i++) /* don't run forever */ | ||||
if (!ng_handle_event(50, &r)) | if (!ng_handle_event(50, &r)) | ||||
break; | break; | ||||
ATF_CHECK(r[0] == 0 && r[1] == 1); | ATF_CHECK(r[0] == 0 && r[1] == 1); | ||||
ng_shutdown("bridge1:"); | ng_shutdown("bridge1:"); | ||||
ng_shutdown("bridge2:"); | ng_shutdown("bridge2:"); | ||||
} | } | ||||
ATF_TC(many_unicasts); | ATF_TC(many_unicasts); | ||||
ATF_TC_HEAD(many_unicasts, conf) | ATF_TC_HEAD(many_unicasts, conf) | ||||
{ | { | ||||
atf_tc_set_md_var(conf, "require.user", "root"); | atf_tc_set_md_var(conf, "require.user", "root"); | ||||
} | } | ||||
ATF_TC_BODY(many_unicasts, dummy) | ATF_TC_BODY(many_unicasts, dummy) | ||||
{ | { | ||||
int r[4], i; | ng_counter_t r; | ||||
int i; | |||||
const int HOOKS = 1000; | const int HOOKS = 1000; | ||||
struct gettable rm; | struct gettable rm; | ||||
ng_init(); | ng_init(); | ||||
ng_errors(PASS); | ng_errors(PASS); | ||||
ng_shutdown("bridge:"); | ng_shutdown("bridge:"); | ||||
ng_errors(FAIL); | ng_errors(FAIL); | ||||
ng_mkpeer(".", "a", "bridge", "link0"); | ng_mkpeer(".", "a", "bridge", "link0"); | ||||
ng_name("a", "bridge"); | ng_name("a", "bridge"); | ||||
ng_register_data("a", get_data0); | ng_register_data("a", get_data0); | ||||
/* learn MAC */ | /* learn MAC */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[3] = 0xff; | msg4.eh.ether_shost[3] = 0xff; | ||||
ng_send_data("a", &msg4, sizeof(msg4)); | ng_send_data("a", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0); | ATF_CHECK(r[0] == 0); | ||||
/* use learned MAC as destination */ | /* use learned MAC as destination */ | ||||
msg4.eh.ether_shost[3] = 0; | msg4.eh.ether_shost[3] = 0; | ||||
msg4.eh.ether_dhost[3] = 0xff; | msg4.eh.ether_dhost[3] = 0xff; | ||||
/* now send */ | /* now send */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
for (i = 1; i <= HOOKS; i++) | for (i = 1; i <= HOOKS; i++) | ||||
{ | { | ||||
char hook[20]; | char hook[20]; | ||||
snprintf(hook, sizeof(hook), "link%d", i); | snprintf(hook, sizeof(hook), "link%d", i); | ||||
ng_connect(".", hook, "bridge:", hook); | ng_connect(".", hook, "bridge:", hook); | ||||
ng_register_data(hook, get_data2); | ng_register_data(hook, get_data2); | ||||
Show All 29 Lines | |||||
ATF_TC(many_broadcasts); | ATF_TC(many_broadcasts); | ||||
ATF_TC_HEAD(many_broadcasts, conf) | ATF_TC_HEAD(many_broadcasts, conf) | ||||
{ | { | ||||
atf_tc_set_md_var(conf, "require.user", "root"); | atf_tc_set_md_var(conf, "require.user", "root"); | ||||
} | } | ||||
ATF_TC_BODY(many_broadcasts, dummy) | ATF_TC_BODY(many_broadcasts, dummy) | ||||
{ | { | ||||
int r[4], i; | ng_counter_t r; | ||||
int i; | |||||
const int HOOKS = 1000; | const int HOOKS = 1000; | ||||
ng_init(); | ng_init(); | ||||
ng_errors(PASS); | ng_errors(PASS); | ||||
ng_shutdown("bridge:"); | ng_shutdown("bridge:"); | ||||
ng_errors(FAIL); | ng_errors(FAIL); | ||||
ng_mkpeer(".", "a", "bridge", "link0"); | ng_mkpeer(".", "a", "bridge", "link0"); | ||||
ng_name("a", "bridge"); | ng_name("a", "bridge"); | ||||
ng_register_data("a", get_data0); | ng_register_data("a", get_data0); | ||||
/* learn MAC */ | /* learn MAC */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[3] = 0xff; | msg4.eh.ether_shost[3] = 0xff; | ||||
ng_send_data("a", &msg4, sizeof(msg4)); | ng_send_data("a", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0); | ATF_CHECK(r[0] == 0); | ||||
/* use broadcast MAC */ | /* use broadcast MAC */ | ||||
msg4.eh.ether_shost[3] = 0; | msg4.eh.ether_shost[3] = 0; | ||||
memset(msg4.eh.ether_dhost, 0xff, sizeof(msg4.eh.ether_dhost)); | memset(msg4.eh.ether_dhost, 0xff, sizeof(msg4.eh.ether_dhost)); | ||||
/* now send */ | /* now send */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
for (i = 1; i <= HOOKS; i++) | for (i = 1; i <= HOOKS; i++) | ||||
{ | { | ||||
char hook[20]; | char hook[20]; | ||||
snprintf(hook, sizeof(hook), "link%d", i); | snprintf(hook, sizeof(hook), "link%d", i); | ||||
ng_connect(".", hook, "bridge:", hook); | ng_connect(".", hook, "bridge:", hook); | ||||
ng_register_data(hook, get_data3); | ng_register_data(hook, get_data3); | ||||
Show All 18 Lines | |||||
ATF_TC(uplink_private); | ATF_TC(uplink_private); | ||||
ATF_TC_HEAD(uplink_private, conf) | ATF_TC_HEAD(uplink_private, conf) | ||||
{ | { | ||||
atf_tc_set_md_var(conf, "require.user", "root"); | atf_tc_set_md_var(conf, "require.user", "root"); | ||||
} | } | ||||
ATF_TC_BODY(uplink_private, dummy) | ATF_TC_BODY(uplink_private, dummy) | ||||
{ | { | ||||
int r[4]; | ng_counter_t r; | ||||
struct gettable rm; | struct gettable rm; | ||||
ng_init(); | ng_init(); | ||||
ng_errors(PASS); | ng_errors(PASS); | ||||
ng_shutdown("bridge:"); | ng_shutdown("bridge:"); | ||||
ng_mkpeer(".", "u1", "bridge", "uplink1"); | ng_mkpeer(".", "u1", "bridge", "uplink1"); | ||||
if (errno > 0) | if (errno > 0) | ||||
atf_tc_skip("uplinks are not supported."); | atf_tc_skip("uplinks are not supported."); | ||||
ng_errors(FAIL); | ng_errors(FAIL); | ||||
ng_name("u1", "bridge"); | ng_name("u1", "bridge"); | ||||
ng_register_data("u1", get_data1); | ng_register_data("u1", get_data1); | ||||
ng_connect(".", "u2", "bridge:", "uplink2"); | ng_connect(".", "u2", "bridge:", "uplink2"); | ||||
ng_register_data("u2", get_data2); | ng_register_data("u2", get_data2); | ||||
ng_connect(".", "l0", "bridge:", "link0"); | ng_connect(".", "l0", "bridge:", "link0"); | ||||
ng_register_data("l0", get_data0); | ng_register_data("l0", get_data0); | ||||
ng_connect(".", "l3", "bridge:", "link3"); | ng_connect(".", "l3", "bridge:", "link3"); | ||||
ng_register_data("l3", get_data3); | ng_register_data("l3", get_data3); | ||||
/* unknown unicast 0 from uplink1 */ | /* unknown unicast 0 from uplink1 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 1; | msg4.eh.ether_shost[5] = 1; | ||||
ng_send_data("u1", &msg4, sizeof(msg4)); | ng_send_data("u1", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0 && r[1] == 0 && r[2] == 1 && r[3] == 0); | ATF_CHECK(r[0] == 0 && r[1] == 0 && r[2] == 1 && r[3] == 0); | ||||
/* unknown unicast 2 from link0 */ | /* unknown unicast 2 from link0 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 0; | msg4.eh.ether_shost[5] = 0; | ||||
msg4.eh.ether_dhost[5] = 2; | msg4.eh.ether_dhost[5] = 2; | ||||
ng_send_data("l0", &msg4, sizeof(msg4)); | ng_send_data("l0", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 0); | ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 0); | ||||
/* known unicast 0 from uplink2 */ | /* known unicast 0 from uplink2 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 2; | msg4.eh.ether_shost[5] = 2; | ||||
msg4.eh.ether_dhost[5] = 0; | msg4.eh.ether_dhost[5] = 0; | ||||
ng_send_data("u2", &msg4, sizeof(msg4)); | ng_send_data("u2", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 0 && r[3] == 0); | ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 0 && r[3] == 0); | ||||
/* known unicast 0 from link3 */ | /* known unicast 0 from link3 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 3; | msg4.eh.ether_shost[5] = 3; | ||||
msg4.eh.ether_dhost[5] = 0; | msg4.eh.ether_dhost[5] = 0; | ||||
ng_send_data("l3", &msg4, sizeof(msg4)); | ng_send_data("l3", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 0 && r[3] == 0); | ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 0 && r[3] == 0); | ||||
/* (un)known unicast 2 from uplink1 */ | /* (un)known unicast 2 from uplink1 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 1; | msg4.eh.ether_shost[5] = 1; | ||||
msg4.eh.ether_dhost[5] = 2; | msg4.eh.ether_dhost[5] = 2; | ||||
ng_send_data("u1", &msg4, sizeof(msg4)); | ng_send_data("u1", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0 && r[1] == 0 && r[2] == 1 && r[3] == 0); | ATF_CHECK(r[0] == 0 && r[1] == 0 && r[2] == 1 && r[3] == 0); | ||||
/* (un)known unicast 2 from link0 */ | /* (un)known unicast 2 from link0 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 0; | msg4.eh.ether_shost[5] = 0; | ||||
ng_send_data("l0", &msg4, sizeof(msg4)); | ng_send_data("l0", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 0); | ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 0); | ||||
/* unknown multicast 2 from uplink1 */ | /* unknown multicast 2 from uplink1 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 1; | msg4.eh.ether_shost[5] = 1; | ||||
msg4.eh.ether_dhost[0] = 0xff; | msg4.eh.ether_dhost[0] = 0xff; | ||||
ng_send_data("u1", &msg4, sizeof(msg4)); | ng_send_data("u1", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 1 && r[3] == 1); | ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 1 && r[3] == 1); | ||||
/* unknown multicast 2 from link0 */ | /* unknown multicast 2 from link0 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 0; | msg4.eh.ether_shost[5] = 0; | ||||
ng_send_data("l0", &msg4, sizeof(msg4)); | ng_send_data("l0", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 1); | ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 1); | ||||
/* broadcast from uplink1 */ | /* broadcast from uplink1 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 1; | msg4.eh.ether_shost[5] = 1; | ||||
memset(msg4.eh.ether_dhost, 0xff, sizeof(msg4.eh.ether_dhost)); | memset(msg4.eh.ether_dhost, 0xff, sizeof(msg4.eh.ether_dhost)); | ||||
ng_send_data("u1", &msg4, sizeof(msg4)); | ng_send_data("u1", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 1 && r[3] == 1); | ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 1 && r[3] == 1); | ||||
/* broadcast from link0 */ | /* broadcast from link0 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 0; | msg4.eh.ether_shost[5] = 0; | ||||
ng_send_data("l0", &msg4, sizeof(msg4)); | ng_send_data("l0", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 1); | ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 1); | ||||
/* inspect mac table */ | /* inspect mac table */ | ||||
ng_register_msg(get_tablesize); | ng_register_msg(get_tablesize); | ||||
rm.tok = ng_send_msg("bridge:", "gettable"); | rm.tok = ng_send_msg("bridge:", "gettable"); | ||||
rm.cnt = 0; | rm.cnt = 0; | ||||
ng_handle_events(50, &rm); | ng_handle_events(50, &rm); | ||||
ATF_CHECK(rm.cnt == 2); | ATF_CHECK(rm.cnt == 2); | ||||
ng_shutdown("bridge:"); | ng_shutdown("bridge:"); | ||||
} | } | ||||
ATF_TC(uplink_classic); | ATF_TC(uplink_classic); | ||||
ATF_TC_HEAD(uplink_classic, conf) | ATF_TC_HEAD(uplink_classic, conf) | ||||
{ | { | ||||
atf_tc_set_md_var(conf, "require.user", "root"); | atf_tc_set_md_var(conf, "require.user", "root"); | ||||
} | } | ||||
ATF_TC_BODY(uplink_classic, dummy) | ATF_TC_BODY(uplink_classic, dummy) | ||||
{ | { | ||||
int r[4]; | ng_counter_t r; | ||||
struct gettable rm; | struct gettable rm; | ||||
ng_init(); | ng_init(); | ||||
ng_errors(PASS); | ng_errors(PASS); | ||||
ng_shutdown("bridge:"); | ng_shutdown("bridge:"); | ||||
ng_mkpeer(".", "l0", "bridge", "link0"); | ng_mkpeer(".", "l0", "bridge", "link0"); | ||||
if (errno > 0) | if (errno > 0) | ||||
atf_tc_skip("uplinks are not supported."); | atf_tc_skip("uplinks are not supported."); | ||||
ng_errors(FAIL); | ng_errors(FAIL); | ||||
ng_name("l0", "bridge"); | ng_name("l0", "bridge"); | ||||
ng_register_data("l0", get_data0); | ng_register_data("l0", get_data0); | ||||
ng_connect(".", "u1", "bridge:", "uplink1"); | ng_connect(".", "u1", "bridge:", "uplink1"); | ||||
ng_register_data("u1", get_data1); | ng_register_data("u1", get_data1); | ||||
ng_connect(".", "u2", "bridge:", "uplink2"); | ng_connect(".", "u2", "bridge:", "uplink2"); | ||||
ng_register_data("u2", get_data2); | ng_register_data("u2", get_data2); | ||||
ng_connect(".", "l3", "bridge:", "link3"); | ng_connect(".", "l3", "bridge:", "link3"); | ||||
ng_register_data("l3", get_data3); | ng_register_data("l3", get_data3); | ||||
/* unknown unicast 0 from uplink1 */ | /* unknown unicast 0 from uplink1 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 1; | msg4.eh.ether_shost[5] = 1; | ||||
ng_send_data("u1", &msg4, sizeof(msg4)); | ng_send_data("u1", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 1 && r[3] == 1); | ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 1 && r[3] == 1); | ||||
/* unknown unicast 2 from link0 */ | /* unknown unicast 2 from link0 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 0; | msg4.eh.ether_shost[5] = 0; | ||||
msg4.eh.ether_dhost[5] = 2; | msg4.eh.ether_dhost[5] = 2; | ||||
ng_send_data("l0", &msg4, sizeof(msg4)); | ng_send_data("l0", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 1); | ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 1); | ||||
/* known unicast 0 from uplink2 */ | /* known unicast 0 from uplink2 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 2; | msg4.eh.ether_shost[5] = 2; | ||||
msg4.eh.ether_dhost[5] = 0; | msg4.eh.ether_dhost[5] = 0; | ||||
ng_send_data("u2", &msg4, sizeof(msg4)); | ng_send_data("u2", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 0 && r[3] == 0); | ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 0 && r[3] == 0); | ||||
/* known unicast 0 from link3 */ | /* known unicast 0 from link3 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 3; | msg4.eh.ether_shost[5] = 3; | ||||
msg4.eh.ether_dhost[5] = 0; | msg4.eh.ether_dhost[5] = 0; | ||||
ng_send_data("l3", &msg4, sizeof(msg4)); | ng_send_data("l3", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 0 && r[3] == 0); | ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 0 && r[3] == 0); | ||||
/* (un)known unicast 2 from uplink1 */ | /* (un)known unicast 2 from uplink1 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 1; | msg4.eh.ether_shost[5] = 1; | ||||
msg4.eh.ether_dhost[5] = 2; | msg4.eh.ether_dhost[5] = 2; | ||||
ng_send_data("u1", &msg4, sizeof(msg4)); | ng_send_data("u1", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 1 && r[3] == 1); | ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 1 && r[3] == 1); | ||||
/* (un)known unicast 2 from link0 */ | /* (un)known unicast 2 from link0 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 0; | msg4.eh.ether_shost[5] = 0; | ||||
ng_send_data("l0", &msg4, sizeof(msg4)); | ng_send_data("l0", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 1); | ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 1); | ||||
/* unknown multicast 2 from uplink1 */ | /* unknown multicast 2 from uplink1 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 1; | msg4.eh.ether_shost[5] = 1; | ||||
msg4.eh.ether_dhost[0] = 0xff; | msg4.eh.ether_dhost[0] = 0xff; | ||||
ng_send_data("u1", &msg4, sizeof(msg4)); | ng_send_data("u1", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 1 && r[3] == 1); | ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 1 && r[3] == 1); | ||||
/* unknown multicast 2 from link0 */ | /* unknown multicast 2 from link0 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 0; | msg4.eh.ether_shost[5] = 0; | ||||
ng_send_data("l0", &msg4, sizeof(msg4)); | ng_send_data("l0", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 1); | ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 1); | ||||
/* broadcast from uplink1 */ | /* broadcast from uplink1 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 1; | msg4.eh.ether_shost[5] = 1; | ||||
memset(msg4.eh.ether_dhost, 0xff, sizeof(msg4.eh.ether_dhost)); | memset(msg4.eh.ether_dhost, 0xff, sizeof(msg4.eh.ether_dhost)); | ||||
ng_send_data("u1", &msg4, sizeof(msg4)); | ng_send_data("u1", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 1 && r[3] == 1); | ATF_CHECK(r[0] == 1 && r[1] == 0 && r[2] == 1 && r[3] == 1); | ||||
/* broadcast from link0 */ | /* broadcast from link0 */ | ||||
bzero(r, sizeof(r)); | ng_counter_clear(r); | ||||
msg4.eh.ether_shost[5] = 0; | msg4.eh.ether_shost[5] = 0; | ||||
ng_send_data("l0", &msg4, sizeof(msg4)); | ng_send_data("l0", &msg4, sizeof(msg4)); | ||||
ng_handle_events(50, &r); | ng_handle_events(50, &r); | ||||
ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 1); | ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1 && r[3] == 1); | ||||
/* inspect mac table */ | /* inspect mac table */ | ||||
ng_register_msg(get_tablesize); | ng_register_msg(get_tablesize); | ||||
rm.tok = ng_send_msg("bridge:", "gettable"); | rm.tok = ng_send_msg("bridge:", "gettable"); | ||||
Show All 11 Lines | ATF_TP_ADD_TCS(bridge) | ||||
ATF_TP_ADD_TC(bridge, persistence); | ATF_TP_ADD_TC(bridge, persistence); | ||||
ATF_TP_ADD_TC(bridge, many_unicasts); | ATF_TP_ADD_TC(bridge, many_unicasts); | ||||
ATF_TP_ADD_TC(bridge, many_broadcasts); | ATF_TP_ADD_TC(bridge, many_broadcasts); | ||||
ATF_TP_ADD_TC(bridge, uplink_private); | ATF_TP_ADD_TC(bridge, uplink_private); | ||||
ATF_TP_ADD_TC(bridge, uplink_classic); | ATF_TP_ADD_TC(bridge, uplink_classic); | ||||
return atf_no_error(); | return atf_no_error(); | ||||
} | } | ||||
static inline void | |||||
_get_data(void *data, size_t len, void *ctx, int i) | |||||
{ | |||||
int *cnt = ctx; | |||||
(void)data; | |||||
fprintf(stderr, "[%d] Got %zu bytes of data.\n", i, len); | |||||
cnt[i]++; | |||||
} | |||||
#define GD(x) static void \ | |||||
get_data##x(void *data, size_t len, void *ctx) {\ | |||||
_get_data(data, len, ctx, x); \ | |||||
} | |||||
GD(0) | |||||
GD(1) | |||||
GD(2) | |||||
GD(3) | |||||
static void | static void | ||||
get_tablesize(char const *source, struct ng_mesg *msg, void *ctx) | get_tablesize(char const *source, struct ng_mesg *msg, void *ctx) | ||||
{ | { | ||||
struct gettable *rm = ctx; | struct gettable *rm = ctx; | ||||
struct ng_bridge_host_ary *gt = (void *)msg->data; | struct ng_bridge_host_ary *gt = (void *)msg->data; | ||||
fprintf(stderr, "Response from %s to query %d\n", source, msg->header.token); | fprintf(stderr, "Response from %s to query %d\n", source, msg->header.token); | ||||
if (rm->tok == msg->header.token) | if (rm->tok == msg->header.token) | ||||
rm->cnt = gt->numHosts; | rm->cnt = gt->numHosts; | ||||
} | } |