Hi Mike,

On 14:14 Tue 28 Feb     , Mike Heinz wrote:
> I've recently seen two different users on different fabrics make the same
> mistake: They made a syntax error in their opensm.conf file and then couldn't
> figure out why their changes didn't take effect.
> 
> Looking at the code that parses the opensm.conf file, it appears to treat any
> line it cannot parse as a comment and silently passes over it.
> 
> This patch tweaks the parser to use the following work flow:
> 
> 1. Truncate the line at the first '#' character.
> 2. If the result is blank, skip to the next line.
> 3. If the first token in the line can be matched against a known token,
>    process it as usual.
> 4. If the token cannot be matched against a known token, log an error message.
> 
> The result is that if, for example, the user typed "force_link_speed=5" the 
> log
> will read:
> 
> Feb 24 14:57:09 ifs001 OpenSM[17517]: OpenSM 3.3.13
> Feb 24 14:57:09 ifs001 OpenSM[17517]: Entering DISCOVERING state
> Feb 24 14:57:09 ifs001 OpenSM[17517]: Unrecognized token: "force_link_speed=5"
> Feb 24 14:57:09 ifs001 opensm[17517]: Entering MASTER state
> Feb 24 14:57:09 ifs001 opensm[17517]: SUBNET UP
> .
> .
> .
> 
> Signed-off-by: Michael Heinz <[email protected]>
> ---
> diff --git a/opensm/osm_subnet.c b/opensm/osm_subnet.c
> index 1b30e1e..999c567 100644
> --- a/opensm/osm_subnet.c
> +++ b/opensm/osm_subnet.c
> @@ -1264,6 +1264,13 @@ int osm_subn_parse_conf_file(char *file_name, 
> osm_subn_opt_t * p_opts)
>         p_opts->file_opts->file_opts = NULL;
> 
>         while (fgets(line, 1023, opts_file) != NULL) {
> +               char *pound_sign = strchr(line,'#');
> +               int token_matched = 0;
> +
> +               /* Truncate any comments. */
> +               if (pound_sign)
> +                       *pound_sign = '\0';
> +
>                 /* get the first token */
>                 p_key = strtok_r(line, " \t\n", &p_val);
>                 if (!p_key)
> @@ -1275,6 +1282,7 @@ int osm_subn_parse_conf_file(char *file_name, 
> osm_subn_opt_t * p_opts)
>                         if (strcmp(r->name, p_key))
>                                 continue;
> 
> +                       token_matched = 1;
>                         p_field1 = (void *)p_opts->file_opts + r->opt_offset;
>                         p_field2 = (void *)p_opts + r->opt_offset;
>                         /* don't call setup function first time */
> @@ -1282,6 +1290,12 @@ int osm_subn_parse_conf_file(char *file_name, 
> osm_subn_opt_t * p_opts)
>                                     NULL);
>                         break;
>                 }
> +
> +               if (!token_matched) {
> +                       char buf[256];
> +                       snprintf(buf,sizeof(buf),"Unrecognized token: 
> \"%s\"",p_key);
> +                       cl_log_event("OpenSM", CL_LOG_ERROR, buf, NULL, 0);

I think it's better also to print the error to the screen, like "Invalid
Cached Option Value" messages using log_report().

> +               }
>         }
>         fclose(opts_file);
> 
> @@ -1324,6 +1338,13 @@ int osm_subn_rescan_conf_files(IN osm_subn_t * p_subn)
>                               &p_opts->file_opts->qos_rtr_options);
> 
>         while (fgets(line, 1023, opts_file) != NULL) {
> +               char *pound_sign = strchr(line,'#');
> +               int token_matched = 0;
> +
> +               /* Truncate any comments. */
> +               if (pound_sign)
> +                       *pound_sign = '\0';
> +
>                 /* get the first token */
>                 p_key = strtok_r(line, " \t\n", &p_val);
>                 if (!p_key)
> @@ -1332,7 +1353,12 @@ int osm_subn_rescan_conf_files(IN osm_subn_t * p_subn)
>                 p_val = clean_val(p_val);
> 
>                 for (r = opt_tbl; r->name; r++) {
> -                       if (!r->can_update || strcmp(r->name, p_key))
> +                       if (strcmp(r->name, p_key))
> +                               continue;
> +
> +                       token_matched = 1;
> +
> +                       if (!r->can_update)
>                                 continue;
> 
>                         p_field1 = (void *)p_opts->file_opts + r->opt_offset;
> @@ -1341,6 +1367,12 @@ int osm_subn_rescan_conf_files(IN osm_subn_t * p_subn)
>                                     r->setup_fn);
>                         break;
>                 }
> +
> +               if (!token_matched) {
> +                       char buf[256];
> +                       snprintf(buf,sizeof(buf),"Unrecognized token: 
> \"%s\"",p_key);
> +                       cl_log_event("OpenSM", CL_LOG_ERROR, buf, NULL, 0);

Same as above.

> +               }
>         }
>         fclose(opts_file);
> 
> 
> This message and any attached documents contain information from QLogic 
> Corporation or its wholly-owned subsidiaries that may be confidential. If you 
> are not the intended recipient, you may not read, copy, distribute, or use 
> this information. If you have received this transmission in error, please 
> notify the sender immediately by reply e-mail and then delete this message.
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 

-- Alex
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to