mirror of https://github.com/wb2osz/direwolf.git
				
				
				
			New NOXID option to avoid wasting time to listed station(s)
which understand SABME but not XID.
This commit is contained in:
		
							parent
							
								
									22f645756d
								
							
						
					
					
						commit
						38ab57afa4
					
				
							
								
								
									
										11
									
								
								ax25_link.c
								
								
								
								
							
							
						
						
									
										11
									
								
								ax25_link.c
								
								
								
								
							| 
						 | 
				
			
			@ -6357,7 +6357,18 @@ static void mdl_negotiate_request (ax25_dlsm_t *S)
 | 
			
		|||
	int p = 1;
 | 
			
		||||
	int nopid = 0;
 | 
			
		||||
	packet_t pp;
 | 
			
		||||
	int n;
 | 
			
		||||
 | 
			
		||||
// At least one known [partial] v2.2 implementation understands SABME but not XID.
 | 
			
		||||
// Rather than wasting time, sending XID repeatedly until giving up, we have a workaround.
 | 
			
		||||
// The configuration file can contain a list of stations known not to respond to XID.
 | 
			
		||||
// Obviously this applies only to v2.2 because XID was not part of v2.0.
 | 
			
		||||
 | 
			
		||||
	for (n = 0; n < g_misc_config_p->noxid_count; n++) {
 | 
			
		||||
	  if (strcmp(S->addrs[PEERCALL],g_misc_config_p->noxid_addrs[n]) == 0) {
 | 
			
		||||
	    return;
 | 
			
		||||
	  }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch (S->mdl_state) {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										38
									
								
								config.c
								
								
								
								
							
							
						
						
									
										38
									
								
								config.c
								
								
								
								
							| 
						 | 
				
			
			@ -904,6 +904,8 @@ void config_init (char *fname, struct audio_s *p_audio_config,
 | 
			
		|||
	p_misc_config->maxv22 = AX25_N2_RETRY_DEFAULT / 2;	/* Max SABME before falling back to SABM. */
 | 
			
		||||
	p_misc_config->v20_addrs = NULL;			/* Go directly to v2.0 for stations listed. */
 | 
			
		||||
	p_misc_config->v20_count = 0;
 | 
			
		||||
	p_misc_config->noxid_addrs = NULL;			/* Don't send XID to these stations. */
 | 
			
		||||
	p_misc_config->noxid_count = 0;
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
 * Try to extract options from a file.
 | 
			
		||||
| 
						 | 
				
			
			@ -4796,6 +4798,42 @@ void config_init (char *fname, struct audio_s *p_audio_config,
 | 
			
		|||
	  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * NOXID  address [ address ... ] 	- Stations known not to understand XID.
 | 
			
		||||
 *					  After connecting to these (with v2.2 obviously), don't try using XID commmand.
 | 
			
		||||
 *					  AX.25 for Linux is the one known case so far.
 | 
			
		||||
 *					  Possible to have multiple and they are cummulative.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
	  else if (strcasecmp(t, "NOXID") == 0) {
 | 
			
		||||
 | 
			
		||||
	    t = split(NULL,0);
 | 
			
		||||
	    if (t == NULL) {
 | 
			
		||||
	      text_color_set(DW_COLOR_ERROR);
 | 
			
		||||
	      dw_printf ("Line %d: Missing address(es) for NOXID.\n", line);
 | 
			
		||||
	      continue;
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	    while (t != NULL) {
 | 
			
		||||
	      int const strict = 2;
 | 
			
		||||
	      char call_no_ssid[AX25_MAX_ADDR_LEN];
 | 
			
		||||
	      int ssid, heard;
 | 
			
		||||
 | 
			
		||||
	      if (ax25_parse_addr (AX25_DESTINATION, t, strict, call_no_ssid, &ssid, &heard)) {
 | 
			
		||||
	        p_misc_config->noxid_addrs = (char**)realloc (p_misc_config->noxid_addrs, sizeof(char*) * (p_misc_config->noxid_count + 1));
 | 
			
		||||
	        p_misc_config->noxid_addrs[p_misc_config->noxid_count++] = strdup(t);
 | 
			
		||||
	      }
 | 
			
		||||
	      else {
 | 
			
		||||
	        text_color_set(DW_COLOR_ERROR);
 | 
			
		||||
                dw_printf ("Line %d: Invalid station address for NOXID command.\n", line);
 | 
			
		||||
 | 
			
		||||
	        // continue processing any others following.
 | 
			
		||||
	      }
 | 
			
		||||
	      t = split(NULL,0);
 | 
			
		||||
	    }
 | 
			
		||||
	  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Invalid command.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										7
									
								
								config.h
								
								
								
								
							
							
						
						
									
										7
									
								
								config.h
								
								
								
								
							| 
						 | 
				
			
			@ -111,6 +111,13 @@ struct misc_config_s {
 | 
			
		|||
 | 
			
		||||
	int v20_count;		/* Number of station addresses in array above. */
 | 
			
		||||
 | 
			
		||||
	char **noxid_addrs;	/* Stations known not to understand XID command so don't */
 | 
			
		||||
				/* waste time sending it and eventually giving up. */
 | 
			
		||||
				/* AX.25 for Linux is the one known case, so far, where */
 | 
			
		||||
				/* SABME is implemented but XID is not. */
 | 
			
		||||
 | 
			
		||||
	int noxid_count;	/* Number of station addresses in array above. */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Beacons.
 | 
			
		||||
 			
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue