diff options
author | Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> | 2016-01-14 11:43:55 +0200 |
---|---|---|
committer | Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> | 2016-01-15 14:07:10 +0200 |
commit | 4ee0e8cfd06518b0e16ec0d85bc5c6bd91adf2a4 (patch) | |
tree | ebdb89ee3430dbd2b9b4dfea2032919aa2a0491b /platform | |
parent | b5cb2f358fee347e70ea3ab1b1864e1cf74990f2 (diff) |
linux-ks2: pktio: don't allow to start/stop pktio twice
Also don't send and receive packets if it's not allowed.
Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
Diffstat (limited to 'platform')
-rw-r--r-- | platform/linux-keystone2/odp_packet_io.c | 61 |
1 files changed, 41 insertions, 20 deletions
diff --git a/platform/linux-keystone2/odp_packet_io.c b/platform/linux-keystone2/odp_packet_io.c index a0d943f7..9f04e2e2 100644 --- a/platform/linux-keystone2/odp_packet_io.c +++ b/platform/linux-keystone2/odp_packet_io.c @@ -61,7 +61,7 @@ typedef struct pktio_entry_s { char name[ODP_PKTIO_NAME_LEN]; _odp_if_mac_t mac; odp_pmr_t pmr_default; - odp_pktio_param_t *param; + odp_pktio_param_t param; struct list_head pmr_out; uint8_t pmr_out_cnt; @@ -229,7 +229,7 @@ static int pktio_free_cb(void *data) return 0; } -static int pktio_inq_setdef_locked(odp_pktio_t pktio, odp_queue_t queue) +static int pktio_inq_setdef_nolock(odp_pktio_t pktio, odp_queue_t queue) { pktio_entry_t *entry = _odp_pktio_entry(pktio); queue_entry_t *queue_entry = _odp_queue_to_qentry(queue); @@ -263,9 +263,10 @@ static int pktio_inq_setdef_locked(odp_pktio_t pktio, odp_queue_t queue) return 0; } -static int odp_pktio_inq_setdef_raw(odp_pktio_t pktio, odp_queue_t queue) +static int odp_pktio_inq_setdef_raw(pktio_entry_t *pktio_entry, + odp_queue_t queue) { - if (pktio == ODP_PKTIO_INVALID || queue == ODP_QUEUE_INVALID) { + if (queue == ODP_QUEUE_INVALID) { ODP_ERR("Invalid input parameters\n"); return -1; } @@ -275,16 +276,12 @@ static int odp_pktio_inq_setdef_raw(odp_pktio_t pktio, odp_queue_t queue) return -1; } - pktio_entry_t *entry = _odp_pktio_entry(pktio); - - shres_lock(entry); - if (pktio_inq_setdef_locked(pktio, queue) < 0) + if (pktio_inq_setdef_nolock( + _odp_pktio_from_entry(pktio_entry), queue) < 0) goto err; - shres_unlock(entry); return 0; err: - shres_unlock(entry); _queue_put(queue); ODP_ERR("Cannot assign default queue\n"); return -1; @@ -292,6 +289,7 @@ err: int odp_pktio_start(odp_pktio_t id) { + int ret = 0; pktio_entry_t *entry; char name[ODP_QUEUE_NAME_LEN]; odp_queue_t in_queue; @@ -303,6 +301,12 @@ int odp_pktio_start(odp_pktio_t id) entry = _odp_pktio_entry(id); + shres_lock(entry); + if (entry->flags.start) { + shres_unlock(entry); + return -1; + } + /* When pktio is starting and input_queue is not assigned * then create hidden inp_quue to receive packets with * odp_pktio_recv(). If inp_queue or cos_def will be set @@ -311,19 +315,18 @@ int odp_pktio_start(odp_pktio_t id) if (!entry->flags.inp_queue) { snprintf(name, sizeof(name), "%s-pktio_inq", entry->name); in_queue = odp_queue_create(name, ODP_QUEUE_TYPE_PKTIN, NULL); - odp_pktio_inq_setdef_raw(id, in_queue); + ret = odp_pktio_inq_setdef_raw(entry, in_queue); } - shres_lock(entry); entry->flags.start = 1; shres_unlock(entry); - return 0; + return ret; } int odp_pktio_stop(odp_pktio_t id) { - int ret; + int ret = 0; pktio_entry_t *entry; if (id == ODP_PKTIO_INVALID) { @@ -332,8 +335,13 @@ int odp_pktio_stop(odp_pktio_t id) } entry = _odp_pktio_entry(id); - shres_lock(entry); + + if (!entry->flags.start) { + shres_unlock(entry); + return -1; + } + if (!entry->flags.inp_queue && entry->inq_default != ODP_QUEUE_INVALID) ret = pktio_inq_remdef(entry); @@ -345,7 +353,7 @@ int odp_pktio_stop(odp_pktio_t id) } odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t pool, - ODP_UNUSED const odp_pktio_param_t *param) + const odp_pktio_param_t *param) { odp_pktio_t pktio; pktio_entry_t *entry; @@ -396,6 +404,7 @@ odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t pool, pktio = _odp_pktio_from_entry(entry); entry->inq_default = ODP_QUEUE_INVALID; entry->outq_default = ODP_QUEUE_INVALID; + entry->param = *param; entry->port = port; entry->pmr_default = ODP_PMR_INVAL; entry->mac = (loopback) ? loopback_mac(_odp_pktio_id(pktio)) : @@ -545,6 +554,9 @@ int odp_pktio_recv(odp_pktio_t pktio, odp_packet_t pkt_table[], int len) pktio_entry_t *entry = _odp_pktio_entry(pktio); + if (entry->param.in_mode != ODP_PKTIN_MODE_RECV) + return -1; + if (entry->inq_default == ODP_QUEUE_INVALID) { ODP_ERR("inq_default is not set for pktio\n"); return -1; @@ -584,6 +596,12 @@ int odp_pktio_send(odp_pktio_t pktio, odp_packet_t pkt_table[], int len) pktio_entry_t *entry = _odp_pktio_entry(pktio); + if (!entry->flags.start) + return 0; + + if (entry->param.out_mode != ODP_PKTOUT_MODE_SEND) + return -1; + for (pkts = 0; pkts < len; pkts++) { size = _cppi_desc_pkt_len( _odp_pkt_to_cppi_desc(pkt_table[pkts])); @@ -607,12 +625,15 @@ int odp_pktio_inq_setdef(odp_pktio_t pktio, odp_queue_t queue) int ret; pktio_entry_t *entry; - ret = odp_pktio_inq_setdef_raw(pktio, queue); - if (ret) - return ret; - entry = _odp_pktio_entry(pktio); shres_lock(entry); + + ret = odp_pktio_inq_setdef_raw(entry, queue); + if (ret) { + shres_unlock(entry); + return ret; + } + entry->flags.inp_queue = 1; shres_unlock(entry); |