diff options
Diffstat (limited to 'src/vnet/lisp-cp/lisp_msg_serdes.c')
-rw-r--r-- | src/vnet/lisp-cp/lisp_msg_serdes.c | 381 |
1 files changed, 0 insertions, 381 deletions
diff --git a/src/vnet/lisp-cp/lisp_msg_serdes.c b/src/vnet/lisp-cp/lisp_msg_serdes.c deleted file mode 100644 index 90afb10b68b..00000000000 --- a/src/vnet/lisp-cp/lisp_msg_serdes.c +++ /dev/null @@ -1,381 +0,0 @@ -/* - * Copyright (c) 2016 Cisco and/or its affiliates. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <vnet/lisp-cp/lisp_msg_serdes.h> -#include <vnet/lisp-cp/packets.h> -#include <vppinfra/time.h> - -void *lisp_msg_put_gid (vlib_buffer_t * b, gid_address_t * gid); - -static void -lisp_msg_put_locators (vlib_buffer_t * b, locator_t * locators) -{ - locator_t *loc; - - vec_foreach (loc, locators) - { - u8 *p = vlib_buffer_put_uninit (b, sizeof (locator_hdr_t)); - clib_memset (p, 0, sizeof (locator_hdr_t)); - LOC_PRIORITY (p) = loc->priority; - LOC_MPRIORITY (p) = loc->mpriority; - LOC_WEIGHT (p) = loc->weight; - LOC_MWEIGHT (p) = loc->mweight; - LOC_LOCAL (p) = loc->local; - LOC_PROBED (p) = loc->probed ? 1 : 0; - LOC_REACHABLE (p) = loc->state ? 1 : 0; - lisp_msg_put_gid (b, &loc->address); - } -} - -static void -lisp_msg_put_mapping_record (vlib_buffer_t * b, mapping_t * record) -{ - mapping_record_hdr_t *p = - vlib_buffer_put_uninit (b, sizeof (mapping_record_hdr_t)); - gid_address_t *eid = &record->eid; - - clib_memset (p, 0, sizeof (*p)); - MAP_REC_EID_PLEN (p) = gid_address_len (eid); - MAP_REC_TTL (p) = clib_host_to_net_u32 (MAP_REGISTER_DEFAULT_TTL); - MAP_REC_AUTH (p) = record->authoritative ? 1 : 0; - MAP_REC_LOC_COUNT (p) = vec_len (record->locators); - - lisp_msg_put_gid (b, eid); - lisp_msg_put_locators (b, record->locators); -} - -static void -lisp_msg_put_mreg_records (vlib_buffer_t * b, mapping_t * records) -{ - u32 i; - for (i = 0; i < vec_len (records); i++) - lisp_msg_put_mapping_record (b, &records[i]); -} - -void * -lisp_msg_put_gid (vlib_buffer_t * b, gid_address_t * gid) -{ - u8 *p = 0; - if (!gid) - { - /* insert only src-eid-afi field set to 0 */ - p = vlib_buffer_put_uninit (b, sizeof (u16)); - *(u16 *) p = 0; - } - else - { - p = vlib_buffer_put_uninit (b, gid_address_size_to_put (gid)); - gid_address_put (p, gid); - } - return p; -} - -static void * -lisp_msg_put_itr_rlocs (lisp_cp_main_t * lcm, vlib_buffer_t * b, - gid_address_t * rlocs, u8 * locs_put) -{ - u8 *bp, count = 0; - u32 i; - - bp = vlib_buffer_get_current (b); - for (i = 0; i < vec_len (rlocs); i++) - { - lisp_msg_put_gid (b, &rlocs[i]); - count++; - } - - *locs_put = count - 1; - return bp; -} - -void * -lisp_msg_put_eid_rec (vlib_buffer_t * b, gid_address_t * eid) -{ - eid_record_hdr_t *h = vlib_buffer_put_uninit (b, sizeof (*h)); - - clib_memset (h, 0, sizeof (*h)); - EID_REC_MLEN (h) = gid_address_len (eid); - lisp_msg_put_gid (b, eid); - return h; -} - -u64 -nonce_build (u32 seed) -{ - u64 nonce; - u32 nonce_lower; - u32 nonce_upper; - struct timespec ts; - - /* Put nanosecond clock in lower 32-bits and put an XOR of the nanosecond - * clock with the second clock in the upper 32-bits. */ - syscall (SYS_clock_gettime, CLOCK_REALTIME, &ts); - nonce_lower = ts.tv_nsec; - nonce_upper = ts.tv_sec ^ clib_host_to_net_u32 (nonce_lower); - - /* OR in a caller provided seed to the low-order 32-bits. */ - nonce_lower |= seed; - - /* Return 64-bit nonce. */ - nonce = nonce_upper; - nonce = (nonce << 32) | nonce_lower; - return nonce; -} - -void * -lisp_msg_put_map_reply (vlib_buffer_t * b, mapping_t * records, u64 nonce, - u8 probe_bit) -{ - map_reply_hdr_t *h = vlib_buffer_put_uninit (b, sizeof (h[0])); - - clib_memset (h, 0, sizeof (h[0])); - MREP_TYPE (h) = LISP_MAP_REPLY; - MREP_NONCE (h) = nonce; - MREP_REC_COUNT (h) = 1; - MREP_RLOC_PROBE (h) = probe_bit; - - lisp_msg_put_mreg_records (b, records); - return h; -} - -void * -lisp_msg_put_map_register (vlib_buffer_t * b, mapping_t * records, - u8 want_map_notify, u16 auth_data_len, u64 * nonce, - u32 * msg_len) -{ - u8 *auth_data = 0; - - /* Basic header init */ - map_register_hdr_t *h = vlib_buffer_put_uninit (b, sizeof (h[0])); - - clib_memset (h, 0, sizeof (h[0])); - MREG_TYPE (h) = LISP_MAP_REGISTER; - MREG_NONCE (h) = nonce_build (0); - MREG_WANT_MAP_NOTIFY (h) = want_map_notify ? 1 : 0; - MREG_REC_COUNT (h) = vec_len (records); - - auth_data = vlib_buffer_put_uninit (b, auth_data_len); - clib_memset (auth_data, 0, auth_data_len); - - /* Put map register records */ - lisp_msg_put_mreg_records (b, records); - - nonce[0] = MREG_NONCE (h); - msg_len[0] = vlib_buffer_get_tail (b) - (u8 *) h; - return h; -} - -void * -lisp_msg_put_mreq (lisp_cp_main_t * lcm, vlib_buffer_t * b, - gid_address_t * seid, gid_address_t * deid, - gid_address_t * rlocs, u8 is_smr_invoked, - u8 rloc_probe_set, u64 * nonce) -{ - u8 loc_count = 0; - - /* Basic header init */ - map_request_hdr_t *h = vlib_buffer_put_uninit (b, sizeof (h[0])); - - clib_memset (h, 0, sizeof (h[0])); - MREQ_TYPE (h) = LISP_MAP_REQUEST; - MREQ_NONCE (h) = nonce_build (0); - MREQ_SMR_INVOKED (h) = is_smr_invoked ? 1 : 0; - MREQ_RLOC_PROBE (h) = rloc_probe_set ? 1 : 0; - - /* We're adding one eid record */ - increment_record_count (h); - - /* Fill source eid */ - lisp_msg_put_gid (b, seid); - - /* Put itr rlocs */ - lisp_msg_put_itr_rlocs (lcm, b, rlocs, &loc_count); - MREQ_ITR_RLOC_COUNT (h) = loc_count; - - /* Put eid record */ - lisp_msg_put_eid_rec (b, deid); - - nonce[0] = MREQ_NONCE (h); - return h; -} - -void * -lisp_msg_push_ecm (vlib_main_t * vm, vlib_buffer_t * b, int lp, int rp, - gid_address_t * la, gid_address_t * ra) -{ - ecm_hdr_t *h; - ip_address_t _src_ip, *src_ip = &_src_ip, _dst_ip, *dst_ip = &_dst_ip; - if (gid_address_type (la) != GID_ADDR_IP_PREFIX) - { - /* empty ip4 */ - clib_memset (src_ip, 0, sizeof (src_ip[0])); - clib_memset (dst_ip, 0, sizeof (dst_ip[0])); - } - else - { - src_ip = &gid_address_ip (la); - dst_ip = &gid_address_ip (ra); - } - - /* Push inner ip and udp */ - pkt_push_udp_and_ip (vm, b, lp, rp, src_ip, dst_ip, 0); - - /* Push lisp ecm hdr */ - h = pkt_push_ecm_hdr (b); - - return h; -} - -static u32 -msg_type_to_hdr_len (lisp_msg_type_e type) -{ - switch (type) - { - case LISP_MAP_REQUEST: - return (sizeof (map_request_hdr_t)); - case LISP_MAP_REPLY: - return (sizeof (map_reply_hdr_t)); - default: - return (0); - } -} - -void * -lisp_msg_pull_hdr (vlib_buffer_t * b, lisp_msg_type_e type) -{ - return vlib_buffer_pull (b, msg_type_to_hdr_len (type)); -} - -u32 -lisp_msg_parse_addr (vlib_buffer_t * b, gid_address_t * eid) -{ - u32 len; - clib_memset (eid, 0, sizeof (*eid)); - len = gid_address_parse (vlib_buffer_get_current (b), eid); - if (len != ~0) - vlib_buffer_pull (b, len); - return len; -} - -u32 -lisp_msg_parse_eid_rec (vlib_buffer_t * b, gid_address_t * eid) -{ - eid_record_hdr_t *h = vlib_buffer_get_current (b); - u32 len; - clib_memset (eid, 0, sizeof (*eid)); - len = gid_address_parse (EID_REC_ADDR (h), eid); - if (len == ~0) - return len; - - gid_address_ippref_len (eid) = EID_REC_MLEN (h); - vlib_buffer_pull (b, len + sizeof (eid_record_hdr_t)); - - return len + sizeof (eid_record_hdr_t); -} - -u32 -lisp_msg_parse_itr_rlocs (vlib_buffer_t * b, gid_address_t ** rlocs, - u8 rloc_count) -{ - gid_address_t tloc; - u32 i, len = 0, tlen = 0; - - //MREQ_ITR_RLOC_COUNT(mreq_hdr) + 1 - for (i = 0; i < rloc_count; i++) - { - len = lisp_msg_parse_addr (b, &tloc); - if (len == ~0) - return len; - vec_add1 (*rlocs, tloc); - tlen += len; - } - return tlen; -} - -u32 -lisp_msg_parse_loc (vlib_buffer_t * b, locator_t * loc) -{ - int len; - - len = locator_parse (vlib_buffer_get_current (b), loc); - if (len == ~0) - return ~0; - - if (!vlib_buffer_has_space (b, sizeof (len))) - return ~0; - vlib_buffer_pull (b, len); - - return len; -} - -u32 -lisp_msg_parse_mapping_record (vlib_buffer_t * b, gid_address_t * eid, - locator_t ** locs, locator_t * probed_) -{ - void *h = 0, *loc_hdr = 0; - locator_t loc, *probed = 0; - int i = 0, len = 0, llen = 0; - - h = vlib_buffer_get_current (b); - if (!vlib_buffer_has_space (b, sizeof (mapping_record_hdr_t))) - return ~0; - - vlib_buffer_pull (b, sizeof (mapping_record_hdr_t)); - - clib_memset (eid, 0, sizeof (*eid)); - len = gid_address_parse (vlib_buffer_get_current (b), eid); - if (len == ~0) - return len; - - if (!vlib_buffer_has_space (b, sizeof (len))) - return ~0; - - vlib_buffer_pull (b, len); - if (GID_ADDR_IP_PREFIX == gid_address_type (eid)) - gid_address_ippref_len (eid) = MAP_REC_EID_PLEN (h); - - for (i = 0; i < MAP_REC_LOC_COUNT (h); i++) - { - loc_hdr = vlib_buffer_get_current (b); - - llen = lisp_msg_parse_loc (b, &loc); - if (llen == ~0) - return llen; - vec_add1 (*locs, loc); - len += llen; - - if (LOC_PROBED (loc_hdr)) - { - if (probed != 0) - clib_warning - ("Multiple locators probed! Probing only the first!"); - else - probed = &loc; - } - } - /* XXX */ - if (probed_ != 0 && probed) - *probed_ = *probed; - - return len + sizeof (map_reply_hdr_t); -} - -/* - * fd.io coding-style-patch-verification: ON - * - * Local Variables: - * eval: (c-set-style "gnu") - * End: - */ |