Commit f08489e8 authored by Tristan Gingold's avatar Tristan Gingold

libwrtd: add 'union wrtd_id' (part 1: library)

parent 6d62d950
......@@ -20,6 +20,14 @@
#define WRTD_ID_NET 0xff
/**
* WRTD identifier.
*/
union wrtd_id {
char c[WRTD_ID_LEN];
uint32_t w[WRTD_ID_LEN/4];
};
/**
* WRTD timestamp format
*/
......@@ -43,7 +51,7 @@ struct wrtd_event {
struct wrtd_tstamp ts;
/** Event id. */
char id[WRTD_ID_LEN];
union wrtd_id id;
/** Sequence number. */
uint32_t seq;
......@@ -52,10 +60,10 @@ struct wrtd_event {
unsigned char flags;
};
inline static unsigned char wrtd_id_hash(const char *id)
inline static unsigned char wrtd_id_hash(union wrtd_id *id)
{
/* This assumes ID is properly padded. */
return id[0] ^ id[3] ^ id[4] ^ id[7];
return id->c[0] ^ id->c[3] ^ id->c[4] ^ id->c[7];
}
#define WRTD_DEST_CPU_LOCAL 0xfe
......@@ -63,11 +71,11 @@ inline static unsigned char wrtd_id_hash(const char *id)
struct wrtd_rule_config {
/* Id of the rule. */
char id[WRTD_ID_LEN];
union wrtd_id id;
char source_id[WRTD_ID_LEN];
union wrtd_id source_id;
char dest_id[WRTD_ID_LEN];
union wrtd_id dest_id;
/* Device destination. */
uint8_t dest_cpu;
......@@ -135,7 +143,7 @@ struct wrtd_alarm {
struct wrtd_message {
unsigned char hw_detect[3]; /* LXI */
unsigned char domain; /* 0 */
unsigned char event_id[WRTD_ID_LEN];
union wrtd_id event_id;
uint32_t seq;
uint32_t ts_sec;
uint32_t ts_ns;
......
......@@ -191,7 +191,7 @@ enum wrtd_status wrtd_attr_get_alarm_count(struct wrtd_dev *wrtd,
res = 0;
for (i = 0; i < wrtd->nbr_alarms; i++)
if (!wrtd_id_null(wrtd->alarms[i].alarm.event.id))
if (!wrtd_id_null(&wrtd->alarms[i].alarm.event.id))
res++;
*value = res;
return WRTD_SUCCESS;
......@@ -509,7 +509,7 @@ enum wrtd_status wrtd_attr_get_rule_count(struct wrtd_dev *wrtd,
res = 0;
for (i = 0; i < wrtd->nbr_rules; i++)
if (!wrtd_id_null(wrtd->rules[i].rule.conf.id))
if (!wrtd_id_null(&wrtd->rules[i].rule.conf.id))
res++;
*value = res;
return WRTD_SUCCESS;
......@@ -538,7 +538,7 @@ enum wrtd_status wrtd_attr_set_rule_source(struct wrtd_dev *wrtd,
status = wrtd_rule_check_disabled(wrtd, idx, __func__);
WRTD_RETURN_IF_ERROR(status);
wrtd_id_copy(wrtd->rules[idx].rule.conf.source_id, src);
wrtd_id_build(&wrtd->rules[idx].rule.conf.source_id, src);
status = wrtd_write_rule(wrtd, idx, __func__);
WRTD_RETURN_IF_ERROR(status);
......@@ -558,7 +558,7 @@ enum wrtd_status wrtd_attr_get_rule_source(struct wrtd_dev *wrtd,
WRTD_RETURN_IF_ERROR(status);
status = wrtd_id_copy_buf(wrtd, dst, buffer_size,
wrtd->rules[idx].rule.conf.source_id,
wrtd->rules[idx].rule.conf.source_id.c,
__func__);
WRTD_RETURN_IF_ERROR(status);
......@@ -581,7 +581,7 @@ enum wrtd_status wrtd_attr_set_rule_destination(struct wrtd_dev *wrtd,
status = wrtd_rule_check_disabled(wrtd, idx, __func__);
WRTD_RETURN_IF_ERROR(status);
wrtd_id_copy(wrtd->rules[idx].rule.conf.dest_id, dst);
wrtd_id_build(&wrtd->rules[idx].rule.conf.dest_id, dst);
status = wrtd_write_rule(wrtd, idx, __func__);
WRTD_RETURN_IF_ERROR(status);
......@@ -601,7 +601,7 @@ enum wrtd_status wrtd_attr_get_rule_destination(struct wrtd_dev *wrtd,
WRTD_RETURN_IF_ERROR(status);
status = wrtd_id_copy_buf(wrtd, dst, buffer_size,
wrtd->rules[idx].rule.conf.dest_id,
wrtd->rules[idx].rule.conf.dest_id.c,
__func__);
WRTD_RETURN_IF_ERROR(status);
......@@ -1064,7 +1064,7 @@ enum wrtd_status wrtd_attr_get_sys_time(struct wrtd_dev *wrtd,
enum wrtd_status wrtd_attr_global(struct wrtd_dev *wrtd,
const char *rep_cap_id)
{
if (!wrtd_id_eq(rep_cap_id, WRTD_GLOBAL_REP_CAP_ID))
if (strcmp(rep_cap_id, WRTD_GLOBAL_REP_CAP_ID))
return wrtd_return_error(wrtd, WRTD_ERROR_ATTR_GLOBAL,
"Global attributes require the "
"global repeated capability ID");
......
......@@ -15,19 +15,24 @@
#include "libwrtd-private.h"
#include "mockturtle/libmockturtle.h"
inline bool wrtd_id_eq(const char *l, const char *r)
bool wrtd_id_str_eq(const union wrtd_id *l, const char *r)
{
return strncmp(l, r, WRTD_ID_LEN) == 0;
return strncmp(l->c, r, WRTD_ID_LEN) == 0;
}
inline bool wrtd_id_null(const char *id)
bool wrtd_id_eq(const union wrtd_id *l, const union wrtd_id *r)
{
return id[0] == 0;
return memcmp(l->c, r->c, WRTD_ID_LEN) == 0;
}
inline void wrtd_id_copy(char *dst, const char *src)
bool wrtd_id_null(const union wrtd_id *id)
{
strncpy(dst, src, WRTD_ID_LEN);
return id->c[0] == 0;
}
void wrtd_id_build(union wrtd_id *dst, const char *src)
{
strncpy(dst->c, src, WRTD_ID_LEN);
}
enum wrtd_status wrtd_id_copy_buf(struct wrtd_dev *wrtd,
......@@ -76,7 +81,7 @@ enum wrtd_status wrtd_validate_id(struct wrtd_dev *wrtd, const char *rep_cap_id,
return WRTD_ERROR_NOT_INITIALIZED;
}
if ((wrtd_id_null(rep_cap_id)) || (strlen(rep_cap_id) > WRTD_ID_LEN))
if (rep_cap_id[0] == 0 || strlen(rep_cap_id) > WRTD_ID_LEN)
return wrtd_return_error
(wrtd, WRTD_ERROR_BADLY_FORMED_SELECTOR,
"%s/%s: Badly-formed selector",
......@@ -563,7 +568,8 @@ enum wrtd_status wrtd_find_alarm(struct wrtd_dev *wrtd,
/* 3. Search it. */
for (i = 0; i < wrtd->nbr_alarms; i++)
if (wrtd_id_eq(wrtd->alarms[i].alarm.event.id, rep_cap_id)) {
if (wrtd_id_str_eq(&wrtd->alarms[i].alarm.event.id,
rep_cap_id)) {
*idx = i;
return WRTD_SUCCESS;
}
......@@ -595,7 +601,7 @@ enum wrtd_status wrtd_find_rule(struct wrtd_dev *wrtd,
/* 3. Search it. */
for (i = 0; i < wrtd->nbr_rules; i++)
if (wrtd_id_eq(wrtd->rules[i].rule.conf.id, rep_cap_id)) {
if (wrtd_id_str_eq(&wrtd->rules[i].rule.conf.id, rep_cap_id)) {
*idx = i;
return WRTD_SUCCESS;
}
......@@ -647,7 +653,7 @@ enum wrtd_status wrtd_find_fw(struct wrtd_dev *wrtd,
/* 3. Search it. */
for (i = 0; i < wrtd->nbr_cpus; i++)
if (wrtd_id_eq(wrtd->roots[i].fw_name, rep_cap_id)) {
if (!strncmp(wrtd->roots[i].fw_name, rep_cap_id, WRTD_ID_LEN)) {
*idx = i;
return WRTD_SUCCESS;
}
......
......@@ -170,9 +170,11 @@ enum wrtd_status wrtd_find_fw(struct wrtd_dev *wrtd,
/* Reconfigure route tables and write-back rules. */
enum wrtd_status wrtd_reconfigure(struct wrtd_dev *wrtd, const char *caller_func);
bool wrtd_id_eq(const char *l, const char *r);
bool wrtd_id_null(const char *id);
void wrtd_id_copy(char *dst, const char *src);
bool wrtd_id_str_eq(const union wrtd_id *l, const char *r);
bool wrtd_id_eq(const union wrtd_id *l, const union wrtd_id *r);
bool wrtd_id_null(const union wrtd_id *id);
void wrtd_id_copy(union wrtd_id *dst, const union wrtd_id *src);
void wrtd_id_build(union wrtd_id *dst, const char *src);
enum wrtd_status wrtd_alarm_check_disabled(struct wrtd_dev *wrtd, unsigned idx,
const char *caller_func);
enum wrtd_status wrtd_rule_check_disabled(struct wrtd_dev *wrtd, unsigned idx,
......
......@@ -81,7 +81,7 @@ static enum wrtd_status wrtd_reconfigure_alloc_map(struct wrtd_dev *wrtd,
/* Fill rules. */
n = 0;
for (i = 0; i < wrtd->nbr_rules; i++) {
if (wrtd_id_null(wrtd->rules[i].rule.conf.id))
if (wrtd_id_null(&wrtd->rules[i].rule.conf.id))
continue;
map->rules[n].rule = &wrtd->rules[i];
map->rules[n].cpu = -1;
......@@ -120,32 +120,33 @@ static enum wrtd_status wrtd_reconfigure_alloc_map(struct wrtd_dev *wrtd,
static enum wrtd_status wrtd_find_channel(struct wrtd_dev *wrtd,
const struct conf_map *map,
const char *id, unsigned int dir,
const union wrtd_id *id,
unsigned int dir,
unsigned *res_dev,
unsigned *res_ch)
{
unsigned i;
unsigned j;
char dev_id[WRTD_ID_LEN];
union wrtd_id dev_id;
for (i = 0; i < map->nbr_devs; i++) {
struct device_map *d = &map->devs[i];
for (j = 0; j < d->nbr_chs; j++) {
memset (dev_id, 0, WRTD_ID_LEN);
dev_id[0] = 'L';
dev_id[1] = 'C';
dev_id[2] = '-';
memset (&dev_id.c, 0, WRTD_ID_LEN);
dev_id.c[0] = 'L';
dev_id.c[1] = 'C';
dev_id.c[2] = '-';
if (d->chs_dir == WRTD_CH_DIR_IN) {
dev_id[3] = 'I';
dev_id[4] = '1' + d->chs_idx + j;
dev_id.c[3] = 'I';
dev_id.c[4] = '1' + d->chs_idx + j;
}
else {
dev_id[3] = 'O';
dev_id[4] = '1' + d->chs_idx + j;
dev_id.c[3] = 'O';
dev_id.c[4] = '1' + d->chs_idx + j;
}
if (d->chs_dir == dir
&& wrtd_id_eq(dev_id, id)) {
&& wrtd_id_eq(&dev_id, id)) {
*res_dev = i;
*res_ch = (d->dev_idx << 4) + j;
return WRTD_SUCCESS;
......@@ -203,15 +204,15 @@ static enum wrtd_status wrtd_reconfigure_place(struct wrtd_dev *wrtd,
continue;
/* Place the rule on the same CPU as the input source. */
status = wrtd_find_channel(wrtd, map, rule->conf.source_id,
status = wrtd_find_channel(wrtd, map, &rule->conf.source_id,
WRTD_CH_DIR_IN, &dev, &ch);
if (status == WRTD_SUCCESS) {
/* Input channel. */
cpu_affinity = map->devs[dev].cpu;
}
else {
status = wrtd_find_alarm(
wrtd, rule->conf.source_id, &ch, caller_func);
status = wrtd_find_alarm(wrtd, rule->conf.source_id.c,
&ch, caller_func);
if (status == WRTD_SUCCESS) {
/* Alarm. */
cpu_affinity = wrtd->alarms[ch].cpu;
......@@ -224,7 +225,7 @@ static enum wrtd_status wrtd_reconfigure_place(struct wrtd_dev *wrtd,
struct wrtd_root *root;
/* Set destination cpu and channel. */
status = wrtd_find_channel(wrtd, map, rule->conf.dest_id,
status = wrtd_find_channel(wrtd, map, &rule->conf.dest_id,
WRTD_CH_DIR_OUT, &dev, &ch);
if (status == WRTD_SUCCESS) {
/* Output device. */
......@@ -321,7 +322,7 @@ static enum wrtd_status wrtd_reconfigure_place(struct wrtd_dev *wrtd,
if (m->cpu != cpu)
continue;
hash = wrtd_id_hash(m->rule->rule.conf.source_id)
hash = wrtd_id_hash(&m->rule->rule.conf.source_id)
% nbr_cpu_rules;
m->global_idx = cpu_offset + hash;
......@@ -411,12 +412,12 @@ static enum wrtd_status wrtd_reconfigure_write(struct wrtd_dev *wrtd,
wrtd->rules = new_rules;
for(i = 0; i < wrtd->nbr_rules; i++) {
if (wrtd_id_null(new_rules[i].rule.conf.id)
&& wrtd_id_null(old_rules[i].rule.conf.id))
if (wrtd_id_null(&new_rules[i].rule.conf.id)
&& wrtd_id_null(&old_rules[i].rule.conf.id))
continue;
if (!old_rules[i].modified &&
(wrtd_id_eq(new_rules[i].rule.conf.id,
old_rules[i].rule.conf.id)))
(wrtd_id_eq(&new_rules[i].rule.conf.id,
&old_rules[i].rule.conf.id)))
continue;
status = wrtd_write_rule(wrtd, i, caller_func);
......
......@@ -1109,7 +1109,7 @@ wrtd_status wrtd_get_next_event_log_entry(wrtd_dev *wrtd,
int ret;
ret = snprintf(sptr, count, "Id:%-16s|Seq:%04d|",
log.event.id, log.event.seq % 10000);
log.event.id.c, log.event.seq % 10000);
if (ret < 0)
return wrtd_return_error(
wrtd, WRTD_ERROR_UNEXPECTED_RESPONSE,
......@@ -1327,12 +1327,13 @@ wrtd_status wrtd_add_alarm(wrtd_dev *wrtd,
/* Find a free slot, check not already used. */
idx = -1;
for (i = 0; i < wrtd->nbr_alarms; i++) {
if (wrtd_id_eq(wrtd->alarms[i].alarm.event.id, rep_cap_id)) {
if (wrtd_id_str_eq(&wrtd->alarms[i].alarm.event.id,
rep_cap_id)) {
return wrtd_return_error(wrtd, WRTD_ERROR_ALARM_EXISTS,
"%s: The alarm already exists",
__func__);
}
if (idx < 0 && wrtd_id_null(wrtd->alarms[i].alarm.event.id))
if (idx < 0 && wrtd_id_null(&wrtd->alarms[i].alarm.event.id))
idx = i;
}
if (idx == -1)
......@@ -1345,7 +1346,7 @@ wrtd_status wrtd_add_alarm(wrtd_dev *wrtd,
alarm = &wrtd->alarms[idx].alarm;
/* That should be the default, but... */
memset(alarm, 0, sizeof(struct wrtd_alarm));
wrtd_id_copy(alarm->event.id, rep_cap_id);
wrtd_id_build(&alarm->event.id, rep_cap_id);
/* Write-back. */
status = wrtd_write_alarm(wrtd, idx, __func__);
......@@ -1509,12 +1510,12 @@ wrtd_status wrtd_get_alarm_name(wrtd_dev *wrtd,
/* Search it. */
for (n = 0, i = 0; i < wrtd->nbr_alarms; i++) {
const char *aid = wrtd->alarms[i].alarm.event.id;
const union wrtd_id *aid = &wrtd->alarms[i].alarm.event.id;
if (wrtd_id_null(aid))
continue;
if (n == index) {
status = wrtd_id_copy_buf
(wrtd, name, name_buffer_size, aid, __func__);
(wrtd, name, name_buffer_size, aid->c, __func__);
WRTD_RETURN_IF_ERROR(status);
return WRTD_SUCCESS;
}
......@@ -1569,13 +1570,13 @@ wrtd_status wrtd_add_rule(wrtd_dev *wrtd,
/* 3. Find a free slot, check not already used. */
idx = -1;
for (i = 0; i < wrtd->nbr_rules; i++) {
if (wrtd_id_eq(wrtd->rules[i].rule.conf.id, rep_cap_id)) {
if (wrtd_id_str_eq(&wrtd->rules[i].rule.conf.id, rep_cap_id)) {
return wrtd_return_error(wrtd, WRTD_ERROR_RULE_EXISTS,
"%s: The rule already exists",
__func__);
}
if (idx < 0
&& wrtd_id_null(wrtd->rules[i].rule.conf.id))
&& wrtd_id_null(&wrtd->rules[i].rule.conf.id))
idx = i;
}
if (idx == -1)
......@@ -1588,7 +1589,7 @@ wrtd_status wrtd_add_rule(wrtd_dev *wrtd,
rule = &wrtd->rules[idx].rule;
/* That should be the default, but... */
memset(rule, 0, sizeof(struct wrtd_rule));
wrtd_id_copy(rule->conf.id, rep_cap_id);
wrtd_id_build(&rule->conf.id, rep_cap_id);
rule->conf.send_late = true;
/* 5. Write-back. */
......@@ -1754,12 +1755,12 @@ wrtd_status wrtd_get_rule_name(wrtd_dev *wrtd,
/* Search it. */
for (n = 0, i = 0; i < wrtd->nbr_rules; i++) {
const char *aid = wrtd->rules[i].rule.conf.id;
const union wrtd_id *aid = &wrtd->rules[i].rule.conf.id;
if (wrtd_id_null(aid))
continue;
if (n == index) {
status = wrtd_id_copy_buf
(wrtd, name, name_buffer_size, aid, __func__);
(wrtd, name, name_buffer_size, aid->c, __func__);
WRTD_RETURN_IF_ERROR(status);
return WRTD_SUCCESS;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment