Add BSD bridge interface detection
This commit is contained in:
		
							parent
							
								
									00a5ca6022
								
							
						
					
					
						commit
						40dd2b1a6c
					
				
					 1 changed files with 39 additions and 0 deletions
				
			
		
							
								
								
									
										39
									
								
								ethsock.c
									
										
									
									
									
								
							
							
						
						
									
										39
									
								
								ethsock.c
									
										
									
									
									
								
							|  | @ -44,6 +44,13 @@ | |||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #ifdef NMRPFLASH_BSD | ||||
| #include <sys/ioctl.h> | ||||
| #include <netinet/in.h> | ||||
| #include <netinet/if_ether.h> | ||||
| #include <net/if_bridgevar.h> | ||||
| #endif | ||||
| 
 | ||||
| struct ethsock | ||||
| { | ||||
| 	const char *intf; | ||||
|  | @ -155,6 +162,33 @@ static bool set_stp_enabled(const char *intf, bool enabled) | |||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| #else | ||||
| static bool is_bridge(const char *intf) | ||||
| { | ||||
| #ifdef NMRPFLASH_BSD | ||||
| 	struct ifdrv ifd; | ||||
| 	struct ifbropreq ifbop; | ||||
| 	int err, fd = socket(AF_INET, SOCK_DGRAM, 0); | ||||
| 	if (fd < 0) { | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	strncpy(ifd.ifd_name, intf, sizeof(ifd.ifd_name)); | ||||
| 	ifd.ifd_cmd = BRDGPARAM; | ||||
| 	ifd.ifd_data = &ifbop; | ||||
| 	ifd.ifd_len = sizeof(ifbop); | ||||
| 
 | ||||
| 	err = ioctl(fd, SIOCGDRVSPEC, &ifd); | ||||
| 	if (err && verbosity) { | ||||
| 		xperror("ioctl(SIOCGDRVSPEC)"); | ||||
| 	} | ||||
| 
 | ||||
| 	close(fd); | ||||
| 	return !err; | ||||
| #else | ||||
| 	return false; | ||||
| #endif | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| static bool get_intf_info(const char *intf, uint8_t *hwaddr, void *dummy) | ||||
|  | @ -425,6 +459,11 @@ struct ethsock *ethsock_create(const char *intf, uint16_t protocol) | |||
| 			fprintf(stderr, "Warning: failed to disable STP on %s.\n", intf); | ||||
| 		} | ||||
| 	} | ||||
| #else | ||||
| 	if (is_bridge(intf)) { | ||||
| 		fprintf(stderr, "Warning: bridge interfaces are not fully " | ||||
| 				"supported on this platform.\n"); | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| 	return sock; | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue