clock: Remember each port's interface index.
We use a hash table to remember the mapping. Since our existing hash table is a simply string hash, we convert the integer index into a decimal string. Although hashing integers in this way is sub-optimal, the table will not be used in a performance critical path. Signed-off-by: Richard Cochran <richardcochran@gmail.com>master
parent
6b99df29e0
commit
e995cf7f52
28
clock.c
28
clock.c
|
@ -31,6 +31,7 @@
|
||||||
#include "clockcheck.h"
|
#include "clockcheck.h"
|
||||||
#include "foreign.h"
|
#include "foreign.h"
|
||||||
#include "filter.h"
|
#include "filter.h"
|
||||||
|
#include "hash.h"
|
||||||
#include "missing.h"
|
#include "missing.h"
|
||||||
#include "msg.h"
|
#include "msg.h"
|
||||||
#include "phc.h"
|
#include "phc.h"
|
||||||
|
@ -38,6 +39,7 @@
|
||||||
#include "servo.h"
|
#include "servo.h"
|
||||||
#include "stats.h"
|
#include "stats.h"
|
||||||
#include "print.h"
|
#include "print.h"
|
||||||
|
#include "sk.h"
|
||||||
#include "tlv.h"
|
#include "tlv.h"
|
||||||
#include "tsproc.h"
|
#include "tsproc.h"
|
||||||
#include "uds.h"
|
#include "uds.h"
|
||||||
|
@ -93,6 +95,7 @@ struct clock {
|
||||||
int pollfd_valid;
|
int pollfd_valid;
|
||||||
int nports; /* does not include the UDS port */
|
int nports; /* does not include the UDS port */
|
||||||
int last_port_number;
|
int last_port_number;
|
||||||
|
struct hash *index2port;
|
||||||
int free_running;
|
int free_running;
|
||||||
int freq_est_interval;
|
int freq_est_interval;
|
||||||
int grand_master_capable; /* for 802.1AS only */
|
int grand_master_capable; /* for 802.1AS only */
|
||||||
|
@ -270,6 +273,7 @@ void clock_destroy(struct clock *c)
|
||||||
}
|
}
|
||||||
port_close(c->uds_port);
|
port_close(c->uds_port);
|
||||||
free(c->pollfd);
|
free(c->pollfd);
|
||||||
|
hash_destroy(c->index2port, NULL);
|
||||||
if (c->clkid != CLOCK_REALTIME) {
|
if (c->clkid != CLOCK_REALTIME) {
|
||||||
phc_close(c->clkid);
|
phc_close(c->clkid);
|
||||||
}
|
}
|
||||||
|
@ -767,6 +771,8 @@ static int clock_add_port(struct clock *c, int phc_index,
|
||||||
struct interface *iface)
|
struct interface *iface)
|
||||||
{
|
{
|
||||||
struct port *p, *piter, *lastp = NULL;
|
struct port *p, *piter, *lastp = NULL;
|
||||||
|
int fd, index;
|
||||||
|
char key[16];
|
||||||
|
|
||||||
if (clock_resize_pollfd(c, c->nports + 1)) {
|
if (clock_resize_pollfd(c, c->nports + 1)) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -786,6 +792,23 @@ static int clock_add_port(struct clock *c, int phc_index,
|
||||||
}
|
}
|
||||||
c->nports++;
|
c->nports++;
|
||||||
clock_fda_changed(c);
|
clock_fda_changed(c);
|
||||||
|
|
||||||
|
/* Remember the index to port mapping, for link status tracking. */
|
||||||
|
fd = sk_interface_fd();
|
||||||
|
if (fd < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
index = sk_interface_index(fd, iface->name);
|
||||||
|
if (index < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
snprintf(key, sizeof(key), "%d", index);
|
||||||
|
if (hash_insert(c->index2port, key, p)) {
|
||||||
|
pr_err("failed to add port with index %d twice!", index);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1087,6 +1110,11 @@ struct clock *clock_create(enum clock_type type, struct config *config,
|
||||||
}
|
}
|
||||||
clock_fda_changed(c);
|
clock_fda_changed(c);
|
||||||
|
|
||||||
|
c->index2port = hash_create();
|
||||||
|
if (!c->index2port) {
|
||||||
|
pr_err("failed create index-to-port hash table");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
/* Create the ports. */
|
/* Create the ports. */
|
||||||
STAILQ_FOREACH(iface, &config->interfaces, list) {
|
STAILQ_FOREACH(iface, &config->interfaces, list) {
|
||||||
if (clock_add_port(c, phc_index, timestamping, iface)) {
|
if (clock_add_port(c, phc_index, timestamping, iface)) {
|
||||||
|
|
Loading…
Reference in New Issue