int main(void) { /* Implementation of basic Net API */ NetClientInfo nc_info; nc_info.can_receive = nc_open_eth_can_receive; nc_info.receive = nc_open_eth_receive; nc_info.link_status_changed = nc_open_eth_set_link_status; /* NIC which can receive but not transmit packets */ NICState nic; nic.nc.info = &nc_info; nic.nc.link_down = 0; nic.nc.peer = NULL; nic.nc.receive_disabled = 0; /* Interrupt handler for incoming packets */ IRQState irq; irq.n = 3; irq.handler = rx_handler; /* Ethernet MAC hardware model */ OpenEthState eth; eth.nic = &nic; eth.irq = &irq; eth.mii.link_ok = true; #ifdef CONCRETE_EXECUTION memset(eth.mii.regs, 0, sizeof(eth.mii.regs)); #endif eth.mii.regs[MII_BMCR]=0; eth.mii.regs[MII_BMSR]=0; eth.mii.regs[MII_PHYIDR1]=0; eth.mii.regs[MII_PHYIDR2]=0; eth.mii.regs[MII_ANAR]=0; eth.mii.regs[MII_ANLPAR]=0; #ifdef CONCRETE_EXECUTION memset(eth.regs, 0, sizeof(eth.regs)); #endif eth.regs[MODER]=0; eth.regs[INT_SOURCE]=0; eth.regs[INT_MASK]=0; eth.regs[IPGT]=0; eth.regs[IPGR1]=0; eth.regs[IPGR2]=0; eth.regs[PACKETLEN]=0; eth.regs[COLLCONF]=0; eth.regs[TX_BD_NUM]=0; eth.regs[CTRLMODER]=0; eth.regs[MIIMODER]=0; eth.regs[MIICOMMAND]=0; eth.regs[MIIADDRESS]=0; eth.regs[MIITX_DATA]=0; eth.regs[MIIRX_DATA]=0; eth.regs[MIISTATUS]=0; eth.regs[MAC_ADDR0]=0; eth.regs[MAC_ADDR1]=0; eth.regs[HASH0]=0; eth.regs[HASH1]=0; eth.regs[TXCTRL]=0; #ifdef CONCRETE_EXECUTION memset(eth.desc, 0, sizeof(eth.desc)); #endif eth.desc[0].buf_ptr=0; eth.desc[1].buf_ptr=0; eth.desc[2].buf_ptr=0; eth.desc[3].buf_ptr=0; eth.desc[4].buf_ptr=0; eth.desc[5].buf_ptr=0; eth.desc[6].buf_ptr=0; eth.desc[7].buf_ptr=0; eth.desc[0].len_flags=0; eth.desc[1].len_flags=0; eth.desc[2].len_flags=0; eth.desc[3].len_flags=0; eth.desc[4].len_flags=0; eth.desc[5].len_flags=0; eth.desc[6].len_flags=0; eth.desc[7].len_flags=0; nic.opaque = ð nc = &nic.nc; #ifdef ETHOC_BENCHMARK_PROP_2 test_init(); #endif #ifdef ETHOC_BENCHMARK_PROP_3 test_rx(); #endif #ifdef ETHOC_BENCHMARK_PROP_4 test_rx_busy(); #endif }
/* * All tests are expected to pass except the last assertion * about `raised_irq` in `test_rx` when _CBMC_ is enabled. */ int main(void) { /* Implementation of basic Net API */ NetClientInfo nc_info; nc_info.link_status_changed = nc_open_eth_set_link_status; /* NIC which can receive but not transmit packets */ NICState nic; nic.nc.info = &nc_info; nic.nc.link_down = 0; nic.nc.receive_disabled = 0; /* Interrupt handler for incoming packets */ IRQState irq; irq.n = 3; irq.handler = rx_handler; irq.threads_counter = 0; #ifndef _CBMC_ pthread_mutex_init(&irq.threads_counter_lock, NULL); #endif /* Ethernet MAC hardware model */ OpenEthState eth; eth.nic = &nic; eth.irq = &irq; eth.mii.link_ok = true; #ifndef _CBMC_ /* * We avoid the need for reentrant locks (i.e. PTHREAD_MUTEX_RECURSIVE lock * attribute) by specifying the expected behaviour of callbacks in "net.h". */ pthread_mutex_init(ð.lock, NULL); #endif memset(eth.mii.regs, 0, sizeof(eth.mii.regs)); eth.mii.regs[MII_BMCR]=0; eth.mii.regs[MII_BMSR]=0; eth.mii.regs[MII_PHYIDR1]=0; eth.mii.regs[MII_PHYIDR2]=0; eth.mii.regs[MII_ANAR]=0; eth.mii.regs[MII_ANLPAR]=0; memset(eth.regs, 0, sizeof(eth.regs)); eth.regs[MODER]=0; eth.regs[INT_SOURCE]=0; eth.regs[INT_MASK]=0; eth.regs[IPGT]=0; eth.regs[IPGR1]=0; eth.regs[IPGR2]=0; eth.regs[PACKETLEN]=0; eth.regs[COLLCONF]=0; eth.regs[TX_BD_NUM]=0; eth.regs[CTRLMODER]=0; eth.regs[MIIMODER]=0; eth.regs[MIICOMMAND]=0; eth.regs[MIIADDRESS]=0; eth.regs[MIITX_DATA]=0; eth.regs[MIIRX_DATA]=0; eth.regs[MIISTATUS]=0; eth.regs[MAC_ADDR0]=0; eth.regs[MAC_ADDR1]=0; eth.regs[HASH0]=0; eth.regs[HASH1]=0; eth.regs[TXCTRL]=0; memset(eth.desc, 0, sizeof(eth.desc)); eth.desc[0].buf_ptr=0; eth.desc[1].buf_ptr=0; eth.desc[2].buf_ptr=0; eth.desc[3].buf_ptr=0; eth.desc[4].buf_ptr=0; eth.desc[5].buf_ptr=0; eth.desc[6].buf_ptr=0; eth.desc[7].buf_ptr=0; eth.desc[0].len_flags=0; eth.desc[1].len_flags=0; eth.desc[2].len_flags=0; eth.desc[3].len_flags=0; eth.desc[4].len_flags=0; eth.desc[5].len_flags=0; eth.desc[6].len_flags=0; eth.desc[7].len_flags=0; nic.opaque = ð nc = &nic.nc; #ifdef _ETHOC_TEST_1_ test_init(); #endif #ifdef _ETHOC_TEST_2_ test_can_receive(); #endif #ifdef _ETHOC_TEST_3_ test_rx(); #elif _ETHOC_TEST_5_ test_rx(); #endif #ifdef _ETHOC_TEST_4_ test_rx_busy(); #endif }