void ofl_structs_match_init(struct ofl_match *match){ match->header.type = OFPMT_OXM; match->header.length = 0; match->match_fields = (struct hmap) HMAP_INITIALIZER(&match->match_fields); }
static ofl_err ofl_structs_oxm_match_unpack(struct ofp_match* src, uint8_t* buf, size_t *len, struct ofl_match **dst){ int error = 0; struct ofpbuf *b = ofpbuf_new(0); struct ofl_match *m = (struct ofl_match *) malloc(sizeof(struct ofl_match)); *len -= ROUND_UP(ntohs(src->length),8); if(ntohs(src->length) > sizeof(struct ofp_match)){ ofpbuf_put(b, buf, ntohs(src->length) - (sizeof(struct ofp_match) -4)); error = oxm_pull_match(b, m, ntohs(src->length) - (sizeof(struct ofp_match) -4)); m->header.length = ntohs(src->length) - 4; } else { m->header.length = 0; m->header.type = ntohs(src->type); m->match_fields = (struct hmap) HMAP_INITIALIZER(&m->match_fields); } ofpbuf_delete(b); *dst = m; return error; }
#include "ovsdb-parser.h" #include "ovsdb.h" #include "row.h" #include "simap.h" #include "hash.h" #include "table.h" #include "hash.h" #include "timeval.h" #include "transaction.h" #include "jsonrpc-server.h" #include "monitor.h" #include "openvswitch/vlog.h" static const struct ovsdb_replica_class ovsdb_jsonrpc_replica_class; static struct hmap ovsdb_monitors = HMAP_INITIALIZER(&ovsdb_monitors); /* Backend monitor. * * ovsdb_monitor keep track of the ovsdb changes. */ /* A collection of tables being monitored. */ struct ovsdb_monitor { struct ovsdb_replica replica; struct shash tables; /* Holds "struct ovsdb_monitor_table"s. */ struct ovs_list jsonrpc_monitors; /* Contains "jsonrpc_monitor_node"s. */ struct ovsdb *db; uint64_t n_transactions; /* Count number of committed transactions. */ struct hmap_node hmap_node; /* Elements within ovsdb_monitors. */ struct hmap json_cache; /* Contains "ovsdb_monitor_json_cache_node"s.*/
ovsdb_idl_add_column(ovs_idl, &ovsrec_bridge_col_ports); ovsdb_idl_add_table(ovs_idl, &ovsrec_table_port); ovsdb_idl_add_column(ovs_idl, &ovsrec_port_col_name); ovsdb_idl_add_column(ovs_idl, &ovsrec_port_col_interfaces); ovsdb_idl_add_column(ovs_idl, &ovsrec_port_col_external_ids); ovsdb_idl_add_table(ovs_idl, &ovsrec_table_interface); ovsdb_idl_add_column(ovs_idl, &ovsrec_interface_col_name); ovsdb_idl_add_column(ovs_idl, &ovsrec_interface_col_ofport); ovsdb_idl_add_column(ovs_idl, &ovsrec_interface_col_external_ids); } static struct simap localvif_to_ofport = SIMAP_INITIALIZER(&localvif_to_ofport); static struct hmap tunnels = HMAP_INITIALIZER(&tunnels); /* Maps from a chassis to the OpenFlow port number of the tunnel that can be * used to reach that chassis. */ struct chassis_tunnel { struct hmap_node hmap_node; const char *chassis_id; ofp_port_t ofport; enum chassis_tunnel_type type; }; static struct chassis_tunnel * chassis_tunnel_find(const char *chassis_id) { struct chassis_tunnel *tun; HMAP_FOR_EACH_WITH_HASH (tun, hmap_node, hash_string(chassis_id, 0),
#include "list.h" #include "netdev.h" #include "odp-util.h" #include "ofpbuf.h" #include "packets.h" #include "poll-loop.h" #include "seq.h" #include "shash.h" #include "timeval.h" #include "unixctl.h" #include "vlog.h" VLOG_DEFINE_THIS_MODULE(bond); static struct ovs_rwlock rwlock = OVS_RWLOCK_INITIALIZER; static struct hmap all_bonds__ = HMAP_INITIALIZER(&all_bonds__); static struct hmap *const all_bonds OVS_GUARDED_BY(rwlock) = &all_bonds__; /* Bit-mask for hashing a flow down to a bucket. * There are (BOND_MASK + 1) buckets. */ #define BOND_MASK 0xff /* A hash bucket for mapping a flow to a slave. * "struct bond" has an array of (BOND_MASK + 1) of these. */ struct bond_entry { struct bond_slave *slave; /* Assigned slave, NULL if unassigned. */ uint64_t tx_bytes; /* Count of bytes recently transmitted. */ struct list list_node; /* In bond_slave's 'entries' list. */ }; /* A bond slave, that is, one of the links comprising a bond. */
int main(int argc, char *argv[]) { struct unixctl_server *unixctl; bool exiting; int retval; ovs_cmdl_proctitle_init(argc, argv); set_program_name(argv[0]); parse_options(argc, argv); fatal_ignore_sigpipe(); daemonize_start(); retval = unixctl_server_create(NULL, &unixctl); if (retval) { exit(EXIT_FAILURE); } unixctl_command_register("exit", "", 0, 0, ovn_controller_exit, &exiting); daemonize_complete(); ovsrec_init(); sbrec_init(); ofctrl_init(); lflow_init(); /* Connect to OVS OVSDB instance. We do not monitor all tables by * default, so modules must register their interest explicitly. */ struct idl_loop ovs_idl_loop = IDL_LOOP_INITIALIZER( ovsdb_idl_create(ovs_remote, &ovsrec_idl_class, false, true)); ovsdb_idl_add_table(ovs_idl_loop.idl, &ovsrec_table_open_vswitch); ovsdb_idl_add_column(ovs_idl_loop.idl, &ovsrec_open_vswitch_col_external_ids); chassis_register_ovs_idl(ovs_idl_loop.idl); encaps_register_ovs_idl(ovs_idl_loop.idl); binding_register_ovs_idl(ovs_idl_loop.idl); physical_register_ovs_idl(ovs_idl_loop.idl); get_initial_snapshot(ovs_idl_loop.idl); /* Connect to OVN SB database. */ char *ovnsb_remote = get_ovnsb_remote(ovs_idl_loop.idl); struct idl_loop ovnsb_idl_loop = IDL_LOOP_INITIALIZER( ovsdb_idl_create(ovnsb_remote, &sbrec_idl_class, true, true)); get_initial_snapshot(ovnsb_idl_loop.idl); /* Main loop. */ exiting = false; while (!exiting) { struct controller_ctx ctx = { .ovs_idl = ovs_idl_loop.idl, .ovs_idl_txn = idl_loop_run(&ovs_idl_loop), .ovnsb_idl = ovnsb_idl_loop.idl, .ovnsb_idl_txn = idl_loop_run(&ovnsb_idl_loop), }; const struct ovsrec_bridge *br_int = get_br_int(ctx.ovs_idl); const char *chassis_id = get_chassis_id(ctx.ovs_idl); if (chassis_id) { chassis_run(&ctx, chassis_id); encaps_run(&ctx, br_int, chassis_id); binding_run(&ctx, br_int, chassis_id); } if (br_int) { struct hmap flow_table = HMAP_INITIALIZER(&flow_table); lflow_run(&ctx, &flow_table); if (chassis_id) { physical_run(&ctx, br_int, chassis_id, &flow_table); } ofctrl_run(br_int, &flow_table); hmap_destroy(&flow_table); } unixctl_server_run(unixctl); unixctl_server_wait(unixctl); if (exiting) { poll_immediate_wake(); } idl_loop_commit_and_wait(&ovnsb_idl_loop); idl_loop_commit_and_wait(&ovs_idl_loop); if (br_int) { ofctrl_wait(); } poll_block(); } /* It's time to exit. Clean up the databases. */ bool done = false; while (!done) { struct controller_ctx ctx = { .ovs_idl = ovs_idl_loop.idl, .ovs_idl_txn = idl_loop_run(&ovs_idl_loop), .ovnsb_idl = ovnsb_idl_loop.idl, .ovnsb_idl_txn = idl_loop_run(&ovnsb_idl_loop), }; const struct ovsrec_bridge *br_int = get_br_int(ctx.ovs_idl); const char *chassis_id = get_chassis_id(ctx.ovs_idl); /* Run all of the cleanup functions, even if one of them returns false. * We're done if all of them return true. */ done = binding_cleanup(&ctx, chassis_id); done = chassis_cleanup(&ctx, chassis_id) && done; done = encaps_cleanup(&ctx, br_int) && done; if (done) { poll_immediate_wake(); } idl_loop_commit_and_wait(&ovnsb_idl_loop); idl_loop_commit_and_wait(&ovs_idl_loop); poll_block(); } unixctl_server_destroy(unixctl); lflow_destroy(); ofctrl_destroy(); idl_loop_destroy(&ovs_idl_loop); idl_loop_destroy(&ovnsb_idl_loop); free(ovnsb_remote); free(ovs_remote); exit(retval); } static void parse_options(int argc, char *argv[]) { enum { OPT_PEER_CA_CERT = UCHAR_MAX + 1, VLOG_OPTION_ENUMS, DAEMON_OPTION_ENUMS }; static struct option long_options[] = { {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'V'}, VLOG_LONG_OPTIONS, DAEMON_LONG_OPTIONS, STREAM_SSL_LONG_OPTIONS, {"peer-ca-cert", required_argument, NULL, OPT_PEER_CA_CERT}, {NULL, 0, NULL, 0} }; char *short_options = ovs_cmdl_long_options_to_short_options(long_options); for (;;) { int c; c = getopt_long(argc, argv, short_options, long_options, NULL); if (c == -1) { break; } switch (c) { case 'h': usage(); case 'V': ovs_print_version(OFP13_VERSION, OFP13_VERSION); exit(EXIT_SUCCESS); VLOG_OPTION_HANDLERS DAEMON_OPTION_HANDLERS STREAM_SSL_OPTION_HANDLERS case OPT_PEER_CA_CERT: stream_ssl_set_peer_ca_cert_file(optarg); break; case '?': exit(EXIT_FAILURE); default: abort(); } } free(short_options); argc -= optind; argv += optind; if (argc == 0) { ovs_remote = xasprintf("unix:%s/db.sock", ovs_rundir()); } else if (argc == 1) { ovs_remote = xstrdup(argv[0]); } else { VLOG_FATAL("exactly zero or one non-option argument required; " "use --help for usage"); } } static void usage(void) { printf("%s: OVN controller\n" "usage %s [OPTIONS] [OVS-DATABASE]\n" "where OVS-DATABASE is a socket on which the OVS OVSDB server is listening.\n", program_name, program_name); stream_usage("OVS-DATABASE", true, false, false); daemon_usage(); vlog_usage(); printf("\nOther options:\n" " -h, --help display this help message\n" " -V, --version display version information\n"); exit(EXIT_SUCCESS); } static void ovn_controller_exit(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, void *exiting_) { bool *exiting = exiting_; *exiting = true; unixctl_command_reply(conn, NULL); }
#include "openvswitch/util.h" #include "openvswitch/vlog.h" #include "netdev-linux.h" #include "netlink.h" #include "netlink-socket.h" #include "odp-netlink.h" #include "odp-util.h" #include "tc.h" #include "unaligned.h" #include "util.h" VLOG_DEFINE_THIS_MODULE(netdev_tc_offloads); static struct vlog_rate_limit error_rl = VLOG_RATE_LIMIT_INIT(60, 5); static struct hmap ufid_tc = HMAP_INITIALIZER(&ufid_tc); struct netlink_field { int offset; int flower_offset; int size; }; static struct netlink_field set_flower_map[][3] = { [OVS_KEY_ATTR_IPV4] = { { offsetof(struct ovs_key_ipv4, ipv4_src), offsetof(struct tc_flower_key, ipv4.ipv4_src), MEMBER_SIZEOF(struct tc_flower_key, ipv4.ipv4_src) }, { offsetof(struct ovs_key_ipv4, ipv4_dst), offsetof(struct tc_flower_key, ipv4.ipv4_dst),
struct ovsdb_table *table); static struct ovsdb_error *execute_update(struct ovsdb_txn *txn, const struct uuid *row_uuid, struct ovsdb_table *table, struct json *new); /* Maps from db name to sset of table names. */ static struct shash blacklist_tables = SHASH_INITIALIZER(&blacklist_tables); static void blacklist_tables_clear(void); static void blacklist_tables_add(const char *database, const char *table); static bool blacklist_tables_find(const char *database, const char* table); /* Keep track of request IDs of all outstanding OVSDB requests. */ static struct hmap request_ids = HMAP_INITIALIZER(&request_ids); struct request_ids_hmap_node { struct hmap_node hmap; struct json *request_id; struct ovsdb *db; /* associated database */ }; void request_ids_add(const struct json *id, struct ovsdb *db); bool request_ids_lookup_and_free(const struct json *id, struct ovsdb **db); static void request_ids_destroy(void); void request_ids_clear(void); enum ovsdb_replication_state { RPL_S_INIT, RPL_S_DB_REQUESTED, RPL_S_SCHEMA_REQUESTED,
uint16_t dl_type[N_OXM_DL_TYPES]; /* dl_type prerequisites. */ uint8_t nw_proto; /* nw_proto prerequisite, if nonzero. */ bool maskable; /* Writable with OXAST_REG_{MOVE,LOAD}? */ }; /* All the known fields. */ static struct oxm_field oxm_fields[N_OXM_FIELDS] = { #define DEFINE_FIELD(HEADER, DL_TYPES, NW_PROTO, MASKABLE) \ { HMAP_NODE_NULL_INITIALIZER, OFI_OXM_##HEADER, OXM_##HEADER, \ DL_CONVERT DL_TYPES, NW_PROTO, MASKABLE }, #define DL_CONVERT(T1, T2) { CONSTANT_HTONS(T1), CONSTANT_HTONS(T2) } #include "oxm-match.def" }; /* Hash table of 'oxm_fields'. */ static struct hmap all_oxm_fields = HMAP_INITIALIZER(&all_oxm_fields); static void oxm_init(void) { if (hmap_is_empty(&all_oxm_fields)) { int i; for (i = 0; i < N_OXM_FIELDS; i++) { struct oxm_field *f = &oxm_fields[i]; hmap_insert(&all_oxm_fields, &f->hmap_node, hash_int(f->header, 0)); } /* Verify that the header values are unique (duplicate "case" values * cause a compile error). */
/* FH_REF_FILE only. */ char *file_name; /* File name as provided by user. */ enum fh_mode mode; /* File mode. */ const char *encoding; /* File encoding. */ /* FH_REF_FILE and FH_REF_INLINE only. */ size_t record_width; /* Length of fixed-format records. */ size_t tab_width; /* Tab width, 0=do not expand tabs. */ /* FH_REF_DATASET only. */ struct dataset *ds; /* Dataset. */ }; /* All "struct file_handle"s with nonnull 'id' member. */ static struct hmap named_handles = HMAP_INITIALIZER (named_handles); /* Default file handle for DATA LIST, REREAD, REPEATING DATA commands. */ static struct file_handle *default_handle; /* The "file" that reads from BEGIN DATA...END DATA. */ static struct file_handle *inline_file; static struct file_handle *create_handle (const char *id, char *name, enum fh_referent); static void free_handle (struct file_handle *); static void unname_handle (struct file_handle *); /* Hash table of all active locks. */ static struct hmap locks = HMAP_INITIALIZER (locks);
#include <stdio.h> #include <string.h> #include "hmap.h" struct hmap student = HMAP_INITIALIZER(&student); struct nd { struct hmap_node node; const char *key; }; static struct nd nodes[] = { {HMAP_NODE_NULL_INITIALIZER, "1" }, {HMAP_NODE_NULL_INITIALIZER, "b" }, }; int main(int argc, char **argv) { struct hmap *map = malloc(sizeof(*map)); hmap_init(map); struct hmap_node node2 = {1, NULL}; hmap_insert_fast(map, &nodes[0].node, strlen(nodes[0].key)); hmap_insert_fast(map, &nodes[1].node, strlen(nodes[1].key)); struct nd *q; //HMAP_FOR_EACH(q, node, map) { // printf("key= %s",q->key); //} printf("map size %lu, capacity %lu\n", hmap_count(map), hmap_capacity(map)); hmap_destroy(map);
#include <nbee/nbee.h> #include <netinet/in.h> #include "nbee_link.h" #include "../lib/bj_hash.h" #include "../include/openflow/match-ext.h" nbPacketDecoder *Decoder; nbPacketDecoderVars* PacketDecoderVars; nbNetPDLLinkLayer_t LinkLayerType; nbPDMLReader *PDMLReader; int PacketCounter= 1; struct pcap_pkthdr * pkhdr; static struct hmap all_packet_fields = HMAP_INITIALIZER(&all_packet_fields); extern "C" int nbee_link_initialize() { char ErrBuf[ERRBUF_SIZE + 1]; int NetPDLProtoDBFlags = nbPROTODB_FULL; int NetPDLDecoderFlags = nbDECODER_GENERATEPDML_COMPLETE; int ShowNetworkNames = 0; char* NetPDLFileName = "customnetpdl.xml"; pkhdr = new struct pcap_pkthdr; if (nbIsInitialized() == nbFAILURE) {
struct ovs_list cores; /* List of cpu cores on the numa node. */ int numa_id; /* numa node id. */ }; /* Cpu core on a numa node. */ struct cpu_core { struct hmap_node hmap_node;/* In the 'all_cpu_cores'. */ struct ovs_list list_node; /* In 'numa_node->cores' list. */ struct numa_node *numa; /* numa node containing the core. */ unsigned core_id; /* Core id. */ bool available; /* If the core can be pinned. */ bool pinned; /* If a thread has been pinned to the core. */ }; /* Contains all 'struct numa_node's. */ static struct hmap all_numa_nodes = HMAP_INITIALIZER(&all_numa_nodes); /* Contains all 'struct cpu_core's. */ static struct hmap all_cpu_cores = HMAP_INITIALIZER(&all_cpu_cores); /* True if numa node and core info are correctly extracted. */ static bool found_numa_and_core; /* True if the module was initialized with dummy options. In this case, the * module must not interact with the actual cpus/nodes in the system. */ static bool dummy_numa = false; /* If 'dummy_numa' is true, contains a copy of the dummy numa configuration * parameter */ static char *dummy_config; static struct numa_node *get_numa_by_numa_id(int numa_id); #ifdef __linux__ /* Returns true if 'str' contains all digits. Returns false otherwise. */