mirror of
				https://github.com/brmlab/osmo-tetra.git
				synced 2025-10-30 23:14:00 +01:00 
			
		
		
		
	use new GSMTAP api inside libosmocore
This commit is contained in:
		
							parent
							
								
									a22f5923d1
								
							
						
					
					
						commit
						e676ea1300
					
				
					 1 changed files with 8 additions and 61 deletions
				
			
		|  | @ -3,6 +3,7 @@ | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
|  | #include <errno.h> | ||||||
| 
 | 
 | ||||||
| #include <osmocom/core/msgb.h> | #include <osmocom/core/msgb.h> | ||||||
| #include <osmocom/core/gsmtap.h> | #include <osmocom/core/gsmtap.h> | ||||||
|  | @ -12,7 +13,7 @@ | ||||||
| #include "tetra_common.h" | #include "tetra_common.h" | ||||||
| #include "tetra_tdma.h" | #include "tetra_tdma.h" | ||||||
| 
 | 
 | ||||||
| static int gsmtap_fd = -1; | static struct gsmtap_inst *g_gti = NULL; | ||||||
| 
 | 
 | ||||||
| static const uint8_t lchan2gsmtap[] = { | static const uint8_t lchan2gsmtap[] = { | ||||||
| 	[TETRA_LC_SCH_F]	= GSMTAP_TETRA_SCH_F, | 	[TETRA_LC_SCH_F]	= GSMTAP_TETRA_SCH_F, | ||||||
|  | @ -61,74 +62,20 @@ struct msgb *tetra_gsmtap_makemsg(struct tetra_tdma_time *tm, enum tetra_log_cha | ||||||
| 
 | 
 | ||||||
| int tetra_gsmtap_sendmsg(struct msgb *msg) | int tetra_gsmtap_sendmsg(struct msgb *msg) | ||||||
| { | { | ||||||
| 	if (gsmtap_fd != -1) | 	if (g_gti) | ||||||
| 		return write(gsmtap_fd, msg->data, msg->len); | 		return gsmtap_sendmsg(g_gti, msg); | ||||||
| 	else | 	else | ||||||
| 		return 0; | 		return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* this block should move to libosmocore */ |  | ||||||
| 
 |  | ||||||
| #include <sys/types.h> |  | ||||||
| #include <sys/socket.h> |  | ||||||
| #include <netdb.h> |  | ||||||
| #include <errno.h> |  | ||||||
| 
 |  | ||||||
| int gsmtap_init(const char *host, uint16_t port) |  | ||||||
| { |  | ||||||
| 	struct addrinfo hints, *result, *rp; |  | ||||||
| 	int sfd, rc; |  | ||||||
| 	char portbuf[16]; |  | ||||||
| 
 |  | ||||||
| 	if (port == 0) |  | ||||||
| 		port = GSMTAP_UDP_PORT; |  | ||||||
| 	if (host == NULL) |  | ||||||
| 		host = "localhost"; |  | ||||||
| 
 |  | ||||||
| 	sprintf(portbuf, "%u", port); |  | ||||||
| 	memset(&hints, 0, sizeof(struct addrinfo)); |  | ||||||
| 	hints.ai_family = AF_UNSPEC; |  | ||||||
| 	hints.ai_socktype = SOCK_DGRAM; |  | ||||||
| 	hints.ai_flags = 0; |  | ||||||
| 	hints.ai_protocol = IPPROTO_UDP; |  | ||||||
| 
 |  | ||||||
| 	rc = getaddrinfo(host, portbuf, &hints, &result); |  | ||||||
| 	if (rc != 0) { |  | ||||||
| 		perror("getaddrinfo returned NULL"); |  | ||||||
| 		return -EINVAL; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for (rp = result; rp != NULL; rp = rp->ai_next) { |  | ||||||
| 		printf("creating socket %u, %u, %u\n", rp->ai_family, rp->ai_socktype, rp->ai_protocol); |  | ||||||
| 		sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); |  | ||||||
| 		if (sfd == -1) |  | ||||||
| 			continue; |  | ||||||
| 		if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1) |  | ||||||
| 			break; |  | ||||||
| 		close(sfd); |  | ||||||
| 	} |  | ||||||
| 	freeaddrinfo(result); |  | ||||||
| 
 |  | ||||||
| 	if (rp == NULL) { |  | ||||||
| 		perror("unable to bind to socket"); |  | ||||||
| 		return -ENODEV; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/* FIXME: if host == localhost, bind to another socket and discard data */ |  | ||||||
| 
 |  | ||||||
| 	return sfd; |  | ||||||
| } |  | ||||||
| /* end block for libosmocore */ |  | ||||||
| 
 |  | ||||||
| int tetra_gsmtap_init(const char *host, uint16_t port) | int tetra_gsmtap_init(const char *host, uint16_t port) | ||||||
| { | { | ||||||
| 	int fd; | 	int fd; | ||||||
| 
 | 
 | ||||||
| 	fd = gsmtap_init(host, port); | 	g_gti = gsmtap_source_init(host, port, 0); | ||||||
| 	if (fd < 0) | 	if (!g_gti) | ||||||
| 		return fd; | 		return -EINVAL; | ||||||
| 
 | 	gsmtap_source_add_sink(g_gti); | ||||||
| 	gsmtap_fd = fd; |  | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Harald Welte
						Harald Welte