/* GTP Hub Implementation */ /* (C) 2015 by sysmocom s.f.m.c. GmbH * All Rights Reserved * * gtphub_ext.c -- ext means extern. This file is kept separate so that these * functions can be wrapped for gtphub_test.c. When a function and its callers * are in the same compilational unit, the wrappability may be optimized away. * * Author: Neels Hofmeyr * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ #include #include #include #define __llist_first(head) (((head)->next == (head)) ? NULL : (head)->next) #define llist_first(head, type, entry) llist_entry(__llist_first(head), type, entry) int gtphub_resolve_ggsn_addr(struct gtphub *hub, struct osmo_sockaddr *result, struct gtp_packet_desc *p) { /* TODO This is just hardcodedly returning the first known address. * Should resolve from actual subscriber data. */ struct gtphub_peer *peer = llist_first(&hub->to_ggsns[GTPH_PLANE_CTRL].peers, struct gtphub_peer, entry); if (!peer) return -1; struct gtphub_peer_addr *pa = llist_first(&peer->addresses, struct gtphub_peer_addr, entry); if (!pa) return -1; struct gtphub_peer_port *pp = llist_first(&pa->ports, struct gtphub_peer_port, entry); if (!pp) return -1; *result = pp->sa; return 0; }