+ {
+ ip_adjacency_t *adj0 = NULL;
+ adj_index_t ai;
+
+ if (FIB_ENTRY_FLAG_ATTACHED & src_flags)
+ {
+ /*
+ * If the source is attached use the adj from that source.
+ */
+ ai = fib_entry_get_adj (src_fei);
+ if (ADJ_INDEX_INVALID != ai)
+ {
+ adj0 = adj_get (ai);
+ }
+ }
+ else
+ {
+ /*
+ * Get the glean adj from the cover. This is presumably interface
+ * sourced, and therefre needs to be a glean adj.
+ */
+ ai = fib_entry_get_adj_for_source
+ (ip4_fib_table_lookup
+ (ip4_fib_get (fib_index0),
+ &arp0->ip4_over_ethernet[1].ip4, 31),
+ FIB_SOURCE_INTERFACE);
+
+ if (ADJ_INDEX_INVALID != ai)
+ {
+ adj0 = adj_get (ai);
+
+ if (adj0->lookup_next_index == IP_LOOKUP_NEXT_GLEAN)
+ {
+ adj0 = NULL;
+ }
+ }
+ }
+ if (NULL != adj0)
+ {
+ vlib_buffer_advance (p0,
+ -adj0->rewrite_header.data_bytes);
+ }
+ else
+ {
+ error0 = ETHERNET_ARP_ERROR_missing_interface_address;
+ goto drop2;
+ }
+ }