|  | @@ -77,6 +77,7 @@ typedef enum {
 | 
	
		
			
				|  |  |    K_VOTING_DELAY,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    K_KNOWN_FLAGS,
 | 
	
		
			
				|  |  | +  K_PARAMS,
 | 
	
		
			
				|  |  |    K_VOTE_DIGEST,
 | 
	
		
			
				|  |  |    K_CONSENSUS_DIGEST,
 | 
	
		
			
				|  |  |    K_CONSENSUS_METHODS,
 | 
	
	
		
			
				|  | @@ -383,6 +384,7 @@ static token_rule_t networkstatus_token_table[] = {
 | 
	
		
			
				|  |  |    T1("valid-until",            K_VALID_UNTIL,      CONCAT_ARGS, NO_OBJ ),
 | 
	
		
			
				|  |  |    T1("voting-delay",           K_VOTING_DELAY,     GE(2),       NO_OBJ ),
 | 
	
		
			
				|  |  |    T1("known-flags",            K_KNOWN_FLAGS,      ARGS,        NO_OBJ ),
 | 
	
		
			
				|  |  | +  T01("params",                K_PARAMS,           ARGS,        NO_OBJ ),
 | 
	
		
			
				|  |  |    T( "fingerprint",            K_FINGERPRINT,      CONCAT_ARGS, NO_OBJ ),
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    CERTIFICATE_MEMBERS
 | 
	
	
		
			
				|  | @@ -420,6 +422,7 @@ static token_rule_t networkstatus_consensus_token_table[] = {
 | 
	
		
			
				|  |  |    T01("client-versions",     K_CLIENT_VERSIONS, CONCAT_ARGS, NO_OBJ ),
 | 
	
		
			
				|  |  |    T01("server-versions",     K_SERVER_VERSIONS, CONCAT_ARGS, NO_OBJ ),
 | 
	
		
			
				|  |  |    T01("consensus-method",    K_CONSENSUS_METHOD,    EQ(1),   NO_OBJ),
 | 
	
		
			
				|  |  | +  T01("params",                K_PARAMS,           ARGS,        NO_OBJ ),
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    END_OF_TABLE
 | 
	
		
			
				|  |  |  };
 | 
	
	
		
			
				|  | @@ -2310,6 +2313,34 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out,
 | 
	
		
			
				|  |  |      goto err;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  tok = find_opt_by_keyword(tokens, K_PARAMS);
 | 
	
		
			
				|  |  | +  if (tok) {
 | 
	
		
			
				|  |  | +    inorder = 1;
 | 
	
		
			
				|  |  | +    ns->net_params = smartlist_create();
 | 
	
		
			
				|  |  | +    for (i = 0; i < tok->n_args; ++i) {
 | 
	
		
			
				|  |  | +      int ok=0;
 | 
	
		
			
				|  |  | +      char *eq = strchr(tok->args[i], '=');
 | 
	
		
			
				|  |  | +      if (!eq) {
 | 
	
		
			
				|  |  | +        log_warn(LD_DIR, "Bad element '%s' in params", escaped(tok->args[i]));
 | 
	
		
			
				|  |  | +        goto err;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      tor_parse_long(eq+1, 10, INT32_MIN, INT32_MAX, &ok, NULL);
 | 
	
		
			
				|  |  | +      if (!ok) {
 | 
	
		
			
				|  |  | +        log_warn(LD_DIR, "Bad element '%s' in params", escaped(tok->args[i]));
 | 
	
		
			
				|  |  | +        goto err;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      if (i > 0 && strcmp(tok->args[i-1], tok->args[i]) >= 0) {
 | 
	
		
			
				|  |  | +        log_warn(LD_DIR, "%s >= %s", tok->args[i-1], tok->args[i]);
 | 
	
		
			
				|  |  | +        inorder = 0;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      smartlist_add(ns->net_params, tor_strdup(tok->args[i]));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    if (!inorder) {
 | 
	
		
			
				|  |  | +      log_warn(LD_DIR, "params not in order");
 | 
	
		
			
				|  |  | +      goto err;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    ns->voters = smartlist_create();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    SMARTLIST_FOREACH_BEGIN(tokens, directory_token_t *, _tok) {
 |