logging: Switch to using libosmocore logging for all the code
This commit is contained in:
parent
e527ef105f
commit
9c7fd8edc4
|
@ -48,7 +48,7 @@ AC_SUBST(EXEC_LDADD)
|
|||
# Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
AC_HEADER_SYS_WAIT
|
||||
AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h stdint.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h syslog.h unistd.h])
|
||||
AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h stdint.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h unistd.h])
|
||||
|
||||
# Check for if header
|
||||
AC_CHECK_HEADERS([linux/if.h net/if.h])
|
||||
|
|
|
@ -1,48 +0,0 @@
|
|||
# Process this file with autoconf to produce a configure script.
|
||||
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
|
||||
AC_CONFIG_SRCDIR([sgsnemu/cmdline.c])
|
||||
AC_CONFIG_HEADER([config.h])
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_CC
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_AWK
|
||||
AC_PROG_CPP
|
||||
AC_PROG_CXX
|
||||
AC_PROG_RANLIB
|
||||
|
||||
# Checks for libraries.
|
||||
# FIXME: Replace `main' with a function in `-le':
|
||||
AC_CHECK_LIB([e], [main])
|
||||
# FIXME: Replace `main' with a function in `-lgtp':
|
||||
AC_CHECK_LIB([gtp], [main])
|
||||
# FIXME: Replace `main' with a function in `-links':
|
||||
AC_CHECK_LIB([inks], [main])
|
||||
|
||||
# Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
AC_HEADER_SYS_WAIT
|
||||
AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h stdint.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h syslog.h unistd.h])
|
||||
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
AC_TYPE_MODE_T
|
||||
AC_TYPE_SIZE_T
|
||||
AC_HEADER_TIME
|
||||
|
||||
# Checks for library functions.
|
||||
AC_PROG_GCC_TRADITIONAL
|
||||
AC_FUNC_MALLOC
|
||||
AC_FUNC_MEMCMP
|
||||
AC_CHECK_FUNCS([gethostbyname inet_ntoa memset select socket strdup strerror strtol])
|
||||
|
||||
AC_CONFIG_FILES([Makefile
|
||||
doc/Makefile
|
||||
ggsn/Makefile
|
||||
gtp/Makefile
|
||||
intl/Makefile
|
||||
po/Makefile
|
||||
sgsnemu/Makefile
|
||||
src/Makefile
|
||||
tests/Makefile])
|
||||
AC_OUTPUT
|
|
@ -95,9 +95,8 @@ radio access network and the SGSN. When a connection request is
|
|||
received the ggsn will allocate a dynamic IP address for the mobile
|
||||
station, and allow the mobile station to access the Gi
|
||||
interface. Connections are terminated by either the mobile station or
|
||||
the SGSN. Runtime errors are reported using the
|
||||
.B syslogd (8)
|
||||
facility.
|
||||
the SGSN. Runtime errors are reported using the Osmocom logging
|
||||
framework.
|
||||
|
||||
Typically
|
||||
.B ggsn
|
||||
|
@ -219,8 +218,7 @@ billing mechanisms are missing.
|
|||
|
||||
|
||||
.SH "SEE ALSO"
|
||||
.BR sgsnemu (8),
|
||||
.BR syslogd (8)
|
||||
.BR sgsnemu (8)
|
||||
|
||||
.SH NOTES
|
||||
.LP
|
||||
|
|
272
doc/ggsn.8.pl
272
doc/ggsn.8.pl
|
@ -1,272 +0,0 @@
|
|||
|
||||
.\" * OpenGGSN - Gateway GPRS Support Node
|
||||
.\" * Copyright (C) 2002, 2003 Mondru AB.
|
||||
.\" * Polish translation copyright (C) 2004 Marek Żakowicz <mazaczek@users.sourceforge.net>
|
||||
.\" *
|
||||
.\" * The contents of this file may be used under the terms of the GNU
|
||||
.\" * General Public License Version 2, provided that the above copyright
|
||||
.\" * notice and this permission notice is included in all copies or
|
||||
.\" * substantial portions of the software.
|
||||
.\" *
|
||||
.\" * The initial developer of the original code is
|
||||
.\" * Jens Jakobsen <jj@openggsn.org>
|
||||
.\" *
|
||||
.\" * Contributor(s):
|
||||
.\" *
|
||||
.\" * Translation to polish: Marek Zakowicz <mazak@debian.linux.org.pl>
|
||||
.\" Manual page for ggsn
|
||||
.\" SH section heading
|
||||
.\" SS subsection heading
|
||||
.\" LP paragraph
|
||||
.\" IP indented paragraph
|
||||
.\" TP hanging label
|
||||
|
||||
.TH ggsn 8 "Lipiec 2003"
|
||||
.SH NAZWA
|
||||
ggsn \- Węzeł Wspierający Bramy GPRS (ang. Gateway GPRS Support Node).
|
||||
.SH UŻYTKOWANIE
|
||||
.B ggsn
|
||||
\-\-help
|
||||
|
||||
.B ggsn
|
||||
\-\-version
|
||||
|
||||
.B ggsn
|
||||
[
|
||||
.BI \-\-fg
|
||||
] [
|
||||
.BI \-\-debug
|
||||
] [
|
||||
.BI \-\-conf " plik"
|
||||
] [
|
||||
.BI \-\-pidfile " plik"
|
||||
] [
|
||||
.BI \-\-statedir " plik"
|
||||
] [
|
||||
.BI \-\-listen " host"
|
||||
] [
|
||||
.BI \-\-net " sieć"
|
||||
] [
|
||||
.BI \-\-ipup " skrypt"
|
||||
] [
|
||||
.BI \-\-ipdown " skrypt"
|
||||
] [
|
||||
.BI \-\-dynip " sieć"
|
||||
] [
|
||||
.BI \-\-statip " sieć"
|
||||
] [
|
||||
.BI \-\-pcodns1 " host"
|
||||
] [
|
||||
.BI \-\-pcodns2 " host"
|
||||
] [
|
||||
.BI \-\-timelimit " sekundy"
|
||||
]
|
||||
|
||||
.SH OPIS
|
||||
.B ggsn
|
||||
jest częścią projektu
|
||||
.B OpenGGSN
|
||||
i implementuje funkcjonalność węzła wspierającego bramy GPRS.
|
||||
Węzły GGSN są wykorzystywane przez operatorów sieci komórkowych jako interfejsy
|
||||
pomiędzy Internetem i resztą infrastruktury sieci komórkowej.
|
||||
|
||||
Funkcjonalność i protokoły GPRS zostały ustandaryzowane w ramach projektu
|
||||
Third Generation Partnership Project (3GPP). Stosownie do specyfikacji 3GPP,
|
||||
GGSN posiada dwa interfejsy: interfejs Gn/Gp oraz interfejs Gi.
|
||||
|
||||
Interfejs Gn/Gp może być postrzegany jako łącze podrzędne węzła GGSN.
|
||||
Jest on wykorzystywany do komunikacji z Węzłem Dostarczającym Usług GPRS
|
||||
(SGSN), który z kolei jest interfejsem do radiowej sieci dostępowej.
|
||||
Interfejs Gn/Gp wykorzystuje protokół tunelowania GPRS (GTP). Pakiety danych
|
||||
użytkownika (zazwyczaj pakiety IP) są tunelowane za pośrednictwem protokołu GTP,
|
||||
który z kolei wykorzystuje protokół UDP nad IP.
|
||||
|
||||
Drugi z interfejsów może być postrzegany jako łącze nadrzędne,
|
||||
prowadzące z węzła GGSN do zewnętrznej sieci danych.
|
||||
Gi jest najczęściej interfejsem do Internetu.
|
||||
|
||||
.B ggsn
|
||||
wykorzystuje
|
||||
.B sterownik TUN/TAP
|
||||
jako interfejs Gi. Interfejs w sieci tun jest uruchamiany podczas startu
|
||||
.B ggsn.
|
||||
|
||||
.B ggsn
|
||||
odbiera połączenia nadchodzące od urządzeń ruchomych za pośrednictwem
|
||||
sieci radiowej oraz SGSN. Gdy nadchodzi żądanie połączenia, ggsn rezerwuje
|
||||
dla urządzenia ruchomego dynamiczny adres IP i pozwala urządzeniu ruchomemu
|
||||
korzystać z interfejsu Gi. Połączenia mogą być zamykane zarówno przez
|
||||
stacje ruchome, jak i SGSN. Błędy występujące podczas pracy programu
|
||||
są raportowane z wykorzystaniem
|
||||
.B syslogd (8).
|
||||
|
||||
W typowej sytuacji
|
||||
.B ggsn
|
||||
jest uruchamiany na komputerze z dwoma kartami Ethernet - jedną
|
||||
przeznaczoną dla interfejsu Gn/Gp i jedną dla interfejsu Gi.
|
||||
Polityki trasowania i reguły ściany ogniowej powinny być wykorzystane
|
||||
w celu rozdzielenia ruchu Gi od ruchu Gn/Gp.
|
||||
|
||||
.SH OPCJE
|
||||
.TP
|
||||
.BI --help
|
||||
Wyświetla pomoc i na tym kończy wykonanie programu.
|
||||
|
||||
.TP
|
||||
.BI --version
|
||||
Wyświetla pomoc i na tym kończy wykonanie programu.
|
||||
|
||||
.TP
|
||||
.BI --fg
|
||||
Uruchamia na pierwszym planie (domyślnie wyłączone).
|
||||
|
||||
.TP
|
||||
.BI --debug
|
||||
Uruchamia w trybie usuwania błędów (domyślnie wyłączone).
|
||||
|
||||
.TP
|
||||
.BI --conf " plik"
|
||||
Odczytuje konfigurację z
|
||||
.I pliku
|
||||
(domyślnie /etc/ggsn.conf), którego każda linia odpowiada jednej opcji
|
||||
linii poleceń pozbawionej przedrostka '--'. Opcje podane w linii poleceń
|
||||
nadpisują opcje podane w pliku konfiguracyjnym.
|
||||
|
||||
.TP
|
||||
.BI --pidfile " plik"
|
||||
Nazwa
|
||||
.I pliku
|
||||
z identyfikatorem procesu (domyślnie /var/run/ggsn.pid)
|
||||
|
||||
.TP
|
||||
.BI --statedir " ścieżka"
|
||||
.I Ścieżka
|
||||
do katalogu z trwałymi (nie ulotnymi) danymi (domyślnie /var/lib/ggsn/)
|
||||
|
||||
.TP
|
||||
.BI --listen " host"
|
||||
Lokalny adres IP, który zostanie użyty do nasłuchu przez interfejs Gn/Gp.
|
||||
Ta opcja musi zostać podana.
|
||||
Z przyczyn bezpieczeństwa nie może być wykorzystany INADDR_ANY.
|
||||
|
||||
.TP
|
||||
.BI --net " sieć"
|
||||
Adres sieci interfejsu Gi (domyślnie 192.168.0.0/24).
|
||||
Adres sieci jest ustawiany podczas inicjalizacji, gdy
|
||||
.B ggsn
|
||||
uruchamia urządzenie tun dla interfejsu Gi.
|
||||
|
||||
.TP
|
||||
.BI --ipup " skrypt"
|
||||
Skrypt wykonywany po aktywacji interfejsu Gi w sieci tun.
|
||||
Skrypt jest uruchamiany z następującymi parametrami <nazwa urządzenia> <adres ip>.
|
||||
|
||||
.TP
|
||||
.BI --ipdown " skrypt"
|
||||
Skrypt wykonywany po wyłączeniu interfejsu Gi w sieci tun.
|
||||
Skrypt jest uruchamiany z następującymi parametrami <nazwa urządzenia> <adres ip>.
|
||||
|
||||
.TP
|
||||
.BI --dynip " sieć"
|
||||
Pula dynamicznych adresów sieci IP. Określa pulę dynamicznych adresów IP.
|
||||
Jeśli ta opcja zostanie pominięta, ggsn wykorzystuje do dynamicznej rezerwacji
|
||||
adresów IP, adres sieci określony przez opcję
|
||||
.BI --net.
|
||||
|
||||
.TP
|
||||
.BI --pcodns1 " host"
|
||||
Serwer PCO DNS 1 (domyślnie 0.0.0.0). PCO jest akronimem
|
||||
Protocol Configuration Options, co tłumaczy się jako Protokół Opcji
|
||||
Konfiguracyjnych i jest częścią specyfikacji prtokołów GPRS. Jest
|
||||
wykorzystywany do informowania stacji ruchomej o adresie serwera DNS
|
||||
stosowanego do rozwiązywania nazw hostów.
|
||||
|
||||
.TP
|
||||
.BI --pcodns2 " host"
|
||||
Serwer PCO DNS 2 (domyślnie 0.0.0.0). PCO jest akronimem
|
||||
Protocol Configuration Options, co tłumaczy się jako Protokół Opcji
|
||||
Konfiguracyjnych i jest częścią specyfikacji prtokołów GPRS. Jest
|
||||
wykorzystywany do informowania stacji ruchomej o adresie serwera DNS
|
||||
stosowanego do rozwiązywania nazw hostów.
|
||||
|
||||
.TP
|
||||
.BI --timelimit " sekundy"
|
||||
Kończy wykonanie
|
||||
.b ggsn
|
||||
po upływie podanej liczy \fIsekund\fP.
|
||||
Opcja wykorzystywana w celu usuwania błędów.
|
||||
|
||||
|
||||
.SH PLIKI
|
||||
.I /etc/ggsn.conf
|
||||
.RS
|
||||
Plik konfiguracyjny dla
|
||||
.B ggsn.
|
||||
.RE
|
||||
.I /var/run/ggsn.pid
|
||||
.RS
|
||||
Plik zawierający identyfikator procesu.
|
||||
.RE
|
||||
.I /var/lib/ggsn
|
||||
.RS
|
||||
Katalog przechowujący trwałe (nie ulotne) dane.
|
||||
.RE
|
||||
|
||||
.SH BŁĘDY
|
||||
Zgłaszaj błędy na listę śledzenia błędów OpenGGSN
|
||||
.I http://sourceforge.net/projects/ggsn/
|
||||
|
||||
.B ggsn
|
||||
ma bardzo ograniczone wsparcie dla zarządzania.
|
||||
Obecnie zarówno SNMP jak i mechanizmy rozliczania są pominięte.
|
||||
|
||||
.SH "ZOBACZ TAKŻE"
|
||||
.BR sgsnemu (8),
|
||||
.BR syslogd (8)
|
||||
|
||||
.SH UWAGI
|
||||
.LP
|
||||
|
||||
Oprócz długich, udokumentowanych w tym podręczniku, opcji
|
||||
.B ggsn
|
||||
wspiera również pewną liczbą krótkich opcji o tej samej funkcjonalności.
|
||||
Wywołaj
|
||||
.B ggsn --help
|
||||
by uzyskać pełną listę dostępnych opcji.
|
||||
|
||||
Sterownik TUN/TAP jest wymagany dla poprawnego działania
|
||||
.B ggsn.
|
||||
Dla jąder linuksa późniejszych niż 2.4.7 sterownik TUN/TAP jest zawarty w jądrze,
|
||||
chociaż w typowej sytuacji musi być ładowany oddzielnie za pomocą
|
||||
.B modprobe tun.
|
||||
Aby ładować automatycznie należy do pliku
|
||||
.B /etc/modules.conf.
|
||||
dodać linię
|
||||
.B alias char-major-10-200 tun
|
||||
Aby uzyskać informacje o innych platformach zobacz stronę
|
||||
.I http://vtun.sourceforge.net/tun/
|
||||
opisującą jak zainstalować i skonfigurować sterownik tun.
|
||||
|
||||
.B ggsn
|
||||
wykorzystuje protokół tunelowania GPRS (GTP) wyspecyfikowany przez
|
||||
Third Generation Partnership Project (3GPP). Specyfikacje protokołów 3GPP
|
||||
mogą być znalezione na
|
||||
.I http://www.3gpp.org
|
||||
|
||||
.SH COPYRIGHT
|
||||
|
||||
Copyright (C) 2002, 2003 by Mondru AB.
|
||||
|
||||
Zawartość tego pliku może być wykorzystywana stosownie do terminów
|
||||
Ogólnej, Publicznej Licencji (GPL) GNU w wersji 2 dostarczonej wraz
|
||||
z niniejszą uwagą o prawach autorskich zawartą we wszystkich kopiach
|
||||
i istotnych fragmentach oprogramowania.
|
||||
|
||||
.SH AUTORZY
|
||||
Jens Jakobsen <jj@openggsn.org>
|
||||
|
||||
.SH TŁUMACZENIE
|
||||
Polish translation copyright (C) 2004 Marek Żakowicz <mazaczek@users.sourceforge.net>
|
||||
|
||||
Tłumaczenie jest chronione prawami autorskimi.
|
||||
Dozwolone jest korzystanie, rozprowadzanie i modyfikacja na zasadach licencji GNU GPL 2.
|
|
@ -123,9 +123,7 @@ uses the
|
|||
for the local interface. A tun network interface is established for
|
||||
each connection established to the GGSN.
|
||||
|
||||
Runtime errors are reported using the
|
||||
.B syslogd (8)
|
||||
facility.
|
||||
Runtime errors are reported using the Osmocom logging framework.
|
||||
|
||||
|
||||
.SH OPTIONS
|
||||
|
@ -355,8 +353,7 @@ Report all bugs to the OpenGGSN bug tracking list at
|
|||
|
||||
|
||||
.SH "SEE ALSO"
|
||||
.BR ggsn (8),
|
||||
.BR syslog (8)
|
||||
.BR ggsn (8)
|
||||
|
||||
.SH NOTES
|
||||
.LP
|
||||
|
|
407
doc/sgsnemu.8.pl
407
doc/sgsnemu.8.pl
|
@ -1,407 +0,0 @@
|
|||
|
||||
.\" * OpenGGSN - Gateway GPRS Support Node
|
||||
.\" * Copyright (C) 2002, 2003 Mondru AB.
|
||||
.\" * Polish translation copyright (C) 2004 Marek Żakowicz <mazaczek@users.sourceforge.net>
|
||||
.\" *
|
||||
.\" * The contents of this file may be used under the terms of the GNU
|
||||
.\" * General Public License Version 2, provided that the above copyright
|
||||
.\" * notice and this permission notice is included in all copies or
|
||||
.\" * substantial portions of the software.
|
||||
.\" *
|
||||
.\" * The initial developer of the original code is
|
||||
.\" * Jens Jakobsen <jj@openggsn.org>
|
||||
.\" *
|
||||
.\" * Contributor(s):
|
||||
.\" *
|
||||
.\" * Translation to polish: Marek Zakowicz <mazak@debian.linux.org.pl>
|
||||
.\" Manual page for ggsn
|
||||
.\" SH section heading
|
||||
.\" SS subsection heading
|
||||
.\" LP paragraph
|
||||
.\" IP indented paragraph
|
||||
.\" TP hanging label
|
||||
|
||||
.TH sgsnemu 8 "Maj 2004"
|
||||
.SH NAZWA
|
||||
sgsnemu \- Emulator Węzła Dostarczającego Usług GPRS
|
||||
.SH UŻYTKOWANIE
|
||||
.B sgsnemu
|
||||
\-\-help
|
||||
|
||||
.B sgsnemu
|
||||
\-\-version
|
||||
|
||||
.B sgsnemu
|
||||
[
|
||||
.BI \-\-debug
|
||||
] [
|
||||
.BI \-\-conf " plik"
|
||||
] [
|
||||
.BI \-\-pidfile " plik"
|
||||
] [
|
||||
.BI \-\-statedir " plik"
|
||||
] [
|
||||
.BI \-\-dns " host"
|
||||
] [
|
||||
.BI \-\-listen " host"
|
||||
] [
|
||||
.BI \-\-remote " host"
|
||||
] [
|
||||
.BI \-\-contexts " liczba"
|
||||
] [
|
||||
.BI \-\-timelimit " sekundy"
|
||||
] [
|
||||
.BI \-\-gtpversion " wersja"
|
||||
] [
|
||||
.BI \-\-apn " apn"
|
||||
] [
|
||||
.BI \-\-selmode " tryb"
|
||||
] [
|
||||
.BI \-\-imsi " imsi"
|
||||
] [
|
||||
.BI \-\-nsapi " nsapi"
|
||||
] [
|
||||
.BI \-\-msisdn " msisdn"
|
||||
] [
|
||||
.BI \-\-qos " qos"
|
||||
] [
|
||||
.BI \-\-charging " opłata"
|
||||
] [
|
||||
.BI \-\-uid " uid"
|
||||
] [
|
||||
.BI \-\-pwd " pwd"
|
||||
] [
|
||||
.BI \-\-createif
|
||||
] [
|
||||
.BI \-\-net " sieć"
|
||||
] [
|
||||
.BI \-\-defaultroute
|
||||
] [
|
||||
.BI \-\-ipup " skrypt"
|
||||
] [
|
||||
.BI \-\-ipdown " skrypt"
|
||||
] [
|
||||
.BI \-\-pinghost " host"
|
||||
] [
|
||||
.BI \-\-pingrate " liczba"
|
||||
] [
|
||||
.BI \-\-pingsize " liczba"
|
||||
] [
|
||||
.BI \-\-pingcount " liczba"
|
||||
]
|
||||
.SH OPIS
|
||||
.B sgsnemu
|
||||
jest częścią projektu
|
||||
.B OpenGGSN
|
||||
i implementuje emulator węzła dostarczającego usług GPRS (SGSN).
|
||||
Może on być wykorzystywany zarówno do testowania węzłów GGSN,
|
||||
jak rdzenia sieci GRPS, czy połączeń odwiedzających.
|
||||
|
||||
Funkcjonalność i protokoły GPRS zostały ustandaryzowane w ramach projektu
|
||||
Third Generation Partnership Project (3GPP).
|
||||
Według specyfikacji 3GPP, SGSN posiada kilka interfejsów.
|
||||
.B sgsnemu
|
||||
implementuje interfejs Gn/Gp, który jest wykorzystywany w kierunku
|
||||
węzłów GGSN.
|
||||
|
||||
Interfejs Gn/Gp może być postrzegany jako łącze nadrzędne węzła SGSN.
|
||||
Jest ono wykorzystywane do komunikacji z węzłem GGSN, który zazwyczaj jest
|
||||
podłączony do Internetu.
|
||||
Interfejs Gn/Gp wykorzystuje protokół tunelowania GPRS (GTP).
|
||||
Pakiety użytkownika (zazwyczaj pakiety IP) są tunelowane za pośrednictwem protokołu GTP,
|
||||
który z kolei wykorzystuje protokół UDP nad IP.
|
||||
|
||||
|
||||
.B sgsnemu
|
||||
ustanawia pewną liczbę połączeń do GGSN.
|
||||
Wewnętrzny ping transmituje żądania ICMP poprzez już ustanowione połączenia.
|
||||
Alternatywnie, może być utworzony lokalny interfejs sieciowy.
|
||||
W tym przypadku
|
||||
.B sgsnemu
|
||||
przekazuje pakiety pomiędzy lokalnym interfejsem sieciowym i połączeniami
|
||||
ustanowionymi na interfejsie Gn/Gp.
|
||||
|
||||
.B sgsnemu
|
||||
wykorzystuje sterownik
|
||||
.B TUN/TAP
|
||||
jako interfejs lokalny. Interfejs sieci tun jest ustanawiany dla każdego
|
||||
połączenia zestawianego z węzłem GGSN.
|
||||
Błędy występujące podczas pracy programu są raportowane z wykorzystaniem
|
||||
.B syslogd (8).
|
||||
|
||||
.SH OPCJE
|
||||
.TP
|
||||
.BI --help
|
||||
Wyświetla pomoc i na tym kończy wykonanie programu.
|
||||
|
||||
.TP
|
||||
.BI --version
|
||||
Wyświetla pomoc i na tym kończy wykonanie programu.
|
||||
|
||||
.TP
|
||||
.BI --debug
|
||||
Uruchamia w trybie usuwania błędów (domyślnie wyłączone).
|
||||
|
||||
.TP
|
||||
.BI --conf " plik"
|
||||
Odczytuje konfigurację z
|
||||
.I pliku
|
||||
,którego każda linia odpowiada jednej opcji
|
||||
linii poleceń pozbawionej przedrostka '--'. Opcje podane w linii poleceń
|
||||
nadpisują opcje podane w pliku konfiguracyjnym.
|
||||
|
||||
.TP
|
||||
.BI --pidfile " plik"
|
||||
Nazwa
|
||||
.I pliku
|
||||
z identyfikatorem procesu (domyślnie ./sgsnemu.pid)
|
||||
|
||||
.TP
|
||||
.BI --statedir " ścieżka"
|
||||
.I Ścieżka
|
||||
do katalogu z trwałymi (nie ulotnymi) danymi (domyślnie ./)
|
||||
|
||||
.TP
|
||||
.BI --dns " host"
|
||||
Serwer DNS wykorzystywany do zapytań APN.
|
||||
Jeśli parametr został pominięty, wykorzystywana jest domyślna, systemowa konfiguracja DNS.
|
||||
|
||||
.TP
|
||||
.BI --listen " host"
|
||||
Lokalny adres IP, który zostanie użyty do nasłuchu przez interfejs Gn/Gp.
|
||||
Ta opcja musi zostać podana.
|
||||
Z przyczyn bezpieczeństwa nie może być wykorzystany INADDR_ANY.
|
||||
|
||||
.TP
|
||||
.BI --remote " host"
|
||||
.I Host
|
||||
z węzłem GGSN wykorzystywanym do połączeń. Jeśli DNS jest prawidłowo skonfigurowany
|
||||
to powinno być możliwe podanie nazwy punktu dostępowego (APN) jako nazwy zdalnego hosta.
|
||||
|
||||
.TP
|
||||
.BI --contexts " liczba"
|
||||
Liczba ustanawianych kontekstów (domyślnie = 1). W przypadku wielu kontekstów
|
||||
pierwszy kontekst jest ustanawiany z wykorzystaniem imsi + 0 i msidn + 0.
|
||||
Drugi kontekst jest ustanawiany z wykorzystaniem imsi + 1 i msidn +1.
|
||||
Trzeci ...
|
||||
|
||||
.TP
|
||||
.BI --timelimit " sekundy"
|
||||
Kończy wykonanie
|
||||
.b sgsnemu
|
||||
po upływie podanej liczy \fIsekund\fP.
|
||||
W przypadku wykorzystywania opcji ping można zakończyć
|
||||
.B sgsnemu
|
||||
po wyłaniu
|
||||
.B --pingcount
|
||||
pakietów.
|
||||
|
||||
.TP
|
||||
.BI --gtpversion " wersja"
|
||||
.I wersja
|
||||
protokołu GTP wykorzystywana przy ustanawianiu kontekstów (domyślnie = 1).
|
||||
Jeśli nie jest możliwe ustanowienie kontekstu GTPw1
|
||||
.B sgsnemu
|
||||
powtórzy żądanie wykorzystując GTPw0.
|
||||
|
||||
.TP
|
||||
.BI --apn " apn"
|
||||
.I apn
|
||||
wykorzystywany przy łączeniu się z węzłem GGSN (domyślnie = internet).
|
||||
APN jest akronimem angielskich słów Access Point Name.
|
||||
|
||||
.TP
|
||||
.BI --selmode " tryb"
|
||||
Tryb wyboru wykorzystywany w komunikacji z węzłem GGSN (domyślnie = 0x01).
|
||||
Jako tryby wyboru mogą być wykorzystane następujące kody:
|
||||
0: MS lub sieć dostarczana przez APN, subskrypcja zweryfikowana,
|
||||
1: MS dostarczany przez APN, subskrypcja nie zweryfikowana,
|
||||
2: sieć dostarczana przez APN, subskrypcja nie zweryfikowana.
|
||||
|
||||
.TP
|
||||
.BI --imsi " imsi"
|
||||
.I imsi
|
||||
wykorzystywane w komunikacji z węzłem GGSN (domyślnie = 240010123456789).
|
||||
IMSI jest akronimem angielskich słów International Mobile Subscriber Identity.
|
||||
IMSI musi składać się z dokładnie 15 cyfr. Porównaj z opcją
|
||||
.I contexts
|
||||
by zobaczyć wykorzystanie
|
||||
.I imsi
|
||||
w przypadku wielu kontekstów.
|
||||
|
||||
.TP
|
||||
.BI --nsapi " nsapi"
|
||||
.I nsapi
|
||||
wykorzystywane w komunikacji z węzłem GGSN (domyślnie = 0).
|
||||
Wartość musi być pomiędzy 0, a 15.
|
||||
|
||||
.TP
|
||||
.BI --msisdn " msisdn"
|
||||
.I msisdn
|
||||
wykorzystywane w komunikacji z węzłem GGSN (domyślnie = 46702123456).
|
||||
MSISDN jest akronimem angielskich słów International Mobile Integrated Services Digital Network.
|
||||
W istocie jest numerem telefonu zapisanym w międzynarodowym formacie bez wiodących 00 lub 011.
|
||||
Porównaj z opcją
|
||||
.I contexts
|
||||
by zobaczyć wykorzystanie
|
||||
.I msisdn
|
||||
w przypadku wielu kontekstów.
|
||||
|
||||
.TP
|
||||
.BI --qos " qos"
|
||||
.I qos
|
||||
wykorzystywany w komunikacji z węzłem GGSN (domyślnie = 0x0b921f).
|
||||
QoS jest akronimem angielskich słów Quality of Service.
|
||||
Format tego parametru został określony na podstawie specyfikacji 3GPP 09.60.
|
||||
|
||||
.TP
|
||||
.BI --charging " opłata"
|
||||
Charakterystyka rozliczania wykorzystywana w komunikacji z węzłem GGSN
|
||||
(domyślnie = 0x0800). 0x0800 = normalna, 0x0400 = przedpłata,
|
||||
0x0200 = płaska rata, 0x0100 = rozliczanie dynamiczne.
|
||||
Format pola został opisany w specyfikacji 3GPP 32.015.
|
||||
|
||||
.TP
|
||||
.BI --uid " uid"
|
||||
Identyfikator użytkownika wysyłany do GGSN jako opcja konfiguracyjna protokołu.
|
||||
|
||||
.TP
|
||||
.BI --pwd " hasło"
|
||||
Identyfikator wysyłane do GGSN jako opcja konfiguracyjna protokołu.
|
||||
|
||||
.TP
|
||||
.BI --createif
|
||||
Tworzy lokalny interfejs tun, wykorzystywany dla
|
||||
przesyłania pakietów do i z interfejsu Gn/Gp.
|
||||
Należy zaznaczyć, że interfejs Gn/Gp zazwyczaj jest kierowany
|
||||
do Internetu przez GGSN. Tylko jeden interfejs może być utworzony, chociaż
|
||||
wiele kontekstów może zostać ustanowionych.
|
||||
Interfejs może być podany dla każdego kontekstu jako adres IP, lub może być
|
||||
określony za pomocą opcji
|
||||
.I net.
|
||||
|
||||
.TP
|
||||
.BI --net " sieć"
|
||||
Adres sieci lokalnego interfejsu.
|
||||
Opcja
|
||||
.I net
|
||||
jest poprawna tylko wtedy, gdy została wykorzystana opcja
|
||||
.I createif.
|
||||
Wartość parametru
|
||||
.I net
|
||||
jest podawana w formacie cidr (sieć/maska). Jeśli opcja
|
||||
.I net
|
||||
zostanie pominięta, adres IP jest rezerwowany dla każdego ustanawianego kontekstu.
|
||||
|
||||
.TP
|
||||
.BI --defaultroute
|
||||
Definiuje domyślne trasowanie przez lokalny interfejs tun.
|
||||
|
||||
.TP
|
||||
.BI --ipup " skrypt"
|
||||
Skrypt wykonywany po aktywacji interfejsu Gi w sieci tun.
|
||||
Skrypt jest uruchamiany z następującymi parametrami <nazwa urządzenia> <adres ip>.
|
||||
|
||||
.TP
|
||||
.BI --ipdown " skrypt"
|
||||
Skrypt wykonywany po wyłączeniu interfejsu Gi w sieci tun.
|
||||
Skrypt jest uruchamiany z następującymi parametrami <nazwa urządzenia> <adres ip>.
|
||||
|
||||
.TP
|
||||
.BI --pinghost " host"
|
||||
Powoduje wysyłanie pakietów ICMP do urządzenia
|
||||
.I host
|
||||
poprzez interfejs Gn/Gp. Statystyki połączeń są raportowane w formie
|
||||
bardzo zbliżonej do wyjścia oryginalnego programu ping. Możesz wykorzystać
|
||||
to udogodnienie do testowania wydajności GGSN.
|
||||
|
||||
.TP
|
||||
.BI --pingrate " liczba"
|
||||
Ilość żądań ICMP generowanych w przeciągu sekundy (domyślnie = 1).
|
||||
|
||||
.TP
|
||||
.BI --pingsize " liczba"
|
||||
Rozmiar generowanych żądań ICMP wyrażony w oktetach (domyślnie = 56).
|
||||
|
||||
|
||||
.TP
|
||||
.BI --pingcount " liczba"
|
||||
Oczekiwana ilość wygenerowanych żądań ICMP (domyślnie = 0).
|
||||
Wartość 0 (zero) oznacza wielkość nieograniczoną.
|
||||
|
||||
.TP
|
||||
.BI --pingquiet
|
||||
Wyłącza wypisywanie informacji o otrzymanych pakietach (domyślnie pakiety są wypisywane).
|
||||
Jest to całkiem przydatne dla dużych ilości pakietów ICMP generowanych w przeciągu sekundy
|
||||
(porównaj z opcją pingrate).
|
||||
|
||||
.SH PLIKI
|
||||
.I sgsnemu.conf
|
||||
.RS
|
||||
Plik konfiguracyjny dla
|
||||
.B sgsnemu.
|
||||
.RE
|
||||
.I .sgsnemu.pid
|
||||
.RS
|
||||
Plik zawierający identyfikator procesu.
|
||||
.RE
|
||||
.I ./
|
||||
.RS
|
||||
Katalog przechowujący trwałe (nie ulotne) dane.
|
||||
.RE
|
||||
|
||||
.SH BŁĘDY
|
||||
Zgłaszaj błędy na listę śledzenia błędów OpenGGSN
|
||||
.I http://sourceforge.net/projects/sgsnemu/
|
||||
|
||||
|
||||
.SH "ZOBACZ TAKŻE"
|
||||
.BR ggsn (8),
|
||||
.BR syslog (8)
|
||||
|
||||
.SH UWAGI
|
||||
.LP
|
||||
|
||||
Oprócz długich, udokumentowanych w tym podręczniku, opcji
|
||||
.B sgsnemu
|
||||
wspiera również pewną liczbą krótkich opcji o tej samej funkcjonalności.
|
||||
Wywołaj
|
||||
.B sgsnemu --help
|
||||
by uzyskać pełną listę dostępnych opcji.
|
||||
|
||||
Sterownik TUN/TAP jest wymagany dla poprawnego działania
|
||||
.B sgsnemu.
|
||||
Dla jąder linuksa późniejszych niż 2.4.7 sterownik TUN/TAP jest zawarty w jądrze,
|
||||
chociaż w typowej sytuacji musi być ładowany oddzielnie za pomocą
|
||||
.B modprobe tun.
|
||||
Aby ładować automatycznie należy do pliku
|
||||
.B /etc/modules.conf.
|
||||
dodać linię
|
||||
.B alias char-major-10-200 tun
|
||||
Aby uzyskać informacje o innych platformach zobacz stronę
|
||||
.I http://vtun.sourceforge.net/tun/
|
||||
opisującą jak zainstalować i skonfigurować sterownik tun.
|
||||
|
||||
.B ggsn
|
||||
wykorzystuje protokół tunelowania GPRS (GTP) wyspecyfikowany przez
|
||||
Third Generation Partnership Project (3GPP). Specyfikacje protokołów 3GPP
|
||||
mogą być znalezione na
|
||||
.I http://www.3gpp.org
|
||||
|
||||
.SH COPYRIGHT
|
||||
|
||||
Copyright (C) 2002, 2003, 2004 by Mondru AB.
|
||||
|
||||
Zawartość tego pliku może być wykorzystywana stosownie do terminów
|
||||
Ogólnej, Publicznej Licencji (GPL) GNU w wersji 2 dostarczonej wraz
|
||||
z niniejszą uwagą o prawach autorskich zawartą we wszystkich kopiach
|
||||
i istotnych fragmentach oprogramowania.
|
||||
|
||||
.SH AUTORZY
|
||||
Jens Jakobsen <jj@openggsn.org>
|
||||
|
||||
.SH TŁUMACZENIE
|
||||
Polish translation copyright (C) 2004 Marek Żakowicz <mazaczek@users.sourceforge.net>
|
||||
|
||||
Tłumaczenie jest chronione prawami autorskimi.
|
||||
Dozwolone jest korzystanie, rozprowadzanie i modyfikacja na zasadach licencji GNU GPL 2.
|
|
@ -2,9 +2,9 @@ bin_PROGRAMS = ggsn
|
|||
|
||||
AM_LDFLAGS = @EXEC_LDFLAGS@
|
||||
|
||||
AM_CFLAGS = -O2 -D_GNU_SOURCE -fno-builtin -Wall -DSBINDIR='"$(sbindir)"' -ggdb
|
||||
AM_CFLAGS = -O2 -D_GNU_SOURCE -fno-builtin -Wall -DSBINDIR='"$(sbindir)"' -ggdb $(LIBOSMOCORE_CFLAGS)
|
||||
|
||||
ggsn_LDADD = @EXEC_LDADD@ -lgtp -L../gtp ../lib/libmisc.a
|
||||
ggsn_LDADD = @EXEC_LDADD@ -lgtp -L../gtp ../lib/libmisc.a $(LIBOSMOCORE_LIBS)
|
||||
ggsn_DEPENDENCIES = ../gtp/libgtp.la ../lib/libmisc.a
|
||||
ggsn_SOURCES = ggsn.c cmdline.c cmdline.h
|
||||
|
||||
|
|
75
ggsn/ggsn.c
75
ggsn/ggsn.c
|
@ -19,11 +19,12 @@
|
|||
|
||||
#include "../config.h"
|
||||
|
||||
#include <osmocom/core/application.h>
|
||||
|
||||
#ifdef HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
#include <syslog.h>
|
||||
#include <ctype.h>
|
||||
#include <netdb.h>
|
||||
#include <signal.h>
|
||||
|
@ -88,7 +89,7 @@ void log_pid(char *pidfile)
|
|||
file = fopen(pidfile, "w");
|
||||
umask(oldmask);
|
||||
if (!file) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0,
|
||||
"Failed to create process ID file: %s!", pidfile);
|
||||
return;
|
||||
}
|
||||
|
@ -149,7 +150,7 @@ int delete_context(struct pdp_t *pdp)
|
|||
if (pdp->peer)
|
||||
ippool_freeip(ippool, (struct ippoolm_t *)pdp->peer);
|
||||
else
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Peer not defined!");
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0, "Peer not defined!");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -240,15 +241,7 @@ int main(int argc, char **argv)
|
|||
int timelimit; /* Number of seconds to be connected */
|
||||
int starttime; /* Time program was started */
|
||||
|
||||
/* open a connection to the syslog daemon */
|
||||
/*openlog(PACKAGE, LOG_PID, LOG_DAEMON); */
|
||||
|
||||
/* TODO: Only use LOG__PERROR for linux */
|
||||
#ifdef __linux__
|
||||
openlog(PACKAGE, (LOG_PID | LOG_PERROR), LOG_DAEMON);
|
||||
#else
|
||||
openlog(PACKAGE, (LOG_PID), LOG_DAEMON);
|
||||
#endif
|
||||
osmo_init_logging(&log_info);
|
||||
|
||||
if (cmdline_parser(argc, argv, &args_info) != 0)
|
||||
exit(1);
|
||||
|
@ -286,13 +279,18 @@ int main(int argc, char **argv)
|
|||
|
||||
/* Open a log file */
|
||||
if (args_info.logfile_arg) {
|
||||
FILE* log_file = fopen(args_info.logfile_arg, "a");
|
||||
if (!log_file) {
|
||||
printf("Failed to open logfile: '%s'\n",
|
||||
args_info.logfile_arg);
|
||||
exit(1);
|
||||
struct log_target *tgt;
|
||||
tgt = log_target_find(LOG_TGT_TYPE_FILE, args_info.logfile_arg);
|
||||
if (!tgt) {
|
||||
tgt = log_target_create_file(args_info.logfile_arg);
|
||||
if (!tgt) {
|
||||
LOGP(DGGSN, LOGL_ERROR,
|
||||
"Failed to create logfile: %s\n",
|
||||
args_info.logfile_arg);
|
||||
exit(1);
|
||||
}
|
||||
log_add_target(tgt);
|
||||
}
|
||||
sys_err_setlogfile(log_file);
|
||||
}
|
||||
|
||||
if (args_info.debug_flag) {
|
||||
|
@ -332,7 +330,7 @@ int main(int argc, char **argv)
|
|||
/* required for create_pdp_context_response messages */
|
||||
if (args_info.listen_arg) {
|
||||
if (!(host = gethostbyname(args_info.listen_arg))) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0,
|
||||
"Invalid listening address: %s!",
|
||||
args_info.listen_arg);
|
||||
exit(1);
|
||||
|
@ -340,7 +338,7 @@ int main(int argc, char **argv)
|
|||
memcpy(&listen_.s_addr, host->h_addr, host->h_length);
|
||||
}
|
||||
} else {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0,
|
||||
"Listening address must be specified! "
|
||||
"Please use command line option --listen or "
|
||||
"edit %s configuration file\n", args_info.conf_arg);
|
||||
|
@ -351,7 +349,7 @@ int main(int argc, char **argv)
|
|||
/* Store net as in_addr net and mask */
|
||||
if (args_info.net_arg) {
|
||||
if (ippool_aton(&net, &mask, args_info.net_arg, 0)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0,
|
||||
"Invalid network address: %s!",
|
||||
args_info.net_arg);
|
||||
exit(1);
|
||||
|
@ -359,7 +357,7 @@ int main(int argc, char **argv)
|
|||
netaddr.s_addr = htonl(ntohl(net.s_addr) + 1);
|
||||
destaddr.s_addr = htonl(ntohl(net.s_addr) + 1);
|
||||
} else {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0,
|
||||
"Network address must be specified: %s!",
|
||||
args_info.net_arg);
|
||||
exit(1);
|
||||
|
@ -370,7 +368,7 @@ int main(int argc, char **argv)
|
|||
if (ippool_new(&ippool, args_info.net_arg, NULL, 1, 0,
|
||||
IPPOOL_NONETWORK | IPPOOL_NOGATEWAY |
|
||||
IPPOOL_NOBROADCAST)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0,
|
||||
"Failed to allocate IP pool!");
|
||||
exit(1);
|
||||
}
|
||||
|
@ -378,7 +376,7 @@ int main(int argc, char **argv)
|
|||
if (ippool_new(&ippool, args_info.dynip_arg, NULL, 1, 0,
|
||||
IPPOOL_NONETWORK | IPPOOL_NOGATEWAY |
|
||||
IPPOOL_NOBROADCAST)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0,
|
||||
"Failed to allocate IP pool!");
|
||||
exit(1);
|
||||
}
|
||||
|
@ -389,7 +387,7 @@ int main(int argc, char **argv)
|
|||
dns1.s_addr = 0;
|
||||
if (args_info.pcodns1_arg) {
|
||||
if (0 == inet_aton(args_info.pcodns1_arg, &dns1)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0,
|
||||
"Failed to convert pcodns1!");
|
||||
exit(1);
|
||||
}
|
||||
|
@ -397,7 +395,7 @@ int main(int argc, char **argv)
|
|||
dns2.s_addr = 0;
|
||||
if (args_info.pcodns2_arg) {
|
||||
if (0 == inet_aton(args_info.pcodns2_arg, &dns2)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0,
|
||||
"Failed to convert pcodns2!");
|
||||
exit(1);
|
||||
}
|
||||
|
@ -407,7 +405,7 @@ int main(int argc, char **argv)
|
|||
if (args_info.pcodns1_arg) {
|
||||
dns1.s_addr = inet_addr(args_info.pcodns1_arg);
|
||||
if (dns1.s_addr == -1) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0,
|
||||
"Failed to convert pcodns1!");
|
||||
exit(1);
|
||||
}
|
||||
|
@ -416,7 +414,7 @@ int main(int argc, char **argv)
|
|||
if (args_info.pcodns2_arg) {
|
||||
dns2.s_addr = inet_addr(args_info.pcodns2_arg);
|
||||
if (dns2.s_addr == -1) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0,
|
||||
"Failed to convert pcodns2!");
|
||||
exit(1);
|
||||
}
|
||||
|
@ -469,32 +467,29 @@ int main(int argc, char **argv)
|
|||
if (!args_info.fg_flag) {
|
||||
FILE *f;
|
||||
int rc;
|
||||
closelog();
|
||||
/* Close the standard file descriptors. */
|
||||
/* Is this really needed ? */
|
||||
f = freopen("/dev/null", "w", stdout);
|
||||
if (f == NULL) {
|
||||
sys_err(LOG_WARNING, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_NOTICE, 0,
|
||||
"Could not redirect stdout to /dev/null");
|
||||
}
|
||||
f = freopen("/dev/null", "w", stderr);
|
||||
if (f == NULL) {
|
||||
sys_err(LOG_WARNING, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_NOTICE, 0,
|
||||
"Could not redirect stderr to /dev/null");
|
||||
}
|
||||
f = freopen("/dev/null", "r", stdin);
|
||||
if (f == NULL) {
|
||||
sys_err(LOG_WARNING, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_NOTICE, 0,
|
||||
"Could not redirect stdin to /dev/null");
|
||||
}
|
||||
rc = daemon(0, 0);
|
||||
if (rc != 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, rc,
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, rc,
|
||||
"Could not daemonize");
|
||||
exit(1);
|
||||
}
|
||||
/* Open log again. This time with new pid */
|
||||
openlog(PACKAGE, LOG_PID, LOG_DAEMON);
|
||||
}
|
||||
|
||||
/* pidfile */
|
||||
|
@ -507,7 +502,7 @@ int main(int argc, char **argv)
|
|||
printf("gtpclient: Initialising GTP tunnel\n");
|
||||
|
||||
if (gtp_new(&gsn, args_info.statedir_arg, &listen_, GTP_MODE_GGSN)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Failed to create gtp");
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0, "Failed to create gtp");
|
||||
exit(1);
|
||||
}
|
||||
if (gsn->fd0 > maxfd)
|
||||
|
@ -525,7 +520,7 @@ int main(int argc, char **argv)
|
|||
if (debug)
|
||||
printf("Creating tun interface\n");
|
||||
if (tun_new((struct tun_t **)&tun)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Failed to create tun");
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0, "Failed to create tun");
|
||||
if (debug)
|
||||
printf("Failed to create tun\n");
|
||||
exit(1);
|
||||
|
@ -534,7 +529,7 @@ int main(int argc, char **argv)
|
|||
if (debug)
|
||||
printf("Setting tun IP address\n");
|
||||
if (tun_setaddr(tun, &netaddr, &destaddr, &mask)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0,
|
||||
"Failed to set tun IP address");
|
||||
if (debug)
|
||||
printf("Failed to set tun IP address\n");
|
||||
|
@ -565,7 +560,7 @@ int main(int argc, char **argv)
|
|||
gtp_retranstimeout(gsn, &idleTime);
|
||||
switch (select(maxfd + 1, &fds, NULL, NULL, &idleTime)) {
|
||||
case -1: /* errno == EINTR : unblocked signal */
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0,
|
||||
"select() returned -1");
|
||||
/* On error, select returns without modifying fds */
|
||||
FD_ZERO(&fds);
|
||||
|
@ -580,7 +575,7 @@ int main(int argc, char **argv)
|
|||
|
||||
if (tun->fd != -1 && FD_ISSET(tun->fd, &fds) &&
|
||||
tun_decaps(tun) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DGGSN, LOGL_ERROR, 0,
|
||||
"TUN read failed (fd)=(%d)", tun->fd);
|
||||
}
|
||||
|
||||
|
|
|
@ -4,4 +4,4 @@ noinst_HEADERS = gnugetopt.h ippool.h lookup.h syserr.h tun.h
|
|||
|
||||
AM_CFLAGS = -O2 -fno-builtin -Wall -DSBINDIR='"$(sbindir)"' -ggdb
|
||||
|
||||
libmisc_a_SOURCES = getopt1.c getopt.c ippool.c lookup.c syserr.c tun.c
|
||||
libmisc_a_SOURCES = getopt1.c getopt.c ippool.c lookup.c tun.c debug.c
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* (C) 2014 by Holger Hans Peter Freyther
|
||||
*/
|
||||
#include "syserr.h"
|
||||
|
||||
#include <osmocom/core/utils.h>
|
||||
|
||||
static const struct log_info_cat default_categories[] = {
|
||||
[DIP] = {
|
||||
.name = "DIP",
|
||||
.description = "IP Pool and other groups",
|
||||
.enabled = 1, .loglevel = LOGL_NOTICE,
|
||||
},
|
||||
[DTUN] = {
|
||||
.name = "DTUN",
|
||||
.description = "Tunnel interface",
|
||||
.enabled = 1, .loglevel = LOGL_NOTICE,
|
||||
},
|
||||
[DGGSN] = {
|
||||
.name = "DGGSN",
|
||||
.description = "GGSN",
|
||||
.enabled = 1, .loglevel = LOGL_NOTICE,
|
||||
},
|
||||
[DSGSN] = {
|
||||
.name = "DSGSN",
|
||||
.description = "SGSN Emulator",
|
||||
.enabled = 1, .loglevel = LOGL_NOTICE,
|
||||
},
|
||||
};
|
||||
|
||||
const struct log_info log_info = {
|
||||
.cat = default_categories,
|
||||
.num_cat = ARRAY_SIZE(default_categories),
|
||||
};
|
45
lib/ippool.c
45
lib/ippool.c
|
@ -13,7 +13,6 @@
|
|||
#include <netinet/in.h> /* in_addr */
|
||||
#include <stdlib.h> /* calloc */
|
||||
#include <stdio.h> /* sscanf */
|
||||
#include <syslog.h>
|
||||
#include <string.h>
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
|
@ -76,7 +75,7 @@ int ippool_hashdel(struct ippool_t *this, struct ippoolm_t *member)
|
|||
}
|
||||
|
||||
if (p != member) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0,
|
||||
"ippool_hashdel: Tried to delete member not in hash table");
|
||||
return -1;
|
||||
}
|
||||
|
@ -124,31 +123,31 @@ int ippool_aton(struct in_addr *addr, struct in_addr *mask,
|
|||
break;
|
||||
case 5:
|
||||
if (m1 > 32) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Invalid mask");
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0, "Invalid mask");
|
||||
return -1; /* Invalid mask */
|
||||
}
|
||||
mask->s_addr = htonl(0xffffffff << (32 - m1));
|
||||
break;
|
||||
case 8:
|
||||
if (m1 >= 256 || m2 >= 256 || m3 >= 256 || m4 >= 256) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Invalid mask");
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0, "Invalid mask");
|
||||
return -1; /* Wrong mask format */
|
||||
}
|
||||
m = m1 * 0x1000000 + m2 * 0x10000 + m3 * 0x100 + m4;
|
||||
for (masklog = 0; ((1 << masklog) < ((~m) + 1)); masklog++) ;
|
||||
if (((~m) + 1) != (1 << masklog)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Invalid mask");
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0, "Invalid mask");
|
||||
return -1; /* Wrong mask format (not all ones followed by all zeros) */
|
||||
}
|
||||
mask->s_addr = htonl(m);
|
||||
break;
|
||||
default:
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Invalid mask");
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0, "Invalid mask");
|
||||
return -1; /* Invalid mask */
|
||||
}
|
||||
|
||||
if (a1 >= 256 || a2 >= 256 || a3 >= 256 || a4 >= 256) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0,
|
||||
"Wrong IP address format");
|
||||
return -1;
|
||||
} else
|
||||
|
@ -179,7 +178,7 @@ int ippool_new(struct ippool_t **this, char *dyn, char *stat,
|
|||
dynsize = 0;
|
||||
} else {
|
||||
if (ippool_aton(&addr, &mask, dyn, 0)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0,
|
||||
"Failed to parse dynamic pool");
|
||||
return -1;
|
||||
}
|
||||
|
@ -205,7 +204,7 @@ int ippool_new(struct ippool_t **this, char *dyn, char *stat,
|
|||
statmask.s_addr = 0;
|
||||
} else {
|
||||
if (ippool_aton(&stataddr, &statmask, stat, 0)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0,
|
||||
"Failed to parse static range");
|
||||
return -1;
|
||||
}
|
||||
|
@ -219,7 +218,7 @@ int ippool_new(struct ippool_t **this, char *dyn, char *stat,
|
|||
listsize = dynsize + statsize; /* Allocate space for static IP addresses */
|
||||
|
||||
if (!(*this = calloc(sizeof(struct ippool_t), 1))) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0,
|
||||
"Failed to allocate memory for ippool");
|
||||
return -1;
|
||||
}
|
||||
|
@ -231,7 +230,7 @@ int ippool_new(struct ippool_t **this, char *dyn, char *stat,
|
|||
|
||||
(*this)->listsize += listsize;
|
||||
if (!((*this)->member = calloc(sizeof(struct ippoolm_t), listsize))) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0,
|
||||
"Failed to allocate memory for members in ippool");
|
||||
return -1;
|
||||
}
|
||||
|
@ -249,7 +248,7 @@ int ippool_new(struct ippool_t **this, char *dyn, char *stat,
|
|||
if (!
|
||||
((*this)->hash =
|
||||
calloc(sizeof(struct ippoolm_t), (*this)->hashsize))) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0,
|
||||
"Failed to allocate memory for hash members in ippool");
|
||||
return -1;
|
||||
}
|
||||
|
@ -333,7 +332,7 @@ int ippool_getip(struct ippool_t *this, struct ippoolm_t **member,
|
|||
}
|
||||
if (member)
|
||||
*member = NULL;
|
||||
/*sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Address could not be found"); */
|
||||
/*SYS_ERR(DIP, LOGL_ERROR, 0, "Address could not be found"); */
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -369,19 +368,19 @@ int ippool_newip(struct ippool_t *this, struct ippoolm_t **member,
|
|||
/* First check to see if this type of address is allowed */
|
||||
if ((addr) && (addr->s_addr) && statip) { /* IP address given */
|
||||
if (!this->allowstat) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0,
|
||||
"Static IP address not allowed");
|
||||
return -1;
|
||||
}
|
||||
if ((addr->s_addr & this->statmask.s_addr) !=
|
||||
this->stataddr.s_addr) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0,
|
||||
"Static out of range");
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
if (!this->allowdyn) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0,
|
||||
"Dynamic IP address not allowed");
|
||||
return -1;
|
||||
}
|
||||
|
@ -407,7 +406,7 @@ int ippool_newip(struct ippool_t *this, struct ippoolm_t **member,
|
|||
/* If not found yet and dynamic IP then allocate dynamic IP */
|
||||
if ((!p2) && (!statip)) {
|
||||
if (!this->firstdyn) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0,
|
||||
"No more IP addresses available");
|
||||
return -1;
|
||||
} else
|
||||
|
@ -416,7 +415,7 @@ int ippool_newip(struct ippool_t *this, struct ippoolm_t **member,
|
|||
|
||||
if (p2) { /* Was allocated from dynamic address pool */
|
||||
if (p2->inuse) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0,
|
||||
"IP address allready in use");
|
||||
return -1; /* Allready in use / Should not happen */
|
||||
}
|
||||
|
@ -445,7 +444,7 @@ int ippool_newip(struct ippool_t *this, struct ippoolm_t **member,
|
|||
|
||||
if ((addr) && (addr->s_addr) && (statip)) { /* IP address given */
|
||||
if (!this->firststat) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0,
|
||||
"No more IP addresses available");
|
||||
return -1; /* No more available */
|
||||
} else
|
||||
|
@ -471,7 +470,7 @@ int ippool_newip(struct ippool_t *this, struct ippoolm_t **member,
|
|||
return 0; /* Success */
|
||||
}
|
||||
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0,
|
||||
"Could not allocate IP address");
|
||||
return -1; /* Should never get here. TODO: Bad code */
|
||||
}
|
||||
|
@ -483,13 +482,13 @@ int ippool_freeip(struct ippool_t *this, struct ippoolm_t *member)
|
|||
(void)ippool_printaddr(this);
|
||||
|
||||
if (!member->inuse) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Address not in use");
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0, "Address not in use");
|
||||
return -1; /* Not in use: Should not happen */
|
||||
}
|
||||
|
||||
switch (member->inuse) {
|
||||
case 0: /* Not in use: Should not happen */
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Address not in use");
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0, "Address not in use");
|
||||
return -1;
|
||||
case 1: /* Allocated from dynamic address space */
|
||||
/* Insert into list of unused */
|
||||
|
@ -526,7 +525,7 @@ int ippool_freeip(struct ippool_t *this, struct ippoolm_t *member)
|
|||
(void)ippool_printaddr(this);
|
||||
return 0;
|
||||
default: /* Should not happen */
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DIP, LOGL_ERROR, 0,
|
||||
"Could not free IP address");
|
||||
return -1;
|
||||
}
|
||||
|
|
51
lib/syserr.c
51
lib/syserr.c
|
@ -1,51 +0,0 @@
|
|||
/*
|
||||
* Syslog functions.
|
||||
* Copyright (C) 2003, 2004 Mondru AB.
|
||||
*
|
||||
* The contents of this file may be used under the terms of the GNU
|
||||
* General Public License Version 2, provided that the above copyright
|
||||
* notice and this permission notice is included in all copies or
|
||||
* substantial portions of the software.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <stdio.h>
|
||||
#include <syslog.h>
|
||||
#include <string.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "syserr.h"
|
||||
|
||||
static FILE* err_log;
|
||||
|
||||
void sys_err_setlogfile(FILE* log)
|
||||
{
|
||||
err_log = log;
|
||||
}
|
||||
|
||||
void sys_err(int pri, char *fn, int ln, int en, char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
char buf[SYSERR_MSGSIZE];
|
||||
|
||||
va_start(args, fmt);
|
||||
vsnprintf(buf, SYSERR_MSGSIZE, fmt, args);
|
||||
va_end(args);
|
||||
buf[SYSERR_MSGSIZE - 1] = 0; /* Make sure it is null terminated */
|
||||
if (en) {
|
||||
if (err_log)
|
||||
fprintf(err_log, "%s: %d: %d (%s) %s\n",
|
||||
fn, ln, en, strerror(en), buf);
|
||||
syslog(pri, "%s: %d: %d (%s) %s", fn, ln, en, strerror(en),
|
||||
buf);
|
||||
} else {
|
||||
if (err_log)
|
||||
fprintf(err_log, "%s: %d: %s\n", fn, ln, buf);
|
||||
syslog(pri, "%s: %d: %s", fn, ln, buf);
|
||||
}
|
||||
}
|
||||
|
21
lib/syserr.h
21
lib/syserr.h
|
@ -12,10 +12,25 @@
|
|||
#ifndef _SYSERR_H
|
||||
#define _SYSERR_H
|
||||
|
||||
#define SYSERR_MSGSIZE 256
|
||||
#include <osmocom/core/logging.h>
|
||||
|
||||
void sys_err_setlogfile(FILE*);
|
||||
enum {
|
||||
DIP,
|
||||
DTUN,
|
||||
DGGSN,
|
||||
DSGSN,
|
||||
};
|
||||
|
||||
void sys_err(int pri, char *filename, int en, int line, char *fmt, ...);
|
||||
#define SYS_ERR(sub, pri, en, fmt, args...) \
|
||||
if (en) { \
|
||||
logp2(sub, pri, __FILE__, __LINE__, 0, \
|
||||
"errno=%d/%s " fmt "\n", en, strerror(en), \
|
||||
##args); \
|
||||
} else { \
|
||||
logp2(sub, pri, __FILE__, __LINE__, 0, \
|
||||
fmt "\n", ##args); \
|
||||
}
|
||||
|
||||
extern const struct log_info log_info;
|
||||
|
||||
#endif /* !_SYSERR_H */
|
||||
|
|
91
lib/tun.c
91
lib/tun.c
|
@ -16,7 +16,6 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <syslog.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
|
@ -94,10 +93,10 @@ int tun_gifindex(struct tun_t *this, __u32 * index)
|
|||
strncpy(ifr.ifr_name, this->devname, IFNAMSIZ);
|
||||
ifr.ifr_name[IFNAMSIZ - 1] = 0; /* Make sure to terminate */
|
||||
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "socket() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "socket() failed");
|
||||
}
|
||||
if (ioctl(fd, SIOCGIFINDEX, &ifr)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "ioctl() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "ioctl() failed");
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
@ -117,10 +116,10 @@ int tun_sifflags(struct tun_t *this, int flags)
|
|||
strncpy(ifr.ifr_name, this->devname, IFNAMSIZ);
|
||||
ifr.ifr_name[IFNAMSIZ - 1] = 0; /* Make sure to terminate */
|
||||
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "socket() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "socket() failed");
|
||||
}
|
||||
if (ioctl(fd, SIOCSIFFLAGS, &ifr)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"ioctl(SIOCSIFFLAGS) failed");
|
||||
close(fd);
|
||||
return -1;
|
||||
|
@ -162,7 +161,7 @@ int tun_addroute2(struct tun_t *this,
|
|||
tun_nlattr(&req.n, sizeof(req), RTA_GATEWAY, gateway, 4);
|
||||
|
||||
if ((fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"socket() failed");
|
||||
return -1;
|
||||
}
|
||||
|
@ -172,7 +171,7 @@ int tun_addroute2(struct tun_t *this,
|
|||
local.nl_groups = 0;
|
||||
|
||||
if (bind(fd, (struct sockaddr*)&local, sizeof(local)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"bind() failed");
|
||||
close(fd);
|
||||
return -1;
|
||||
|
@ -180,21 +179,21 @@ int tun_addroute2(struct tun_t *this,
|
|||
|
||||
addr_len = sizeof(local);
|
||||
if (getsockname(fd, (struct sockaddr*)&local, &addr_len) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"getsockname() failed");
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (addr_len != sizeof(local)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, 0,
|
||||
"Wrong address length %d", addr_len);
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (local.nl_family != AF_NETLINK) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, 0,
|
||||
"Wrong address family %d", local.nl_family);
|
||||
close(fd);
|
||||
return -1;
|
||||
|
@ -265,7 +264,7 @@ int tun_addaddr(struct tun_t *this,
|
|||
tun_nlattr(&req.n, sizeof(req), IFA_LOCAL, dstaddr, sizeof(dstaddr));
|
||||
|
||||
if ((fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "socket() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "socket() failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -274,28 +273,28 @@ int tun_addaddr(struct tun_t *this,
|
|||
local.nl_groups = 0;
|
||||
|
||||
if (bind(fd, (struct sockaddr *)&local, sizeof(local)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "bind() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "bind() failed");
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
addr_len = sizeof(local);
|
||||
if (getsockname(fd, (struct sockaddr *)&local, &addr_len) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"getsockname() failed");
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (addr_len != sizeof(local)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, 0,
|
||||
"Wrong address length %d", addr_len);
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (local.nl_family != AF_NETLINK) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, 0,
|
||||
"Wrong address family %d", local.nl_family);
|
||||
close(fd);
|
||||
return -1;
|
||||
|
@ -361,12 +360,12 @@ int tun_addaddr(struct tun_t *this,
|
|||
|
||||
/* Create a channel to the NET kernel. */
|
||||
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "socket() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "socket() failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ioctl(fd, SIOCAIFADDR, (void *)&areq) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"ioctl(SIOCAIFADDR) failed");
|
||||
close(fd);
|
||||
return -1;
|
||||
|
@ -381,7 +380,7 @@ int tun_addaddr(struct tun_t *this,
|
|||
if (!this->addrs) /* Use ioctl for first addr to make ping work */
|
||||
return tun_setaddr(this, addr, dstaddr, netmask);
|
||||
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"Setting multiple addresses not possible on Solaris");
|
||||
return -1;
|
||||
|
||||
|
@ -417,7 +416,7 @@ int tun_setaddr(struct tun_t *this,
|
|||
|
||||
/* Create a channel to the NET kernel. */
|
||||
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "socket() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "socket() failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -427,10 +426,10 @@ int tun_setaddr(struct tun_t *this,
|
|||
sizeof(*addr));
|
||||
if (ioctl(fd, SIOCSIFADDR, (void *)&ifr) < 0) {
|
||||
if (errno != EEXIST) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"ioctl(SIOCSIFADDR) failed");
|
||||
} else {
|
||||
sys_err(LOG_WARNING, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_NOTICE, errno,
|
||||
"ioctl(SIOCSIFADDR): Address already exists");
|
||||
}
|
||||
close(fd);
|
||||
|
@ -443,7 +442,7 @@ int tun_setaddr(struct tun_t *this,
|
|||
memcpy(&((struct sockaddr_in *)&ifr.ifr_dstaddr)->sin_addr,
|
||||
dstaddr, sizeof(*dstaddr));
|
||||
if (ioctl(fd, SIOCSIFDSTADDR, (caddr_t) & ifr) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"ioctl(SIOCSIFDSTADDR) failed");
|
||||
close(fd);
|
||||
return -1;
|
||||
|
@ -468,7 +467,7 @@ int tun_setaddr(struct tun_t *this,
|
|||
#endif
|
||||
|
||||
if (ioctl(fd, SIOCSIFNETMASK, (void *)&ifr) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"ioctl(SIOCSIFNETMASK) failed");
|
||||
close(fd);
|
||||
return -1;
|
||||
|
@ -510,7 +509,7 @@ int tun_route(struct tun_t *this,
|
|||
|
||||
/* Create a channel to the NET kernel. */
|
||||
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "socket() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "socket() failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -525,14 +524,14 @@ int tun_route(struct tun_t *this,
|
|||
|
||||
if (delete) {
|
||||
if (ioctl(fd, SIOCDELRT, (void *)&r) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"ioctl(SIOCDELRT) failed");
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
if (ioctl(fd, SIOCADDRT, (void *)&r) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"ioctl(SIOCADDRT) failed");
|
||||
close(fd);
|
||||
return -1;
|
||||
|
@ -554,7 +553,7 @@ int tun_route(struct tun_t *this,
|
|||
struct rt_msghdr *rtm;
|
||||
|
||||
if ((fd = socket(AF_ROUTE, SOCK_RAW, 0)) == -1) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "socket() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "socket() failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -586,7 +585,7 @@ int tun_route(struct tun_t *this,
|
|||
req.gate.sin_addr.s_addr = gateway->s_addr;
|
||||
|
||||
if (write(fd, rtm, rtm->rtm_msglen) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "write() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "write() failed");
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
@ -594,7 +593,7 @@ int tun_route(struct tun_t *this,
|
|||
return 0;
|
||||
|
||||
#elif defined(__sun__)
|
||||
sys_err(LOG_WARNING, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_NOTICE, errno,
|
||||
"Could not set up routing on Solaris. Please add route manually.");
|
||||
return 0;
|
||||
|
||||
|
@ -641,7 +640,7 @@ int tun_new(struct tun_t **tun)
|
|||
#endif
|
||||
|
||||
if (!(*tun = calloc(1, sizeof(struct tun_t)))) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "calloc() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "calloc() failed");
|
||||
return EOF;
|
||||
}
|
||||
|
||||
|
@ -652,7 +651,7 @@ int tun_new(struct tun_t **tun)
|
|||
#if defined(__linux__)
|
||||
/* Open the actual tun device */
|
||||
if (((*tun)->fd = open("/dev/net/tun", O_RDWR)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "open() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "open() failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -661,7 +660,7 @@ int tun_new(struct tun_t **tun)
|
|||
memset(&ifr, 0, sizeof(ifr));
|
||||
ifr.ifr_flags = IFF_TUN | IFF_NO_PI; /* Tun device, no packet info */
|
||||
if (ioctl((*tun)->fd, TUNSETIFF, (void *)&ifr) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "ioctl() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "ioctl() failed");
|
||||
close((*tun)->fd);
|
||||
return -1;
|
||||
}
|
||||
|
@ -683,7 +682,7 @@ int tun_new(struct tun_t **tun)
|
|||
break;
|
||||
}
|
||||
if ((*tun)->fd < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"Can't find tunnel device");
|
||||
return -1;
|
||||
}
|
||||
|
@ -702,7 +701,7 @@ int tun_new(struct tun_t **tun)
|
|||
|
||||
/* Create a channel to the NET kernel. */
|
||||
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "socket() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "socket() failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -715,45 +714,45 @@ int tun_new(struct tun_t **tun)
|
|||
#elif defined(__sun__)
|
||||
|
||||
if ((ip_fd = open("/dev/udp", O_RDWR, 0)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"Can't open /dev/udp");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (((*tun)->fd = open("/dev/tun", O_RDWR, 0)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"Can't open /dev/tun");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Assign a new PPA and get its unit number. */
|
||||
if ((ppa = ioctl((*tun)->fd, TUNNEWPPA, -1)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"Can't assign new interface");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((if_fd = open("/dev/tun", O_RDWR, 0)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"Can't open /dev/tun (2)");
|
||||
return -1;
|
||||
}
|
||||
if (ioctl(if_fd, I_PUSH, "ip") < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"Can't push IP module");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Assign ppa according to the unit number returned by tun device */
|
||||
if (ioctl(if_fd, IF_UNITSEL, (char *)&ppa) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "Can't set PPA %d",
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "Can't set PPA %d",
|
||||
ppa);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Link the two streams */
|
||||
if ((muxid = ioctl(ip_fd, I_LINK, if_fd)) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"Can't link TUN device to IP");
|
||||
return -1;
|
||||
}
|
||||
|
@ -769,7 +768,7 @@ int tun_new(struct tun_t **tun)
|
|||
|
||||
if (ioctl(ip_fd, SIOCSIFMUXID, &ifr) < 0) {
|
||||
ioctl(ip_fd, I_PUNLINK, muxid);
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"Can't set multiplexor id");
|
||||
return -1;
|
||||
}
|
||||
|
@ -793,7 +792,7 @@ int tun_free(struct tun_t *tun)
|
|||
}
|
||||
|
||||
if (close(tun->fd)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "close() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "close() failed");
|
||||
}
|
||||
|
||||
/* TODO: For solaris we need to unlink streams */
|
||||
|
@ -818,7 +817,7 @@ int tun_decaps(struct tun_t *this)
|
|||
int status;
|
||||
|
||||
if ((status = read(this->fd, buffer, sizeof(buffer))) <= 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "read() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "read() failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -836,7 +835,7 @@ int tun_decaps(struct tun_t *this)
|
|||
sbuf.maxlen = PACKET_MAX;
|
||||
sbuf.buf = buffer;
|
||||
if (getmsg(this->fd, NULL, &sbuf, &f) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno, "getmsg() failed");
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno, "getmsg() failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -885,7 +884,7 @@ int tun_runscript(struct tun_t *tun, char *script)
|
|||
buf[sizeof(buf) - 1] = 0;
|
||||
rc = system(buf);
|
||||
if (rc == -1) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, errno,
|
||||
SYS_ERR(DTUN, LOGL_ERROR, errno,
|
||||
"Error executing command %s", buf);
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -2,8 +2,8 @@ bin_PROGRAMS = sgsnemu
|
|||
|
||||
AM_LDFLAGS = @EXEC_LDFLAGS@
|
||||
|
||||
AM_CFLAGS = -O2 -D_GNU_SOURCE -fno-builtin -Wall -DSBINDIR='"$(sbindir)"' -ggdb
|
||||
AM_CFLAGS = -O2 -D_GNU_SOURCE -fno-builtin -Wall -DSBINDIR='"$(sbindir)"' -ggdb $(LIBOSMOCORE_CFLAGS)
|
||||
|
||||
sgsnemu_LDADD = @EXEC_LDADD@ -lgtp -L../gtp ../lib/libmisc.a
|
||||
sgsnemu_LDADD = @EXEC_LDADD@ -lgtp -L../gtp ../lib/libmisc.a $(LIBOSMOCORE_LIBS)
|
||||
sgsnemu_DEPENDENCIES = ../gtp/libgtp.la ../lib/libmisc.a
|
||||
sgsnemu_SOURCES = sgsnemu.c cmdline.c cmdline.h
|
||||
|
|
|
@ -18,7 +18,8 @@
|
|||
#define _GNU_SOURCE 1 /* strdup() prototype, broken arpa/inet.h */
|
||||
#endif
|
||||
|
||||
#include <syslog.h>
|
||||
#include <osmocom/core/application.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <netdb.h>
|
||||
#include <signal.h>
|
||||
|
@ -377,7 +378,7 @@ int process_options(int argc, char **argv)
|
|||
printf("\n");
|
||||
if (args_info.dns_arg) {
|
||||
if (!(host = gethostbyname(args_info.dns_arg))) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0,
|
||||
"Invalid DNS address: %s!", args_info.dns_arg);
|
||||
return -1;
|
||||
} else {
|
||||
|
@ -398,7 +399,7 @@ int process_options(int argc, char **argv)
|
|||
/* Do hostname lookup to translate hostname to IP address */
|
||||
if (args_info.listen_arg) {
|
||||
if (!(host = gethostbyname(args_info.listen_arg))) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0,
|
||||
"Invalid listening address: %s!",
|
||||
args_info.listen_arg);
|
||||
return -1;
|
||||
|
@ -409,7 +410,7 @@ int process_options(int argc, char **argv)
|
|||
args_info.listen_arg, inet_ntoa(options.listen));
|
||||
}
|
||||
} else {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0,
|
||||
"Listening address must be specified: %s!",
|
||||
args_info.listen_arg);
|
||||
return -1;
|
||||
|
@ -420,7 +421,7 @@ int process_options(int argc, char **argv)
|
|||
/* Do hostname lookup to translate hostname to IP address */
|
||||
if (args_info.remote_arg) {
|
||||
if (!(host = gethostbyname(args_info.remote_arg))) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0,
|
||||
"Invalid remote address: %s!",
|
||||
args_info.remote_arg);
|
||||
return -1;
|
||||
|
@ -431,7 +432,7 @@ int process_options(int argc, char **argv)
|
|||
args_info.remote_arg, inet_ntoa(options.remote));
|
||||
}
|
||||
} else {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0,
|
||||
"No remote address given!");
|
||||
return -1;
|
||||
}
|
||||
|
@ -844,7 +845,7 @@ int process_options(int argc, char **argv)
|
|||
if (args_info.net_arg) {
|
||||
if (ippool_aton
|
||||
(&options.net, &options.mask, args_info.net_arg, 0)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0,
|
||||
"Invalid network address: %s!",
|
||||
args_info.net_arg);
|
||||
exit(1);
|
||||
|
@ -880,7 +881,7 @@ int process_options(int argc, char **argv)
|
|||
/* Store ping host as in_addr */
|
||||
if (args_info.pinghost_arg) {
|
||||
if (!(host = gethostbyname(args_info.pinghost_arg))) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0,
|
||||
"Invalid ping host: %s!",
|
||||
args_info.pinghost_arg);
|
||||
return -1;
|
||||
|
@ -1179,7 +1180,7 @@ int create_ping(void *gsn, struct pdp_t *pdp,
|
|||
(struct timeval *)&p8[CREATEPING_IP + CREATEPING_ICMP];
|
||||
|
||||
if (datasize > CREATEPING_MAX) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0,
|
||||
"Ping size to large: %d!", datasize);
|
||||
return -1;
|
||||
}
|
||||
|
@ -1410,15 +1411,7 @@ int main(int argc, char **argv)
|
|||
struct timeval tv;
|
||||
int diff;
|
||||
|
||||
/* open a connection to the syslog daemon */
|
||||
/*openlog(PACKAGE, LOG_PID, LOG_DAEMON); */
|
||||
/* TODO: Only use LOG__PERROR for linux */
|
||||
|
||||
#ifdef __linux__
|
||||
openlog(PACKAGE, (LOG_PID | LOG_PERROR), LOG_DAEMON);
|
||||
#else
|
||||
openlog(PACKAGE, (LOG_PID), LOG_DAEMON);
|
||||
#endif
|
||||
osmo_init_logging(&log_info);
|
||||
|
||||
/* Process options given in configuration file and command line */
|
||||
if (process_options(argc, argv))
|
||||
|
@ -1426,7 +1419,7 @@ int main(int argc, char **argv)
|
|||
|
||||
printf("\nInitialising GTP library\n");
|
||||
if (gtp_new(&gsn, options.statedir, &options.listen, GTP_MODE_SGSN)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Failed to create gtp");
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0, "Failed to create gtp");
|
||||
exit(1);
|
||||
}
|
||||
if (gsn->fd0 > maxfd)
|
||||
|
@ -1447,7 +1440,7 @@ int main(int argc, char **argv)
|
|||
printf("Setting up interface\n");
|
||||
/* Create a tunnel interface */
|
||||
if (tun_new((struct tun_t **)&tun)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0,
|
||||
"Failed to create tun");
|
||||
exit(1);
|
||||
}
|
||||
|
@ -1498,7 +1491,7 @@ int main(int argc, char **argv)
|
|||
|
||||
if (options.gtpversion == 0) {
|
||||
if (options.qos.l - 1 > sizeof(pdp->qos_req0)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0,
|
||||
"QoS length too big");
|
||||
exit(1);
|
||||
} else {
|
||||
|
@ -1535,7 +1528,7 @@ int main(int argc, char **argv)
|
|||
pdp->norecovery_given = options.norecovery_given;
|
||||
|
||||
if (options.apn.l > sizeof(pdp->apn_use.v)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0,
|
||||
"APN length too big");
|
||||
exit(1);
|
||||
} else {
|
||||
|
@ -1549,7 +1542,7 @@ int main(int argc, char **argv)
|
|||
memcpy(pdp->gsnlu.v, &options.listen, sizeof(options.listen));
|
||||
|
||||
if (options.msisdn.l > sizeof(pdp->msisdn.v)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0,
|
||||
"MSISDN length too big");
|
||||
exit(1);
|
||||
} else {
|
||||
|
@ -1559,7 +1552,7 @@ int main(int argc, char **argv)
|
|||
ipv42eua(&pdp->eua, NULL); /* Request dynamic IP address */
|
||||
|
||||
if (options.pco.l > sizeof(pdp->pco_req.v)) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0,
|
||||
"PCO length too big");
|
||||
exit(1);
|
||||
} else {
|
||||
|
@ -1674,7 +1667,7 @@ int main(int argc, char **argv)
|
|||
|
||||
switch (select(maxfd + 1, &fds, NULL, NULL, &idleTime)) {
|
||||
case -1:
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0,
|
||||
"Select returned -1");
|
||||
break;
|
||||
case 0:
|
||||
|
@ -1685,7 +1678,7 @@ int main(int argc, char **argv)
|
|||
}
|
||||
|
||||
if ((tun) && FD_ISSET(tun->fd, &fds) && tun_decaps(tun) < 0) {
|
||||
sys_err(LOG_ERR, __FILE__, __LINE__, 0,
|
||||
SYS_ERR(DSGSN, LOGL_ERROR, 0,
|
||||
"TUN decaps failed");
|
||||
}
|
||||
|
||||
|
|
Reference in New Issue