summaryrefslogtreecommitdiffstats
path: root/v3po
AgeCommit message (Expand)AuthorFilesLines
2016-05-24HONEYCOMB-61: Extend VPP initializers to initialize everything readers provideMaros Marsalek11-57/+286
2016-05-24HONEYCOMB-61: Move VPP initializers to v3po2vppMaros Marsalek14-101/+111
2016-05-24HONEYCOMB-61: Restore configuration and context from persisted filesMaros Marsalek31-281/+886
2016-05-24HONEYCOMB-61: Provide context data in OPERATIONAL readsMaros Marsalek5-10/+101
2016-05-24Add POSTMAN collection to codebaseMaros Marsalek2-0/+576
2016-05-23HONEYCOMB-61: Move vpp context model to v3po-apiMaros Marsalek2-1/+5
2016-05-23HONEYCOMB-61: Add BA broker for context data treeMaros Marsalek87-1012/+1741
2016-05-23HONEYCOMB-61: Add context data treeMaros Marsalek15-23/+371
2016-05-23HONEYCOMB-61: Make InmemoryDataTree module type configurableMaros Marsalek4-24/+34
2016-05-23HONEYCOMB-61: Config persisterMaros Marsalek10-3/+464
2016-05-23Changed JVPP interface for construction and connectivityTibor Sirovatka1-8/+2
2016-05-19HONEYCOMB-48: vlan tag rewrite supportMarek Gradzki6-4/+612
2016-05-19HONEYCOMB-48: sub-interface CRUD supportMarek Gradzki6-0/+566
2016-05-19Bridge domain interconnection read customizerMarek Gradzki2-0/+254
2016-05-19HONEYCOMB-48: added VLAN support to v3po.yangMarek Gradzki1-0/+104
2016-05-19Bump jvpp version to 16.09-SNAPSHOTMaros Marsalek5-5/+5
2016-05-18Fix interface dump cachingMarek Gradzki4-32/+54
2016-05-17Check expected interface type in sub-Interface nodesMaros Marsalek22-120/+285
2016-05-13HONEYCOMB-37: Add unit test for Vxlan tunnel state customizerMaros Marsalek4-3/+145
2016-05-13HONEYCOMG-37 Enable ipv6 addresses for vxlan-tunnelsMaros Marsalek7-98/+136
2016-05-11Remove unused Interface1CustomizerMaros Marsalek1-61/+0
2016-05-11Add proper break statements to abstract readerMaros Marsalek2-2/+5
2016-05-11HONEYCOMB-37: Add Vxlan operational read supportMaros Marsalek2-0/+150
2016-05-11HONEYCOMB-36: vhost user interfaces CRUD supportMaros Marsalek11-35/+661
2016-05-11HONEYCOMG-47: Tap interface CRUD supportMaros Marsalek16-117/+877
2016-05-10Added vhost user interface type to v3po.yangMartin Sunal1-0/+46
2016-05-09HONEYCOMB-37: vxlan CRUD supportMarek Gradzki2-14/+252
2016-05-09Fix L2Customizer log messagesMarek Gradzki1-4/+3
2016-05-09Comment out equality check in AbstractCompositeWriter.updateCurrentMarek Gradzki3-11/+22
2016-05-06Fix physical address parsingMarek Gradzki2-7/+57
2016-05-05HONEYCOMB-10: Porting v3po2vpp to the new Java APIMarek Gradzki56-958/+1846
2016-05-04HONEYCOMB-25: Use java 8 for sources and target JVMMarek Gradzki1-11/+7
2016-04-29Fix compilation problems caused by vxlan_add_del_tunnel definition change in ...Marek Gradzki3-6/+67
2016-04-18HONEYCOMB-38: Add link for md-sal/binding equality fixMaros Marsalek1-1/+1
2016-04-15HONEYCOMB-38: Fix vpp interface customizersMaros Marsalek12-285/+202
2016-04-13HONEYCOMB-9: Remove initial Honeycomb pipelineMaros Marsalek25-2521/+269
2016-04-13HONEYCOMB-9: Disable polling thread for former pipelineMaros Marsalek1-7/+6
2016-04-13HONEYCOMB-8: Fix netconf monitoring operational data provisioningMaros Marsalek14-168/+431
2016-04-12HONEYCOMB-34: Config initializer for ietf-interfacesMarek Gradzki6-46/+338
2016-04-12HONEYCOMB-34: Additional log information for InitializersMaros Marsalek1-4/+4
2016-04-12HONEYCOMB-34: Config tree initialization using binding data brokerMarek Gradzki26-326/+497
2016-04-12HONEYCOMB-34: Config tree initialization using ModifiableDataTree dependencyMarek Gradzki20-287/+678
2016-04-12HONEYCOMB-34: Configurable OperationalDataTree dependencyMarek Gradzki11-27/+177
2016-04-12HONEYCOMB-34: Configurable ConfigDataTree dependencyMarek Gradzki14-112/+207
2016-04-12HONEYCOMB-34: Configurable serializer dependencyMarek Gradzki20-69/+398
2016-04-12HONEYCOMB-34: Initializers. Initial versionMarek Gradzki14-0/+310
2016-04-12HONEYCOMB-8 Set port to 2830 for HC netconf northboundMaros Marsalek1-1/+8
2016-04-12HONEYCOMB-9: Migrate Interface listenerMaros Marsalek43-254/+1878
2016-04-12HONEYCOMB-9: Add InterfaceCustomizer for ietf-interfacesMaros Marsalek8-0/+621
2016-04-12HONEYCOMB-9: Add configuration and wiring for readers and writersMaros Marsalek35-310/+961
sctp")) *proto = TRANSPORT_PROTO_SCTP; else if (unformat (input, "SCTP")) *proto = TRANSPORT_PROTO_SCTP; else if (unformat (input, "tls")) *proto = TRANSPORT_PROTO_TLS; else if (unformat (input, "TLS")) *proto = TRANSPORT_PROTO_TLS; else return 0; return 1; } u32 transport_endpoint_lookup (transport_endpoint_table_t * ht, u8 proto, ip46_address_t * ip, u16 port) { clib_bihash_kv_24_8_t kv; int rv; kv.key[0] = ip->as_u64[0]; kv.key[1] = ip->as_u64[1]; kv.key[2] = (u64) port << 8 | (u64) proto; rv = clib_bihash_search_inline_24_8 (ht, &kv); if (rv == 0) return kv.value; return ENDPOINT_INVALID_INDEX; } void transport_endpoint_table_add (transport_endpoint_table_t * ht, u8 proto, transport_endpoint_t * te, u32 value) { clib_bihash_kv_24_8_t kv; kv.key[0] = te->ip.as_u64[0]; kv.key[1] = te->ip.as_u64[1]; kv.key[2] = (u64) te->port << 8 | (u64) proto; kv.value = value; clib_bihash_add_del_24_8 (ht, &kv, 1); } void transport_endpoint_table_del (transport_endpoint_table_t * ht, u8 proto, transport_endpoint_t * te) { clib_bihash_kv_24_8_t kv; kv.key[0] = te->ip.as_u64[0]; kv.key[1] = te->ip.as_u64[1]; kv.key[2] = (u64) te->port << 8 | (u64) proto; clib_bihash_add_del_24_8 (ht, &kv, 0); } /** * Register transport virtual function table. * * @param transport_proto - transport protocol type (i.e., TCP, UDP ..) * @param vft - virtual function table for transport proto * @param fib_proto - network layer protocol * @param output_node - output node index that session layer will hand off * buffers to, for requested fib proto */ void transport_register_protocol (transport_proto_t transport_proto, const transport_proto_vft_t * vft, fib_protocol_t fib_proto, u32 output_node) { u8 is_ip4 = fib_proto == FIB_PROTOCOL_IP4; vec_validate (tp_vfts, transport_proto); tp_vfts[transport_proto] = *vft; session_register_transport (transport_proto, vft, is_ip4, output_node); } /** * Get transport virtual function table * * @param type - session type (not protocol type) */ transport_proto_vft_t * transport_protocol_get_vft (transport_proto_t transport_proto) { if (transport_proto >= vec_len (tp_vfts)) return 0; return &tp_vfts[transport_proto]; } #define PORT_MASK ((1 << 16)- 1) void transport_endpoint_del (u32 tepi) { clib_spinlock_lock_if_init (&local_endpoints_lock); pool_put_index (local_endpoints, tepi); clib_spinlock_unlock_if_init (&local_endpoints_lock); } always_inline transport_endpoint_t * transport_endpoint_new (void) { transport_endpoint_t *tep; pool_get (local_endpoints, tep); return tep; } void transport_endpoint_cleanup (u8 proto, ip46_address_t * lcl_ip, u16 port) { u32 tepi; transport_endpoint_t *tep; /* Cleanup local endpoint if this was an active connect */ tepi = transport_endpoint_lookup (&local_endpoints_table, proto, lcl_ip, clib_net_to_host_u16 (port)); if (tepi != ENDPOINT_INVALID_INDEX) { tep = pool_elt_at_index (local_endpoints, tepi); transport_endpoint_table_del (&local_endpoints_table, proto, tep); transport_endpoint_del (tepi); } } /** * Allocate local port and add if successful add entry to local endpoint * table to mark the pair as used. */ int transport_alloc_local_port (u8 proto, ip46_address_t * ip) { transport_endpoint_t *tep; u32 tei; u16 min = 1024, max = 65535; /* XXX configurable ? */ int tries, limit; limit = max - min; /* Only support active opens from thread 0 */ ASSERT (vlib_get_thread_index () == 0); /* Search for first free slot */ for (tries = 0; tries < limit; tries++) { u16 port = 0; /* Find a port in the specified range */ while (1) { port = random_u32 (&port_allocator_seed) & PORT_MASK; if (PREDICT_TRUE (port >= min && port < max)) break; } /* Look it up. If not found, we're done */ tei = transport_endpoint_lookup (&local_endpoints_table, proto, ip, port); if (tei == ENDPOINT_INVALID_INDEX) { clib_spinlock_lock_if_init (&local_endpoints_lock); tep = transport_endpoint_new (); clib_memcpy (&tep->ip, ip, sizeof (*ip)); tep->port = port; transport_endpoint_table_add (&local_endpoints_table, proto, tep, tep - local_endpoints); clib_spinlock_unlock_if_init (&local_endpoints_lock); return tep->port; } } return -1; } int transport_alloc_local_endpoint (u8 proto, transport_endpoint_t * rmt, ip46_address_t * lcl_addr, u16 * lcl_port) { fib_prefix_t prefix; fib_node_index_t fei; u32 sw_if_index; int port; /* * Find the local address and allocate port */ /* Find a FIB path to the destination */ clib_memcpy (&prefix.fp_addr, &rmt->ip, sizeof (rmt->ip)); prefix.fp_proto = rmt->is_ip4 ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6; prefix.fp_len = rmt->is_ip4 ? 32 : 128; ASSERT (rmt->fib_index != ENDPOINT_INVALID_INDEX); fei = fib_table_lookup (rmt->fib_index, &prefix); /* Couldn't find route to destination. Bail out. */ if (fei == FIB_NODE_INDEX_INVALID) { clib_warning ("no route to destination"); return -1; } sw_if_index = rmt->sw_if_index; if (sw_if_index == ENDPOINT_INVALID_INDEX) sw_if_index = fib_entry_get_resolving_interface (fei); if (sw_if_index == ENDPOINT_INVALID_INDEX) { clib_warning ("no resolving interface for %U", format_ip46_address, &rmt->ip, (rmt->is_ip4 == 0) + 1); return -1; } memset (lcl_addr, 0, sizeof (*lcl_addr)); if (rmt->is_ip4) { ip4_address_t *ip4; ip4 = ip_interface_get_first_ip (sw_if_index, 1); if (!ip4) { clib_warning ("no routable ip4 address on %U", format_vnet_sw_if_index_name, vnet_get_main (), sw_if_index); return -1; } lcl_addr->ip4.as_u32 = ip4->as_u32; } else { ip6_address_t *ip6; ip6 = ip_interface_get_first_ip (sw_if_index, 0); if (ip6 == 0) { clib_warning ("no routable ip6 addresses on %U", format_vnet_sw_if_index_name, vnet_get_main (), sw_if_index); return -1; } clib_memcpy (&lcl_addr->ip6, ip6, sizeof (*ip6)); } /* Allocate source port */ port = transport_alloc_local_port (proto, lcl_addr); if (port < 1) { clib_warning ("Failed to allocate src port"); return -1; } *lcl_port = port; return 0; } void transport_update_time (f64 time_now, u8 thread_index) { transport_proto_vft_t *vft; vec_foreach (vft, tp_vfts) { if (vft->update_time) (vft->update_time) (time_now, thread_index); } } void transport_enable_disable (vlib_main_t * vm, u8 is_en) { transport_proto_vft_t *vft; vec_foreach (vft, tp_vfts) { if (vft->enable) (vft->enable) (vm, is_en); } } void transport_init (void) { vlib_thread_main_t *vtm = vlib_get_thread_main (); session_manager_main_t *smm = vnet_get_session_manager_main (); u32 num_threads; if (smm->local_endpoints_table_buckets == 0) smm->local_endpoints_table_buckets = 250000; if (smm->local_endpoints_table_memory == 0) smm->local_endpoints_table_memory = 512 << 20; /* Initialize [port-allocator] random number seed */ port_allocator_seed = (u32) clib_cpu_time_now (); clib_bihash_init_24_8 (&local_endpoints_table, "local endpoints table", smm->local_endpoints_table_buckets, smm->local_endpoints_table_memory); num_threads = 1 /* main thread */ + vtm->n_threads; if (num_threads > 1) clib_spinlock_init (&local_endpoints_lock); } /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */