X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Fpipeline%2Fobj.c;h=467cda5a6daccd1cc7720cf1d7f346d146307861;hb=f8d541da5184c91fdec24f1b4713e79e0f837bde;hp=154d832eda856bb4ff35fd9ef682ecceafa78830;hpb=77a413017c2d22a2be0337c14be523e4675dabdd;p=dpdk.git diff --git a/examples/pipeline/obj.c b/examples/pipeline/obj.c index 154d832eda..467cda5a6d 100644 --- a/examples/pipeline/obj.c +++ b/examples/pipeline/obj.c @@ -4,14 +4,24 @@ #include #include +#include +#ifdef RTE_EXEC_ENV_LINUX +#include +#include +#endif +#include +#include +#include #include #include #include #include +#include #include #include #include +#include #include #include @@ -32,6 +42,11 @@ TAILQ_HEAD(link_list, link); */ TAILQ_HEAD(ring_list, ring); +/* + * tap + */ +TAILQ_HEAD(tap_list, tap); + /* * pipeline */ @@ -45,6 +60,7 @@ struct obj { struct link_list link_list; struct ring_list ring_list; struct pipeline_list pipeline_list; + struct tap_list tap_list; }; /* @@ -421,6 +437,88 @@ ring_find(struct obj *obj, const char *name) return NULL; } +/* + * tap + */ +#define TAP_DEV "/dev/net/tun" + +struct tap * +tap_find(struct obj *obj, const char *name) +{ + struct tap *tap; + + if (!obj || !name) + return NULL; + + TAILQ_FOREACH(tap, &obj->tap_list, node) + if (strcmp(tap->name, name) == 0) + return tap; + + return NULL; +} + +struct tap * +tap_next(struct obj *obj, struct tap *tap) +{ + return (tap == NULL) ? + TAILQ_FIRST(&obj->tap_list) : TAILQ_NEXT(tap, node); +} + +#ifndef RTE_EXEC_ENV_LINUX + +struct tap * +tap_create(struct obj *obj __rte_unused, const char *name __rte_unused) +{ + return NULL; +} + +#else + +struct tap * +tap_create(struct obj *obj, const char *name) +{ + struct tap *tap; + struct ifreq ifr; + int fd, status; + + /* Check input params */ + if ((name == NULL) || + tap_find(obj, name)) + return NULL; + + /* Resource create */ + fd = open(TAP_DEV, O_RDWR | O_NONBLOCK); + if (fd < 0) + return NULL; + + memset(&ifr, 0, sizeof(ifr)); + ifr.ifr_flags = IFF_TAP | IFF_NO_PI; /* No packet information */ + strlcpy(ifr.ifr_name, name, IFNAMSIZ); + + status = ioctl(fd, TUNSETIFF, (void *) &ifr); + if (status < 0) { + close(fd); + return NULL; + } + + /* Node allocation */ + tap = calloc(1, sizeof(struct tap)); + if (tap == NULL) { + close(fd); + return NULL; + } + /* Node fill in */ + strlcpy(tap->name, name, sizeof(tap->name)); + tap->fd = fd; + + /* Node add to list */ + TAILQ_INSERT_TAIL(&obj->tap_list, tap, node); + + return tap; +} + +#endif + /* * pipeline */ @@ -483,6 +581,18 @@ pipeline_create(struct obj *obj, const char *name, int numa_node) if (status) goto error; + status = rte_swx_pipeline_port_in_type_register(p, + "fd", + &rte_swx_port_fd_reader_ops); + if (status) + goto error; + + status = rte_swx_pipeline_port_out_type_register(p, + "fd", + &rte_swx_port_fd_writer_ops); + if (status) + goto error; + status = rte_swx_pipeline_table_type_register(p, "exact", RTE_SWX_TABLE_MATCH_EXACT, @@ -490,6 +600,13 @@ pipeline_create(struct obj *obj, const char *name, int numa_node) if (status) goto error; + status = rte_swx_pipeline_table_type_register(p, + "wildcard", + RTE_SWX_TABLE_MATCH_WILDCARD, + &rte_swx_table_wildcard_match_ops); + if (status) + goto error; + /* Node allocation */ pipeline = calloc(1, sizeof(struct pipeline)); if (pipeline == NULL) @@ -541,6 +658,7 @@ obj_init(void) TAILQ_INIT(&obj->link_list); TAILQ_INIT(&obj->ring_list); TAILQ_INIT(&obj->pipeline_list); + TAILQ_INIT(&obj->tap_list); return obj; }