aboutsummaryrefslogtreecommitdiffstats
path: root/cicn-plugin/cicn/cicn_parser.c
diff options
context:
space:
mode:
authorJim Gibson <gibson@cisco.com>2017-02-20 11:53:54 -0500
committerJim Gibson <gibson@cisco.com>2017-02-20 12:21:12 -0500
commitdfd7ce27fea04c1a76844e21286c2b1d6653e153 (patch)
tree0025f965ddb68599ea824b9d9edf61b7647dd4ec /cicn-plugin/cicn/cicn_parser.c
parent9b30fc10fb1cbebe651e5a107e8ca5b24de54675 (diff)
Initial Commit: VPP cicn VPP plugin
Change-Id: If1b965f0a4b7cfacda8f6caf6925072a9007ffb4 Signed-off-by: Jim Gibson <gibson@cisco.com>
Diffstat (limited to 'cicn-plugin/cicn/cicn_parser.c')
-rw-r--r--cicn-plugin/cicn/cicn_parser.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/cicn-plugin/cicn/cicn_parser.c b/cicn-plugin/cicn/cicn_parser.c
new file mode 100644
index 00000000..f9889af4
--- /dev/null
+++ b/cicn-plugin/cicn/cicn_parser.c
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2017 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.
+ */
+/*
+ * cicn_parser.c: Fast-path, vpp-aware ICN packet parser, used in cicn forwarder.
+ */
+
+#include <stdlib.h>
+#include <errno.h>
+#include <assert.h>
+#include <inttypes.h>
+
+#include <vlib/vlib.h>
+
+#include <cicn/cicn.h>
+#include <cicn/cicn_parser.h>
+
+/*
+ * Given name string in ascii /a/b/... format, convert to wire-format
+ * list of components (without wrapper tlv), in obuf.
+ * If is_chunk_name, make last component chunk_type instead of generic type.
+ */
+int
+cicn_parse_name_comps_from_str_generic (uint8_t * obuf, int obuflen,
+ const char *str, int chunk_name,
+ cicn_rd_t * cicn_rd)
+{
+
+ int ux_rc;
+ cicn_rc_e crc = CICN_RC_OK;
+
+ int ret;
+
+ ret =
+ cicn_parse_name_comps_from_str_inline (obuf, obuflen, str, chunk_name);
+
+ if (ret >= 0)
+ {
+ ux_rc = AOK;
+ }
+ else
+ {
+ ux_rc = -ret;
+ switch (ux_rc)
+ {
+ case ENOSPC:
+ crc = CICN_RC_FIB_PFX_SIZE_LIMIT;
+ break;
+ default:
+ break;
+ }
+ }
+
+ cicn_rd_set (cicn_rd, crc, ux_rc);
+ return (ret);
+}
+
+/*
+ * Given name string in ascii /a/b/... format, convert to wire-format
+ * list of components (without wrapper tlv), in obuf.
+ */
+int
+cicn_parse_name_comps_from_str (uint8_t * obuf, int obuflen, const char *str,
+ cicn_rd_t * cicn_rd)
+{
+ int ret;
+
+ ret =
+ cicn_parse_name_comps_from_str_generic (obuf, obuflen, str,
+ 0 /*!chunk_name */ , cicn_rd);
+ return (ret);
+}
+
+/*
+ * Given name string in ascii /a/b/... format, convert to full
+ * wire-format (including wrapper tlv), in obuf.
+ * If is_chunk_name, make last component chunk_type instead of generic type.
+ */
+int
+cicn_parse_name_from_str (uint8_t * obuf, int obuflen, const char *str,
+ int is_chunk_name, cicn_rd_t * cicn_rd)
+{
+ int ret;
+ if (obuflen < CICN_TLV_HDR_LEN)
+ {
+ cicn_rd_set (cicn_rd, CICN_RC_OK, EINVAL);
+ return (-cicn_rd->rd_ux_rc);
+ }
+ C_PUTINT16 (obuf, CICN_TLV_NAME);
+ ret =
+ cicn_parse_name_comps_from_str_generic (obuf + CICN_TLV_HDR_LEN,
+ obuflen - CICN_TLV_HDR_LEN, str,
+ is_chunk_name, cicn_rd);
+ if (ret >= 0)
+ { // length
+ C_PUTINT16 (&obuf[CICN_TLV_TYPE_LEN], ret);
+ ret += CICN_TLV_HDR_LEN;
+ }
+ return (ret);
+}
+