int aim_main (int argc, char* argv[]) { of_octets_t octets; of_list_bsn_tlv_t *key, *value; void *entry_priv; if (!icmpa_is_initialized()) { icmpa_init(); } router_ip_table_init(); key = make_key(7); value = make_value(0xae892a4d, mac); ops->add(table_priv, key, value, &entry_priv); octets.data = echo_request; octets.bytes = PACKET_BUF_SIZE; port_no = 10; icmpa_create_send_packet_in(&octets, OFP_BSN_PKTIN_FLAG_L3_CPU, port_no); octets.data = ip_packet; port_no = 20; icmpa_create_send_packet_in(&octets, OFP_BSN_PKTIN_FLAG_L3_MISS, port_no); port_no = 30; icmpa_create_send_packet_in(&octets, OFP_BSN_PKTIN_FLAG_TTL_EXPIRED, port_no); /* * Test if we actually received responses from icmpa */ assert(echo_response_received == true); assert(dest_unreach_received == true); assert(ttl_expired_received == true); /* * Unhandled ICMP reason, to test if the packet is passed */ icmpa_create_send_packet_in(&octets, OFP_BSN_PKTIN_FLAG_PDU, port_no); ops->del(table_priv, entry_priv, key); of_object_delete(key); of_object_delete(value); router_ip_table_finish(); icmpa_finish(); return 0; }
int aim_main(int argc, char* argv[]) { AIM_LOG_STRUCT_REGISTER(); /* * We queue many (up to 20) 64KB messages before sending them on the socket * with a single writev(). After we free all the messages the malloc * implementation would see we have more than 128KB (the default trim value) * free and return it to the OS with a call to brk(). Every time we * allocate a new message we have to get the memory with brk() all over * again. * * Increasing the trim threshold above the size of our working set * eliminates this churn. */ mallopt(M_TRIM_THRESHOLD, 2*1024*1024); loci_logger = ivs_loci_logger; core_cfg.expire_flows = 1; core_cfg.stats_check_ms = 900; core_cfg.disconnected_mode = INDIGO_CORE_DISCONNECTED_MODE_STICKY; parse_options(argc, argv); /* Setup logging from command line options */ if (loglevel >= LOGLEVEL_DEFAULT) { aim_log_fid_set_all(AIM_LOG_FLAG_FATAL, 1); aim_log_fid_set_all(AIM_LOG_FLAG_ERROR, 1); aim_log_fid_set_all(AIM_LOG_FLAG_WARN, 1); } if (loglevel >= LOGLEVEL_VERBOSE) { aim_log_fid_set_all(AIM_LOG_FLAG_VERBOSE, 1); } if (loglevel >= LOGLEVEL_TRACE) { aim_log_fid_set_all(AIM_LOG_FLAG_TRACE, 1); } if (use_syslog) { aim_log_pvs_set_all(aim_pvs_syslog_open("ivs", LOG_NDELAY, LOG_DAEMON)); } AIM_LOG_MSG("Starting %s (%s) pid %d", program_version, AIM_STRINGIFY(BUILD_ID), getpid()); /* Initialize all modules */ if (ind_soc_init(&soc_cfg) < 0) { AIM_LOG_FATAL("Failed to initialize Indigo socket manager"); return 1; } if (ind_cxn_init(&cxn_cfg) < 0) { AIM_LOG_FATAL("Failed to initialize Indigo connection manager"); return 1; } if (ind_core_init(&core_cfg) < 0) { AIM_LOG_FATAL("Failed to initialize Indigo core module"); return 1; } if (ind_ovs_init(datapath_name, max_flows) < 0) { AIM_LOG_FATAL("Failed to initialize OVSDriver module"); return 1; } if (lacpa_init() < 0) { AIM_LOG_FATAL("Failed to initialize LACP Agent module"); return 1; } if (lldpa_system_init() < 0) { AIM_LOG_FATAL("Failed to initialize LLDP Agent module"); return 1; } if (arpa_init() < 0) { AIM_LOG_FATAL("Failed to initialize ARP Agent module"); return 1; } if (router_ip_table_init() < 0) { AIM_LOG_FATAL("Failed to initialize Router IP table module"); return 1; } if (icmpa_init() < 0) { AIM_LOG_FATAL("Failed to initialize ICMP Agent module"); return 1; } if (dhcpra_system_init() < 0) { AIM_LOG_FATAL("Failed to initialize DHCP relay table and agent module"); return 1; } if (enable_tunnel) { if (ind_ovs_tunnel_init() < 0) { AIM_LOG_FATAL("Failed to initialize tunneling"); return 1; } } if (pipeline == NULL) { if (openflow_version == NULL || !strcmp(openflow_version, "1.0")) { pipeline = "standard-1.0"; } else if (!strcmp(openflow_version, "1.3")) { pipeline = "standard-1.3"; } else { AIM_DIE("unexpected OpenFlow version"); } } AIM_LOG_INFO("Initializing forwarding pipeline '%s'", pipeline); indigo_error_t rv = pipeline_set(pipeline); if (rv < 0) { AIM_LOG_FATAL("Failed to set pipeline: %s", indigo_strerror(rv)); return 1; } #if 0 /* TODO Configuration module installs its own SIGHUP handler. */ if (ind_cfg_init() < 0) { AIM_LOG_FATAL("Failed to initialize Indigo configuration module"); return 1; } #endif if (config_filename) { ind_cfg_filename_set(config_filename); if (ind_cfg_load() < 0) { AIM_LOG_FATAL("Failed to load configuration file"); return 1; } } if (dpid) { indigo_core_dpid_set(dpid); } /* Enable all modules */ if (ind_soc_enable_set(1) < 0) { AIM_LOG_FATAL("Failed to enable Indigo socket manager"); return 1; } if (ind_cxn_enable_set(1) < 0) { AIM_LOG_FATAL("Failed to enable Indigo connection manager"); return 1; } if (ind_core_enable_set(1) < 0) { AIM_LOG_FATAL("Failed to enable Indigo core module"); return 1; } /* Add interfaces from command line */ { biglist_t *element; char *str; int index = 1; BIGLIST_FOREACH_DATA(element, interfaces, char *, str) { AIM_LOG_MSG("Adding interface %s (port %d)", str, index); if (indigo_port_interface_add(str, index, NULL)) { AIM_LOG_FATAL("Failed to add interface %s", str); return 1; } index++; } }
int aim_main(int argc, char* argv[]) { of_list_bsn_tlv_t *key1, *key2, *value1, *value2, *value3; void *entry_priv; indigo_error_t rv; uint32_t ip; of_mac_addr_t mac; router_ip_table_init(); AIM_ASSERT(ops != NULL); key1 = make_key(10); key2 = make_key(8000); /* invalid */ value1 = make_value(0x1234, mac1); value2 = make_value(0x5678, mac2); value3 = make_value(0, mac1); /* invalid */ /* Successful add/modify/delete */ { rv = router_ip_table_lookup(10, &ip, &mac); AIM_ASSERT(rv == INDIGO_ERROR_NOT_FOUND); rv = ops->add(table_priv, key1, value1, &entry_priv); AIM_ASSERT(rv == INDIGO_ERROR_NONE); rv = router_ip_table_lookup(10, &ip, &mac); AIM_ASSERT(rv == INDIGO_ERROR_NONE); AIM_ASSERT(ip == 0x1234); AIM_ASSERT(!memcmp(&mac, &mac1, sizeof(of_mac_addr_t))); AIM_ASSERT(router_ip_check(ip) == true); AIM_ASSERT(router_ip_check(0x5678) == false); rv = ops->modify(table_priv, entry_priv, key1, value2); AIM_ASSERT(rv == INDIGO_ERROR_NONE); rv = router_ip_table_lookup(10, &ip, &mac); AIM_ASSERT(rv == INDIGO_ERROR_NONE); AIM_ASSERT(ip == 0x5678); AIM_ASSERT(!memcmp(&mac, &mac2, sizeof(of_mac_addr_t))); AIM_ASSERT(router_ip_check(ip) == true); AIM_ASSERT(router_ip_check(0x1234) == false); rv = ops->del(table_priv, entry_priv, key1); AIM_ASSERT(rv == INDIGO_ERROR_NONE); rv = router_ip_table_lookup(10, &ip, &mac); AIM_ASSERT(rv == INDIGO_ERROR_NOT_FOUND); AIM_ASSERT(router_ip_check(0x5678) == false); } /* Invalid key */ { rv = ops->add(table_priv, key2, value1, &entry_priv); AIM_ASSERT(rv == INDIGO_ERROR_PARAM); } /* Invalid value */ { rv = ops->add(table_priv, key1, value3, &entry_priv); AIM_ASSERT(rv == INDIGO_ERROR_PARAM); } of_object_delete(key1); of_object_delete(key2); of_object_delete(value1); of_object_delete(value2); of_object_delete(value3); router_ip_table_finish(); return 0; }