b0 = vlib_get_buffer (vm, bi0);
b1 = vlib_get_buffer (vm, bi1);
- s0 = (void *) (b0->data + b0->current_data);
- s1 = (void *) (b1->data + b1->current_data);
+ s0 = vlib_buffer_get_current (b0);
+ s1 = vlib_buffer_get_current (b1);
/* Data packets are always assigned to side A (outer ring) interface. */
sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
b0 = vlib_get_buffer (vm, bi0);
- s0 = (void *) (b0->data + b0->current_data);
+ s0 = vlib_buffer_get_current (b0);
/* Data packets are always assigned to side A (outer ring) interface. */
sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
return SRP_ERROR_TOPOLOGY_BAD_LENGTH;
/* Fill in our source MAC address. */
- clib_memcpy (t->ethernet.src_address, hi->hw_address, vec_len (hi->hw_address));
+ clib_memcpy_fast (t->ethernet.src_address, hi->hw_address, vec_len (hi->hw_address));
/* Make space for our MAC binding. */
vec_resize (*contents, sizeof (srp_topology_mac_binding_t));
mb->flags =
((t->srp.is_inner_ring ? SRP_TOPOLOGY_MAC_BINDING_FLAG_IS_INNER_RING : 0)
| (/* is wrapped FIXME */ 0));
- clib_memcpy (mb->address, hi->hw_address, vec_len (hi->hw_address));
+ clib_memcpy_fast (mb->address, hi->hw_address, vec_len (hi->hw_address));
t->control.checksum
= ~ip_csum_fold (ip_incremental_checksum (0, &t->control,
vec_len (*contents) - STRUCT_OFFSET_OF (srp_generic_control_header_t, control)));
{
- vlib_frame_t * f = vlib_get_frame_to_node (vm, hi->output_node_index);
+ vlib_frame_t * f;
vlib_buffer_t * b;
- u32 * to_next = vlib_frame_vector_args (f);
- u32 bi;
-
- bi = vlib_buffer_add_data (vm, VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX,
- /* buffer to append to */ ~0,
- *contents, vec_len (*contents));
+ u32 * to_next;
+ u32 bi = ~0;
+
+ if (vlib_buffer_add_data (vm, /* buffer to append to */ &bi,
+ *contents, vec_len (*contents)))
+ {
+ /* complete or partial buffer allocation failure */
+ if (bi != ~0)
+ vlib_buffer_free (vm, &bi, 1);
+ return SRP_ERROR_CONTROL_PACKETS_PROCESSED;
+ }
b = vlib_get_buffer (vm, bi);
vnet_buffer (b)->sw_if_index[VLIB_RX] = vnet_buffer (b)->sw_if_index[VLIB_TX] = sw_if_index;
+ f = vlib_get_frame_to_node (vm, hi->output_node_index);
+ to_next = vlib_frame_vector_args (f);
to_next[0] = bi;
f->n_vectors = 1;
vlib_put_frame_to_node (vm, hi->output_node_index, f);
b0 = vlib_get_buffer (vm, bi0);
- s0 = (void *) (b0->data + b0->current_data);
+ s0 = vlib_buffer_get_current(b0);
l2_len0 = vlib_buffer_length_in_chain (vm, b0);
l3_len0 = l2_len0 - STRUCT_OFFSET_OF (srp_generic_control_header_t, control);
i->srp.mode = SRP_MODE_control_locally_buffered_for_host;
srp_header_compute_parity (&i->srp);
- clib_memcpy (&i->ethernet.src_address, &si->my_address, sizeof (si->my_address));
+ clib_memcpy_fast (&i->ethernet.src_address, &si->my_address, sizeof (si->my_address));
i->ethernet.type = clib_host_to_net_u16 (ETHERNET_TYPE_SRP_CONTROL);
/* Checksum will be filled in later. */
i->control.type = SRP_CONTROL_PACKET_TYPE_ips;
i->control.ttl = 255;
- clib_memcpy (&i->originator_address, &si->my_address, sizeof (si->my_address));
+ clib_memcpy_fast (&i->originator_address, &si->my_address, sizeof (si->my_address));
}
static void tx_ips_packet (srp_interface_t * si,
vnet_hw_interface_t * hi = vnet_get_hw_interface (vnm, si->rings[tx_ring].hw_if_index);
vlib_frame_t * f;
vlib_buffer_t * b;
- u32 * to_next, bi;
+ u32 * to_next, bi = ~0;
if (! vnet_sw_interface_is_admin_up (vnm, hi->sw_if_index))
return;
= ~ip_csum_fold (ip_incremental_checksum (0, &i->control,
sizeof (i[0]) - STRUCT_OFFSET_OF (srp_ips_header_t, control)));
- bi = vlib_buffer_add_data (vm, VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX,
- /* buffer to append to */ ~0,
- i, sizeof (i[0]));
+ if (vlib_buffer_add_data (vm, /* buffer to append to */ &bi, i,
+ sizeof (i[0])))
+ {
+ /* complete or partial allocation failure */
+ if (bi != ~0)
+ vlib_buffer_free (vm, &bi, 1);
+ return;
+ }
/* FIXME trace. */
if (0)
ASSERT (0);
}
ir->rx_neighbor_address_valid = 1;
- clib_memcpy (ir->rx_neighbor_address, h->originator_address, sizeof (ir->rx_neighbor_address));
+ clib_memcpy_fast (ir->rx_neighbor_address, h->originator_address, sizeof (ir->rx_neighbor_address));
}
switch (si->current_ips_state)
while (1)
{
- pool_foreach (si, sm->interface_pool, ({
+ pool_foreach (si, sm->interface_pool) {
maybe_send_ips_message (si);
- }));
+ }
vlib_process_suspend (vm, 1.0);
}