ptp4l: per-port configure settings
this patch enables the configuration file to define per-port specific configuration options via the use of simple INI style syntax with headings for each port created via [device_name] syntax [ RC - correct scanning of the port string - remove '=' from scan format string ] Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Signed-off-by: Richard Cochran <richardcochran@gmail.com>master
parent
e1d3dc560b
commit
06756e29d2
66
config.c
66
config.c
|
@ -24,16 +24,24 @@
|
|||
|
||||
enum config_section {
|
||||
GLOBAL_SECTION,
|
||||
PORT_SECTION,
|
||||
UNKNOWN_SECTION,
|
||||
};
|
||||
|
||||
static int scan_mode(const char *s, enum config_section *section)
|
||||
static int scan_mode(char *s, enum config_section *section)
|
||||
{
|
||||
if (0 == strcasecmp(s, "[global]\n")) {
|
||||
*section = GLOBAL_SECTION;
|
||||
return 1;
|
||||
} else if (s[0] == '[') {
|
||||
*section = UNKNOWN_SECTION;
|
||||
char c;
|
||||
*section = PORT_SECTION;
|
||||
/* Replace square brackets with white space. */
|
||||
while (0 != (c = *s)) {
|
||||
if (c == '[' || c == ']')
|
||||
*s = ' ';
|
||||
s++;
|
||||
}
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
|
@ -90,6 +98,45 @@ static int scan_pod(const char *s, struct port_defaults *pod)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void scan_port_line(const char *s, struct config *cfg, int p)
|
||||
{
|
||||
char string[1024];
|
||||
|
||||
if (scan_pod(s, &cfg->iface[p].pod)) {
|
||||
|
||||
/* nothing to do here */
|
||||
|
||||
} else if (1 == sscanf(s, " network_transport %1023s", string)) {
|
||||
|
||||
if (0 == strcasecmp("L2", string))
|
||||
|
||||
cfg->iface[p].transport = TRANS_IEEE_802_3;
|
||||
|
||||
else if (0 == strcasecmp("UDPv4", string))
|
||||
|
||||
cfg->iface[p].transport = TRANS_UDP_IPV4;
|
||||
|
||||
else if (0 == strcasecmp("UDPv6", string))
|
||||
|
||||
cfg->iface[p].transport = TRANS_UDP_IPV6;
|
||||
|
||||
} else if (1 == sscanf(s, " delay_mechanism %1023s", string)) {
|
||||
|
||||
if (0 == strcasecmp("Auto", string))
|
||||
|
||||
cfg->iface[p].dm = DM_AUTO;
|
||||
|
||||
else if (0 == strcasecmp("E2E", string))
|
||||
|
||||
cfg->iface[p].dm = DM_E2E;
|
||||
|
||||
else if (0 == strcasecmp("P2P", string))
|
||||
|
||||
cfg->iface[p].dm = DM_P2P;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void scan_global_line(const char *s, struct config *cfg)
|
||||
{
|
||||
double df;
|
||||
|
@ -255,6 +302,7 @@ int config_read(char *name, struct config *cfg)
|
|||
enum config_section current_section = GLOBAL_SECTION;
|
||||
FILE *fp;
|
||||
char line[1024];
|
||||
int current_port;
|
||||
|
||||
fp = fopen(name, "r");
|
||||
|
||||
|
@ -264,13 +312,25 @@ int config_read(char *name, struct config *cfg)
|
|||
}
|
||||
|
||||
while (fgets(line, sizeof(line), fp)) {
|
||||
if (scan_mode(line, ¤t_section))
|
||||
if (scan_mode(line, ¤t_section) ) {
|
||||
if (current_section == PORT_SECTION) {
|
||||
char port[17];
|
||||
if (1 != sscanf(line, " %16s", port)) {
|
||||
current_section = UNKNOWN_SECTION;
|
||||
continue;
|
||||
}
|
||||
current_port = config_create_interface(port, cfg);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
switch(current_section) {
|
||||
case GLOBAL_SECTION:
|
||||
scan_global_line(line, cfg);
|
||||
break;
|
||||
case PORT_SECTION:
|
||||
scan_port_line(line, cfg, current_port);
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue