initial checkin of Osmocom E1TS (E1 timeslot) test port for TITAN
Change-Id: Ib03a6a5b3d7e4864bf797e4a69b87a64515dd953
This commit is contained in:
commit
92d1d7d2ab
|
@ -0,0 +1,4 @@
|
||||||
|
*.o
|
||||||
|
*.d
|
||||||
|
*.so
|
||||||
|
compile
|
|
@ -0,0 +1,277 @@
|
||||||
|
Eclipse Public License - v 2.0
|
||||||
|
|
||||||
|
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
|
||||||
|
PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION
|
||||||
|
OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
|
||||||
|
|
||||||
|
1. DEFINITIONS
|
||||||
|
|
||||||
|
"Contribution" means:
|
||||||
|
|
||||||
|
a) in the case of the initial Contributor, the initial content
|
||||||
|
Distributed under this Agreement, and
|
||||||
|
|
||||||
|
b) in the case of each subsequent Contributor:
|
||||||
|
i) changes to the Program, and
|
||||||
|
ii) additions to the Program;
|
||||||
|
where such changes and/or additions to the Program originate from
|
||||||
|
and are Distributed by that particular Contributor. A Contribution
|
||||||
|
"originates" from a Contributor if it was added to the Program by
|
||||||
|
such Contributor itself or anyone acting on such Contributor's behalf.
|
||||||
|
Contributions do not include changes or additions to the Program that
|
||||||
|
are not Modified Works.
|
||||||
|
|
||||||
|
"Contributor" means any person or entity that Distributes the Program.
|
||||||
|
|
||||||
|
"Licensed Patents" mean patent claims licensable by a Contributor which
|
||||||
|
are necessarily infringed by the use or sale of its Contribution alone
|
||||||
|
or when combined with the Program.
|
||||||
|
|
||||||
|
"Program" means the Contributions Distributed in accordance with this
|
||||||
|
Agreement.
|
||||||
|
|
||||||
|
"Recipient" means anyone who receives the Program under this Agreement
|
||||||
|
or any Secondary License (as applicable), including Contributors.
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source Code or other
|
||||||
|
form, that is based on (or derived from) the Program and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship.
|
||||||
|
|
||||||
|
"Modified Works" shall mean any work in Source Code or other form that
|
||||||
|
results from an addition to, deletion from, or modification of the
|
||||||
|
contents of the Program, including, for purposes of clarity any new file
|
||||||
|
in Source Code form that contains any contents of the Program. Modified
|
||||||
|
Works shall not include works that contain only declarations,
|
||||||
|
interfaces, types, classes, structures, or files of the Program solely
|
||||||
|
in each case in order to link to, bind by name, or subclass the Program
|
||||||
|
or Modified Works thereof.
|
||||||
|
|
||||||
|
"Distribute" means the acts of a) distributing or b) making available
|
||||||
|
in any manner that enables the transfer of a copy.
|
||||||
|
|
||||||
|
"Source Code" means the form of a Program preferred for making
|
||||||
|
modifications, including but not limited to software source code,
|
||||||
|
documentation source, and configuration files.
|
||||||
|
|
||||||
|
"Secondary License" means either the GNU General Public License,
|
||||||
|
Version 2.0, or any later versions of that license, including any
|
||||||
|
exceptions or additional permissions as identified by the initial
|
||||||
|
Contributor.
|
||||||
|
|
||||||
|
2. GRANT OF RIGHTS
|
||||||
|
|
||||||
|
a) Subject to the terms of this Agreement, each Contributor hereby
|
||||||
|
grants Recipient a non-exclusive, worldwide, royalty-free copyright
|
||||||
|
license to reproduce, prepare Derivative Works of, publicly display,
|
||||||
|
publicly perform, Distribute and sublicense the Contribution of such
|
||||||
|
Contributor, if any, and such Derivative Works.
|
||||||
|
|
||||||
|
b) Subject to the terms of this Agreement, each Contributor hereby
|
||||||
|
grants Recipient a non-exclusive, worldwide, royalty-free patent
|
||||||
|
license under Licensed Patents to make, use, sell, offer to sell,
|
||||||
|
import and otherwise transfer the Contribution of such Contributor,
|
||||||
|
if any, in Source Code or other form. This patent license shall
|
||||||
|
apply to the combination of the Contribution and the Program if, at
|
||||||
|
the time the Contribution is added by the Contributor, such addition
|
||||||
|
of the Contribution causes such combination to be covered by the
|
||||||
|
Licensed Patents. The patent license shall not apply to any other
|
||||||
|
combinations which include the Contribution. No hardware per se is
|
||||||
|
licensed hereunder.
|
||||||
|
|
||||||
|
c) Recipient understands that although each Contributor grants the
|
||||||
|
licenses to its Contributions set forth herein, no assurances are
|
||||||
|
provided by any Contributor that the Program does not infringe the
|
||||||
|
patent or other intellectual property rights of any other entity.
|
||||||
|
Each Contributor disclaims any liability to Recipient for claims
|
||||||
|
brought by any other entity based on infringement of intellectual
|
||||||
|
property rights or otherwise. As a condition to exercising the
|
||||||
|
rights and licenses granted hereunder, each Recipient hereby
|
||||||
|
assumes sole responsibility to secure any other intellectual
|
||||||
|
property rights needed, if any. For example, if a third party
|
||||||
|
patent license is required to allow Recipient to Distribute the
|
||||||
|
Program, it is Recipient's responsibility to acquire that license
|
||||||
|
before distributing the Program.
|
||||||
|
|
||||||
|
d) Each Contributor represents that to its knowledge it has
|
||||||
|
sufficient copyright rights in its Contribution, if any, to grant
|
||||||
|
the copyright license set forth in this Agreement.
|
||||||
|
|
||||||
|
e) Notwithstanding the terms of any Secondary License, no
|
||||||
|
Contributor makes additional grants to any Recipient (other than
|
||||||
|
those set forth in this Agreement) as a result of such Recipient's
|
||||||
|
receipt of the Program under the terms of a Secondary License
|
||||||
|
(if permitted under the terms of Section 3).
|
||||||
|
|
||||||
|
3. REQUIREMENTS
|
||||||
|
|
||||||
|
3.1 If a Contributor Distributes the Program in any form, then:
|
||||||
|
|
||||||
|
a) the Program must also be made available as Source Code, in
|
||||||
|
accordance with section 3.2, and the Contributor must accompany
|
||||||
|
the Program with a statement that the Source Code for the Program
|
||||||
|
is available under this Agreement, and informs Recipients how to
|
||||||
|
obtain it in a reasonable manner on or through a medium customarily
|
||||||
|
used for software exchange; and
|
||||||
|
|
||||||
|
b) the Contributor may Distribute the Program under a license
|
||||||
|
different than this Agreement, provided that such license:
|
||||||
|
i) effectively disclaims on behalf of all other Contributors all
|
||||||
|
warranties and conditions, express and implied, including
|
||||||
|
warranties or conditions of title and non-infringement, and
|
||||||
|
implied warranties or conditions of merchantability and fitness
|
||||||
|
for a particular purpose;
|
||||||
|
|
||||||
|
ii) effectively excludes on behalf of all other Contributors all
|
||||||
|
liability for damages, including direct, indirect, special,
|
||||||
|
incidental and consequential damages, such as lost profits;
|
||||||
|
|
||||||
|
iii) does not attempt to limit or alter the recipients' rights
|
||||||
|
in the Source Code under section 3.2; and
|
||||||
|
|
||||||
|
iv) requires any subsequent distribution of the Program by any
|
||||||
|
party to be under a license that satisfies the requirements
|
||||||
|
of this section 3.
|
||||||
|
|
||||||
|
3.2 When the Program is Distributed as Source Code:
|
||||||
|
|
||||||
|
a) it must be made available under this Agreement, or if the
|
||||||
|
Program (i) is combined with other material in a separate file or
|
||||||
|
files made available under a Secondary License, and (ii) the initial
|
||||||
|
Contributor attached to the Source Code the notice described in
|
||||||
|
Exhibit A of this Agreement, then the Program may be made available
|
||||||
|
under the terms of such Secondary Licenses, and
|
||||||
|
|
||||||
|
b) a copy of this Agreement must be included with each copy of
|
||||||
|
the Program.
|
||||||
|
|
||||||
|
3.3 Contributors may not remove or alter any copyright, patent,
|
||||||
|
trademark, attribution notices, disclaimers of warranty, or limitations
|
||||||
|
of liability ("notices") contained within the Program from any copy of
|
||||||
|
the Program which they Distribute, provided that Contributors may add
|
||||||
|
their own appropriate notices.
|
||||||
|
|
||||||
|
4. COMMERCIAL DISTRIBUTION
|
||||||
|
|
||||||
|
Commercial distributors of software may accept certain responsibilities
|
||||||
|
with respect to end users, business partners and the like. While this
|
||||||
|
license is intended to facilitate the commercial use of the Program,
|
||||||
|
the Contributor who includes the Program in a commercial product
|
||||||
|
offering should do so in a manner which does not create potential
|
||||||
|
liability for other Contributors. Therefore, if a Contributor includes
|
||||||
|
the Program in a commercial product offering, such Contributor
|
||||||
|
("Commercial Contributor") hereby agrees to defend and indemnify every
|
||||||
|
other Contributor ("Indemnified Contributor") against any losses,
|
||||||
|
damages and costs (collectively "Losses") arising from claims, lawsuits
|
||||||
|
and other legal actions brought by a third party against the Indemnified
|
||||||
|
Contributor to the extent caused by the acts or omissions of such
|
||||||
|
Commercial Contributor in connection with its distribution of the Program
|
||||||
|
in a commercial product offering. The obligations in this section do not
|
||||||
|
apply to any claims or Losses relating to any actual or alleged
|
||||||
|
intellectual property infringement. In order to qualify, an Indemnified
|
||||||
|
Contributor must: a) promptly notify the Commercial Contributor in
|
||||||
|
writing of such claim, and b) allow the Commercial Contributor to control,
|
||||||
|
and cooperate with the Commercial Contributor in, the defense and any
|
||||||
|
related settlement negotiations. The Indemnified Contributor may
|
||||||
|
participate in any such claim at its own expense.
|
||||||
|
|
||||||
|
For example, a Contributor might include the Program in a commercial
|
||||||
|
product offering, Product X. That Contributor is then a Commercial
|
||||||
|
Contributor. If that Commercial Contributor then makes performance
|
||||||
|
claims, or offers warranties related to Product X, those performance
|
||||||
|
claims and warranties are such Commercial Contributor's responsibility
|
||||||
|
alone. Under this section, the Commercial Contributor would have to
|
||||||
|
defend claims against the other Contributors related to those performance
|
||||||
|
claims and warranties, and if a court requires any other Contributor to
|
||||||
|
pay any damages as a result, the Commercial Contributor must pay
|
||||||
|
those damages.
|
||||||
|
|
||||||
|
5. NO WARRANTY
|
||||||
|
|
||||||
|
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
|
||||||
|
PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS"
|
||||||
|
BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
|
||||||
|
IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF
|
||||||
|
TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. Each Recipient is solely responsible for determining the
|
||||||
|
appropriateness of using and distributing the Program and assumes all
|
||||||
|
risks associated with its exercise of rights under this Agreement,
|
||||||
|
including but not limited to the risks and costs of program errors,
|
||||||
|
compliance with applicable laws, damage to or loss of data, programs
|
||||||
|
or equipment, and unavailability or interruption of operations.
|
||||||
|
|
||||||
|
6. DISCLAIMER OF LIABILITY
|
||||||
|
|
||||||
|
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
|
||||||
|
PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS
|
||||||
|
SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
|
||||||
|
PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
|
||||||
|
EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
7. GENERAL
|
||||||
|
|
||||||
|
If any provision of this Agreement is invalid or unenforceable under
|
||||||
|
applicable law, it shall not affect the validity or enforceability of
|
||||||
|
the remainder of the terms of this Agreement, and without further
|
||||||
|
action by the parties hereto, such provision shall be reformed to the
|
||||||
|
minimum extent necessary to make such provision valid and enforceable.
|
||||||
|
|
||||||
|
If Recipient institutes patent litigation against any entity
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that the
|
||||||
|
Program itself (excluding combinations of the Program with other software
|
||||||
|
or hardware) infringes such Recipient's patent(s), then such Recipient's
|
||||||
|
rights granted under Section 2(b) shall terminate as of the date such
|
||||||
|
litigation is filed.
|
||||||
|
|
||||||
|
All Recipient's rights under this Agreement shall terminate if it
|
||||||
|
fails to comply with any of the material terms or conditions of this
|
||||||
|
Agreement and does not cure such failure in a reasonable period of
|
||||||
|
time after becoming aware of such noncompliance. If all Recipient's
|
||||||
|
rights under this Agreement terminate, Recipient agrees to cease use
|
||||||
|
and distribution of the Program as soon as reasonably practicable.
|
||||||
|
However, Recipient's obligations under this Agreement and any licenses
|
||||||
|
granted by Recipient relating to the Program shall continue and survive.
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute copies of this Agreement,
|
||||||
|
but in order to avoid inconsistency the Agreement is copyrighted and
|
||||||
|
may only be modified in the following manner. The Agreement Steward
|
||||||
|
reserves the right to publish new versions (including revisions) of
|
||||||
|
this Agreement from time to time. No one other than the Agreement
|
||||||
|
Steward has the right to modify this Agreement. The Eclipse Foundation
|
||||||
|
is the initial Agreement Steward. The Eclipse Foundation may assign the
|
||||||
|
responsibility to serve as the Agreement Steward to a suitable separate
|
||||||
|
entity. Each new version of the Agreement will be given a distinguishing
|
||||||
|
version number. The Program (including Contributions) may always be
|
||||||
|
Distributed subject to the version of the Agreement under which it was
|
||||||
|
received. In addition, after a new version of the Agreement is published,
|
||||||
|
Contributor may elect to Distribute the Program (including its
|
||||||
|
Contributions) under the new version.
|
||||||
|
|
||||||
|
Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
|
||||||
|
receives no rights or licenses to the intellectual property of any
|
||||||
|
Contributor under this Agreement, whether expressly, by implication,
|
||||||
|
estoppel or otherwise. All rights in the Program not expressly granted
|
||||||
|
under this Agreement are reserved. Nothing in this Agreement is intended
|
||||||
|
to be enforceable by any entity that is not a Contributor or Recipient.
|
||||||
|
No third-party beneficiary rights are created under this Agreement.
|
||||||
|
|
||||||
|
Exhibit A - Form of Secondary Licenses Notice
|
||||||
|
|
||||||
|
"This Source Code may also be made available under the following
|
||||||
|
Secondary Licenses when the conditions for such availability set forth
|
||||||
|
in the Eclipse Public License, v. 2.0 are satisfied: {name license(s),
|
||||||
|
version(s), and exceptions or additional permissions here}."
|
||||||
|
|
||||||
|
Simply including a copy of this Agreement, including this Exhibit A
|
||||||
|
is not sufficient to license the Source Code under Secondary Licenses.
|
||||||
|
|
||||||
|
If it is not possible or desirable to put the notice in a particular
|
||||||
|
file, then You may include the notice in a location (such as a LICENSE
|
||||||
|
file in a relevant directory) where a recipient would be likely to
|
||||||
|
look for such a notice.
|
||||||
|
|
||||||
|
You may add additional accurate notices of copyright ownership.
|
|
@ -0,0 +1,34 @@
|
||||||
|
titan.TestPorts.E1TS
|
||||||
|
====================
|
||||||
|
|
||||||
|
This implements a TTCN-3 E1 Timeslot test port for Eclipse TITAN. Running on a (Linux) computer,
|
||||||
|
it allows you to write TTCN-3 tests sending and receiving data on 64kBps E1 timeslots.
|
||||||
|
|
||||||
|
In order to interface both physical and virtual E1 lines, this port currently relies on
|
||||||
|
osmo-e1d, the Osmocom E1 daemon [1]. Adding back-ends for other drivers such as DAHDI should
|
||||||
|
not be hard, if needed at a later point.
|
||||||
|
|
||||||
|
The timeslots can either be opened in RAW (transparent) 64kBps mode, or with a HDLC controller.
|
||||||
|
|
||||||
|
The idea of this module is to be able to write abstract test suites in TTCN-3 which interface
|
||||||
|
IUT (Implementations under Test) over E1.
|
||||||
|
|
||||||
|
|
||||||
|
GIT repository
|
||||||
|
--------------
|
||||||
|
|
||||||
|
You can clone from the official titan.TestPorts.E1TS repository using
|
||||||
|
|
||||||
|
git clone https://git.osmocom.org/titan.TestPorts.E1TS
|
||||||
|
|
||||||
|
There's a cgit interface at <https://cgit.osmocom.org/titan.TestPorts.E1TS/>
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
-------------
|
||||||
|
|
||||||
|
This is still very much a Work-In-Progress, and hence there's no documentation yet, sorry.
|
||||||
|
|
||||||
|
References
|
||||||
|
----------
|
||||||
|
|
||||||
|
[1] osmo-e1d homepage at https://osmocom.org/projects/osmo-e1d/wiki
|
|
@ -0,0 +1 @@
|
||||||
|
../src/E1TS_PT.cc
|
|
@ -0,0 +1 @@
|
||||||
|
../src/E1TS_PT.hh
|
|
@ -0,0 +1 @@
|
||||||
|
../src/E1TS_PortType.ttcn
|
|
@ -0,0 +1 @@
|
||||||
|
../src/E1TS_PortTypes.ttcn
|
|
@ -0,0 +1,42 @@
|
||||||
|
module E1TS_Test {
|
||||||
|
|
||||||
|
import from E1TS_PortType all;
|
||||||
|
import from E1TS_PortTypes all;
|
||||||
|
|
||||||
|
type component test_CT {
|
||||||
|
port E1TS_PT E1;
|
||||||
|
}
|
||||||
|
|
||||||
|
testcase TC_selftest() runs on test_CT {
|
||||||
|
map(self:E1, system:E1);
|
||||||
|
var template (value) E1TS_identity ts_id := ts_E1TS_ID(0,0,2);
|
||||||
|
|
||||||
|
E1.send(ts_E1TS_open(23, ts_id, E1TS_MODE_RAW, "e1d"));
|
||||||
|
E1.receive(tr_E1TS_result(23, 0));
|
||||||
|
|
||||||
|
var integer rx_count := 0, rx_bytes := 0;
|
||||||
|
var E1TS_unitdata rx_ud;
|
||||||
|
timer T := 5.0;
|
||||||
|
T.start;
|
||||||
|
while (true) {
|
||||||
|
alt {
|
||||||
|
[] E1.receive(tr_E1TS_unitdata(ts_id,?)) -> value rx_ud {
|
||||||
|
rx_bytes := rx_bytes + lengthof(rx_ud.data);
|
||||||
|
rx_count := rx_count + 1;
|
||||||
|
repeat;
|
||||||
|
}
|
||||||
|
[] T.timeout {
|
||||||
|
log(rx_count, " messages received, total bytes ", rx_bytes);
|
||||||
|
mtc.stop
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
control {
|
||||||
|
execute( TC_selftest() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,241 @@
|
||||||
|
# This Makefile was generated by the Makefile Generator
|
||||||
|
# of the TTCN-3 Test Executor version CRL 113 200/6 R6B
|
||||||
|
# for Harald Welte (laforge@nataraja) on Thu Jul 2 18:32:11 2020
|
||||||
|
|
||||||
|
# Copyright (c) 2000-2019 Ericsson Telecom AB
|
||||||
|
|
||||||
|
# The following make commands are available:
|
||||||
|
# - make, make all Builds the executable test suite.
|
||||||
|
# - make archive Archives all source files.
|
||||||
|
# - make check Checks the semantics of TTCN-3 and ASN.1modules.
|
||||||
|
# - make port Generates port skeletons.
|
||||||
|
# - make clean Removes all generated files.
|
||||||
|
# - make compile Translates TTCN-3 and ASN.1 modules to C++.
|
||||||
|
# - make dep Creates/updates dependency list.
|
||||||
|
# - make executable Builds the executable test suite.
|
||||||
|
# - make library Builds the library archive.
|
||||||
|
# - make objects Builds the object files without linking the executable.
|
||||||
|
# - make shared_objects Builds the shared object files without linking the executable.
|
||||||
|
# - make preprocess Preprocess TTCN-3 files.
|
||||||
|
# WARNING! This Makefile can be used with GNU make only.
|
||||||
|
# Other versions of make may report syntax errors in it.
|
||||||
|
|
||||||
|
#
|
||||||
|
# Do NOT touch this line...
|
||||||
|
#
|
||||||
|
.PHONY: all shared_objects executable library objects check port clean dep archive preprocess
|
||||||
|
|
||||||
|
.SUFFIXES: .d
|
||||||
|
|
||||||
|
#
|
||||||
|
# Set these variables...
|
||||||
|
#
|
||||||
|
|
||||||
|
ifndef TTCN3_DIR
|
||||||
|
ifneq (,$(wildcard /usr/include/titan/))
|
||||||
|
TTCN3_DIR = /usr
|
||||||
|
TTCN3_SUBDIR = /titan
|
||||||
|
else
|
||||||
|
TTCN3_DIR = /usr
|
||||||
|
TTCN3_SUBDIR =
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Your platform: (SOLARIS, SOLARIS8, LINUX, FREEBSD or WIN32)
|
||||||
|
PLATFORM = LINUX
|
||||||
|
|
||||||
|
# Your C++ compiler:
|
||||||
|
# (if you change the platform, you may need to change the compiler)
|
||||||
|
CXX = env CCACHE_SLOPPINESS=time_macros ccache g++
|
||||||
|
|
||||||
|
# C preprocessor used for TTCN-3 files:
|
||||||
|
CPP = cpp
|
||||||
|
|
||||||
|
# Flags for the C++ preprocessor (and makedepend as well):
|
||||||
|
CPPFLAGS = -D$(PLATFORM) -DMAKEDEPEND_RUN -DUSE_SCTP -I$(TTCN3_DIR)/include$(TTCN3_SUBDIR) $(shell pkg-config --cflags libosmo-e1d libosmocore)
|
||||||
|
|
||||||
|
# Flags for dependency generation
|
||||||
|
CXXDEPFLAGS = -MM
|
||||||
|
|
||||||
|
# Flags for preprocessing TTCN-3 files:
|
||||||
|
CPPFLAGS_TTCN3 = $(shell pkg-config --cflags libosmo-e1d libosmocore)
|
||||||
|
|
||||||
|
# Flags for the C++ compiler:
|
||||||
|
CXXFLAGS = -fPIC
|
||||||
|
|
||||||
|
# Flags for the linker:
|
||||||
|
LDFLAGS = -L /usr/lib/titan -fPIC
|
||||||
|
|
||||||
|
ifeq ($(PLATFORM), WIN32)
|
||||||
|
# Silence linker warnings.
|
||||||
|
LDFLAGS += -Wl,--enable-auto-import,--enable-runtime-pseudo-reloc
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Utility to create library files
|
||||||
|
AR = ar
|
||||||
|
ARFLAGS =
|
||||||
|
|
||||||
|
# Flags for the TTCN-3 and ASN.1 compiler:
|
||||||
|
COMPILER_FLAGS = -L -U 5 -D
|
||||||
|
|
||||||
|
# Execution mode: (either ttcn3 or ttcn3-parallel)
|
||||||
|
TTCN3_LIB = ttcn3-parallel-dynamic
|
||||||
|
|
||||||
|
# The path of your libxml2 installation:
|
||||||
|
# If you do not have your own one, leave it unchanged.
|
||||||
|
XMLDIR = $(TTCN3_DIR)
|
||||||
|
|
||||||
|
# Directory to store the archived source files:
|
||||||
|
ARCHIVE_DIR = backup
|
||||||
|
|
||||||
|
#
|
||||||
|
# You may change these variables. Add your files if necessary...
|
||||||
|
#
|
||||||
|
|
||||||
|
# TTCN-3 modules of this project:
|
||||||
|
TTCN3_MODULES = E1TS_Test.ttcn E1TS_PortType.ttcn E1TS_PortTypes.ttcn
|
||||||
|
|
||||||
|
# TTCN-3 modules to preprocess:
|
||||||
|
TTCN3_PP_MODULES =
|
||||||
|
|
||||||
|
# Files to include in TTCN-3 preprocessed modules:
|
||||||
|
TTCN3_INCLUDES =
|
||||||
|
|
||||||
|
# ASN.1 modules of this project:
|
||||||
|
ASN1_MODULES =
|
||||||
|
|
||||||
|
# TTCN-3 source files generated by the C preprocessor:
|
||||||
|
PREPROCESSED_TTCN3_MODULES =
|
||||||
|
|
||||||
|
# C++ source & header files generated from the TTCN-3 & ASN.1 modules of
|
||||||
|
# this project:
|
||||||
|
GENERATED_SOURCES = $(TTCN3_MODULES:.ttcn=.cc) E1TS_Test_part_1.cc E1TS_Test_part_2.cc E1TS_Test_part_3.cc E1TS_Test_part_4.cc E1TS_PortType_part_1.cc E1TS_PortType_part_2.cc E1TS_PortType_part_3.cc E1TS_PortType_part_4.cc E1TS_PortTypes_part_1.cc E1TS_PortTypes_part_2.cc E1TS_PortTypes_part_3.cc E1TS_PortTypes_part_4.cc $(TTCN3_PP_MODULES:.ttcnpp=.cc) $(ASN1_MODULES:.asn=.cc)
|
||||||
|
GENERATED_HEADERS = $(TTCN3_MODULES:.ttcn=.hh) $(TTCN3_PP_MODULES:.ttcnpp=.hh) $(ASN1_MODULES:.asn=.hh)
|
||||||
|
|
||||||
|
# C/C++ Source & header files of Test Ports, external functions and
|
||||||
|
# other modules:
|
||||||
|
USER_SOURCES = E1TS_PT.cc
|
||||||
|
USER_HEADERS = $(USER_SOURCES:.cc=.hh)
|
||||||
|
|
||||||
|
# Shared object files of this project:
|
||||||
|
SHARED_OBJECTS = $(GENERATED_SOURCES:.cc=.so) $(USER_SOURCES:.cc=.so)
|
||||||
|
|
||||||
|
# Object files of this project that are needed for the executable test suite:
|
||||||
|
OBJECTS = $(GENERATED_OBJECTS) $(USER_OBJECTS)
|
||||||
|
|
||||||
|
GENERATED_OBJECTS = $(GENERATED_SOURCES:.cc=.o)
|
||||||
|
|
||||||
|
USER_OBJECTS = $(USER_SOURCES:.cc=.o)
|
||||||
|
|
||||||
|
DEPFILES = $(USER_OBJECTS:.o=.d) $(GENERATED_OBJECTS:.o=.d)
|
||||||
|
|
||||||
|
# Other files of the project (Makefile, configuration files, etc.)
|
||||||
|
# that will be added to the archived source files:
|
||||||
|
OTHER_FILES = Makefile
|
||||||
|
|
||||||
|
# The name of the executable test suite:
|
||||||
|
EXECUTABLE = E1TS_Test
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LIBRARY = lib$(EXECUTABLE).so
|
||||||
|
|
||||||
|
TARGET = $(EXECUTABLE)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Do not modify these unless you know what you are doing...
|
||||||
|
# Platform specific additional libraries:
|
||||||
|
#
|
||||||
|
SOLARIS_LIBS = -lsocket -lnsl -lxml2
|
||||||
|
SOLARIS8_LIBS = -lsocket -lnsl -lxml2
|
||||||
|
LINUX_LIBS = -lxml2 $(shell pkg-config --libs libosmo-e1d libosmocore)
|
||||||
|
FREEBSD_LIBS = -lxml2
|
||||||
|
WIN32_LIBS = -lxml2
|
||||||
|
|
||||||
|
#
|
||||||
|
# Rules for building the executable...
|
||||||
|
#
|
||||||
|
|
||||||
|
all: $(TARGET) ;
|
||||||
|
|
||||||
|
shared_objects: $(SHARED_OBJECTS) ;
|
||||||
|
|
||||||
|
executable: $(EXECUTABLE) ;
|
||||||
|
|
||||||
|
library: $(LIBRARY) ;
|
||||||
|
|
||||||
|
objects: $(OBJECTS) compile;
|
||||||
|
|
||||||
|
$(EXECUTABLE): $(SHARED_OBJECTS)
|
||||||
|
if $(CXX) $(LDFLAGS) -o $@ -Wl,--no-as-needed $^ \
|
||||||
|
-L$(TTCN3_DIR)/lib$(TTCN3_SUBDIR) -l$(TTCN3_LIB) \
|
||||||
|
-L$(OPENSSL_DIR)/lib -lcrypto \
|
||||||
|
-L$(XMLDIR)/lib $($(PLATFORM)_LIBS); \
|
||||||
|
then : ; else $(TTCN3_DIR)/bin/titanver $(OBJECTS); exit 1; fi
|
||||||
|
|
||||||
|
$(LIBRARY): $(OBJECTS)
|
||||||
|
$(CXX) -shared -o $@ $(OBJECTS)
|
||||||
|
|
||||||
|
.cc.o .c.o:
|
||||||
|
$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $<
|
||||||
|
|
||||||
|
.cc.d .c.d:
|
||||||
|
@echo Creating dependency file for '$<'; set -e; \
|
||||||
|
$(CXX) $(CXXDEPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $< \
|
||||||
|
| sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' > $@; \
|
||||||
|
[ -s $@ ] || rm -f $@
|
||||||
|
|
||||||
|
%.so: %.o
|
||||||
|
$(CXX) -shared -o $@ $<
|
||||||
|
|
||||||
|
%.ttcn: %.ttcnpp $(TTCN3_INCLUDES)
|
||||||
|
$(CPP) -x c -nostdinc $(CPPFLAGS_TTCN3) $< $@
|
||||||
|
|
||||||
|
preprocess: $(PREPROCESSED_TTCN3_MODULES) ;
|
||||||
|
|
||||||
|
$(GENERATED_SOURCES) $(GENERATED_HEADERS): compile
|
||||||
|
@if [ ! -f $@ ]; then $(RM) compile; $(MAKE) compile; fi
|
||||||
|
|
||||||
|
check: $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES)
|
||||||
|
$(TTCN3_DIR)/bin/ttcn3_compiler -s $(COMPILER_FLAGS) $^
|
||||||
|
|
||||||
|
port: $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES)
|
||||||
|
$(TTCN3_DIR)/bin/ttcn3_compiler -t $(COMPILER_FLAGS) $^
|
||||||
|
|
||||||
|
compile: $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES)
|
||||||
|
$(TTCN3_DIR)/bin/ttcn3_compiler $(COMPILER_FLAGS) $^ - $?
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-$(RM) $(EXECUTABLE) $(LIBRARY) $(OBJECTS) $(GENERATED_HEADERS) \
|
||||||
|
$(GENERATED_SOURCES) $(SHARED_OBJECTS) $(PREPROCESSED_TTCN3_MODULES) compile $(DEPFILES) \
|
||||||
|
tags *.log
|
||||||
|
|
||||||
|
dep: $(GENERATED_SOURCES) $(USER_SOURCES) ;
|
||||||
|
|
||||||
|
ifeq ($(findstring n,$(MAKEFLAGS)),)
|
||||||
|
ifeq ($(filter clean check port compile archive diag preprocess,$(MAKECMDGOALS)),)
|
||||||
|
-include $(DEPFILES)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
archive:
|
||||||
|
mkdir -p $(ARCHIVE_DIR)
|
||||||
|
tar -cvhf - $(TTCN3_MODULES) $(TTCN3_PP_MODULES) \
|
||||||
|
$(TTCN3_INCLUDES) $(ASN1_MODULES) \
|
||||||
|
$(USER_HEADERS) $(USER_SOURCES) $(OTHER_FILES) \
|
||||||
|
| gzip >$(ARCHIVE_DIR)/`basename $(TARGET) .exe`-`date '+%y%m%d-%H%M'`.tgz
|
||||||
|
|
||||||
|
diag:
|
||||||
|
$(TTCN3_DIR)/bin/ttcn3_compiler -v 2>&1
|
||||||
|
$(TTCN3_DIR)/bin/mctr_cli -v 2>&1
|
||||||
|
$(CXX) -v 2>&1
|
||||||
|
@echo TTCN3_DIR=$(TTCN3_DIR)
|
||||||
|
@echo OPENSSL_DIR=$(OPENSSL_DIR)
|
||||||
|
@echo XMLDIR=$(XMLDIR)
|
||||||
|
@echo PLATFORM=$(PLATFORM)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Add your rules here if necessary...
|
||||||
|
#
|
||||||
|
|
|
@ -0,0 +1,285 @@
|
||||||
|
/* Copyright (c) 2020 Harald Welte <laforge@osmocom.org> */
|
||||||
|
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
|
#include "E1TS_PT.hh"
|
||||||
|
#include "E1TS_PortType.hh"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include <osmocom/core/application.h>
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <poll.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
using namespace E1TS__PortTypes;
|
||||||
|
|
||||||
|
namespace E1TS__PortType {
|
||||||
|
|
||||||
|
/* somehow std::map() won't work wit E1TS_identity as key */
|
||||||
|
DerivedId::DerivedId(const E1TS__identity &id)
|
||||||
|
{
|
||||||
|
interface_nr = id.interface__nr();
|
||||||
|
line_nr = id.line__nr();
|
||||||
|
ts_nr = id.ts__nr();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator<(const DerivedId &fk, const DerivedId &lk) {
|
||||||
|
if (fk.interface_nr < lk.interface_nr)
|
||||||
|
return true;
|
||||||
|
else if (fk.interface_nr == lk.interface_nr) {
|
||||||
|
if (fk.line_nr < lk.line_nr)
|
||||||
|
return true;
|
||||||
|
else if (fk.line_nr == lk.line_nr) {
|
||||||
|
if (fk.ts_nr < lk.line_nr)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QueueEntry::QueueEntry(const uint8_t *pdata, unsigned int plen):
|
||||||
|
len(plen)
|
||||||
|
{
|
||||||
|
data = (uint8_t *) malloc(len);
|
||||||
|
memcpy(data, pdata, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
QueueEntry::~QueueEntry()
|
||||||
|
{
|
||||||
|
free(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
E1_Timeslot::E1_Timeslot(E1TS__PT_PROVIDER &pt, E1TS__identity id, E1TS__mode mode, int fd)
|
||||||
|
: m_pt(pt), m_id(id), m_mode(mode), m_fd(fd)
|
||||||
|
{
|
||||||
|
m_pt.log("creating %d:%d:%d fd=%d",
|
||||||
|
(int)m_id.interface__nr(), (int)m_id.line__nr(), (int)m_id.ts__nr(), m_fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
E1_Timeslot::~E1_Timeslot()
|
||||||
|
{
|
||||||
|
m_pt.log("destroying %d:%d:%d fd=%d",
|
||||||
|
(int)m_id.interface__nr(), (int)m_id.line__nr(), (int)m_id.ts__nr(), m_fd);
|
||||||
|
|
||||||
|
close(m_fd);
|
||||||
|
|
||||||
|
/* iterate over tx-queue and free all elements */
|
||||||
|
while (!m_tx_queue.empty()) {
|
||||||
|
struct QueueEntry *qe = m_tx_queue.front();
|
||||||
|
printf("qe=%p\n", qe);
|
||||||
|
m_tx_queue.pop();
|
||||||
|
delete qe;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* enqueue to-be-transmitted data */
|
||||||
|
int E1_Timeslot::enqueue_tx(const uint8_t *data, unsigned int len)
|
||||||
|
{
|
||||||
|
struct QueueEntry *qe = new QueueEntry(data, len);
|
||||||
|
if (!qe)
|
||||||
|
return 0;
|
||||||
|
m_tx_queue.push(qe);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* dequeue + write next-to-be-transmitted data from queue */
|
||||||
|
int E1_Timeslot::dequeue_tx(void)
|
||||||
|
{
|
||||||
|
struct QueueEntry *qe;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (m_tx_queue.empty()) {
|
||||||
|
/* queue is empty; unsubscribe write-events */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
qe = m_tx_queue.front();
|
||||||
|
m_tx_queue.pop();
|
||||||
|
rc = write(m_fd, qe->data, qe->len);
|
||||||
|
if (rc < 0) {
|
||||||
|
TTCN_error("error during write: %s\n", strerror(errno));
|
||||||
|
/* FIXME: close/delete fd */
|
||||||
|
}
|
||||||
|
else if (rc < qe->len)
|
||||||
|
TTCN_error("could only write %u of %u bytes\n", rc, qe->len);
|
||||||
|
|
||||||
|
delete qe;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
E1TS__PT_PROVIDER::E1TS__PT_PROVIDER(const char *par_port_name)
|
||||||
|
: PORT(par_port_name)
|
||||||
|
{
|
||||||
|
osmo_init_logging2(NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
E1TS__PT_PROVIDER::~E1TS__PT_PROVIDER()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void E1TS__PT_PROVIDER::log(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
TTCN_Logger::begin_event(TTCN_WARNING);
|
||||||
|
TTCN_Logger::log_event("E1TS Test port (%s): ", get_name());
|
||||||
|
va_list args;
|
||||||
|
va_start(args, fmt);
|
||||||
|
TTCN_Logger::log_event_va_list(fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
TTCN_Logger::end_event();
|
||||||
|
}
|
||||||
|
|
||||||
|
void E1TS__PT_PROVIDER::set_parameter(const char *parameter_name, const char *parameter_value)
|
||||||
|
{
|
||||||
|
if (!strcmp(parameter_name, "e1d_socket_path"))
|
||||||
|
m_e1d_socket_path = parameter_value;
|
||||||
|
else
|
||||||
|
TTCN_error("Unsupported E1TS test port parameter `%s'.", parameter_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void E1TS__PT_PROVIDER::Handle_Fd_Event(int fd, boolean is_readable, boolean is_writable,
|
||||||
|
boolean is_error)
|
||||||
|
{
|
||||||
|
uint8_t buf[65535];
|
||||||
|
E1_Timeslot *ts;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/* find E1TS_identity by fd */
|
||||||
|
ts = ts_by_fd(fd);
|
||||||
|
|
||||||
|
if (!ts)
|
||||||
|
TTCN_error("Unknown file descriptor %d\n", fd);
|
||||||
|
|
||||||
|
if (is_readable) {
|
||||||
|
rc = read(fd, buf, sizeof(buf));
|
||||||
|
if (rc > 0)
|
||||||
|
incoming_message(E1TS__unitdata(ts->m_id, OCTETSTRING(rc, buf)));
|
||||||
|
else if (rc == 0) {
|
||||||
|
TTCN_error("EOF on E1TS fd, closing");
|
||||||
|
m_ts_by_id.erase(m_ts_by_id.find(ts->m_id));
|
||||||
|
m_ts_by_fd.erase(m_ts_by_fd.find(ts->m_fd));
|
||||||
|
Handler_Remove_Fd(ts->m_fd);
|
||||||
|
delete ts;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_writable) {
|
||||||
|
/* dequeue next message; unregister for 'write' if nothing to write */
|
||||||
|
if (ts->dequeue_tx() == 0)
|
||||||
|
Handler_Remove_Fd_Write(ts->m_fd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void E1TS__PT_PROVIDER::user_map(const char * /*system_port*/)
|
||||||
|
{
|
||||||
|
m_e1d_clnt = osmo_e1dp_client_create(NULL, m_e1d_socket_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void E1TS__PT_PROVIDER::user_unmap(const char * /*system_port*/)
|
||||||
|
{
|
||||||
|
/* close/destroy all timeslots */
|
||||||
|
for (auto it = m_ts_by_id.begin(); it != m_ts_by_id.end(); it++) {
|
||||||
|
E1_Timeslot *ts = it->second;
|
||||||
|
Handler_Remove_Fd(ts->m_fd);
|
||||||
|
delete ts;
|
||||||
|
}
|
||||||
|
m_ts_by_id.clear();
|
||||||
|
m_ts_by_fd.clear();
|
||||||
|
|
||||||
|
/* close client connection to daemon */
|
||||||
|
osmo_e1dp_client_destroy(m_e1d_clnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
void E1TS__PT_PROVIDER::user_start()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void E1TS__PT_PROVIDER::user_stop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static enum osmo_e1dp_ts_mode e1dp_mode(E1TS__mode in)
|
||||||
|
{
|
||||||
|
switch (in) {
|
||||||
|
case E1TS__PortTypes::E1TS__mode::E1TS__MODE__RAW:
|
||||||
|
return E1DP_TSMODE_RAW;
|
||||||
|
case E1TS__PortTypes::E1TS__mode::E1TS__MODE__HDLCFCS:
|
||||||
|
return E1DP_TSMODE_HDLCFCS;
|
||||||
|
default:
|
||||||
|
TTCN_error("Unknown E1TS_mode %d\n", in);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
E1_Timeslot *E1TS__PT_PROVIDER::ts_by_fd(int fd)
|
||||||
|
{
|
||||||
|
auto it = m_ts_by_fd.find(fd);
|
||||||
|
if (it == m_ts_by_fd.end()) {
|
||||||
|
TTCN_error("couldn't find FD for identity");
|
||||||
|
return NULL;
|
||||||
|
} else
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
E1_Timeslot *E1TS__PT_PROVIDER::ts_by_id(const E1TS__identity& id)
|
||||||
|
{
|
||||||
|
auto it = m_ts_by_id.find(id);
|
||||||
|
if (it == m_ts_by_id.end())
|
||||||
|
return NULL;
|
||||||
|
else
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void E1TS__PT_PROVIDER::outgoing_send(const E1TS__open& send_par)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
enum osmo_e1dp_ts_mode mode = e1dp_mode(send_par.mode());
|
||||||
|
|
||||||
|
fd = osmo_e1dp_client_ts_open(m_e1d_clnt, send_par.id().interface__nr(),
|
||||||
|
send_par.id().line__nr(), send_par.id().ts__nr(), mode);
|
||||||
|
|
||||||
|
if (fd >= 0) {
|
||||||
|
E1_Timeslot *ts = new E1_Timeslot(*this, send_par.id(), send_par.mode(), fd);
|
||||||
|
m_ts_by_id.insert(std::make_pair(send_par.id(), ts));
|
||||||
|
m_ts_by_fd.insert(std::make_pair(fd, ts));
|
||||||
|
Handler_Add_Fd_Read(fd);
|
||||||
|
incoming_message(E1TS__result(send_par.req__hdl(), 0));
|
||||||
|
} else {
|
||||||
|
incoming_message(E1TS__result(send_par.req__hdl(), fd));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void E1TS__PT_PROVIDER::outgoing_send(const E1TS__close& send_par)
|
||||||
|
{
|
||||||
|
/* find fd by map */
|
||||||
|
E1_Timeslot *ts = ts_by_id(send_par.id());
|
||||||
|
|
||||||
|
if (!ts)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_ts_by_id.erase(m_ts_by_id.find(send_par.id()));
|
||||||
|
m_ts_by_fd.erase(m_ts_by_fd.find(ts->m_fd));
|
||||||
|
Handler_Remove_Fd(ts->m_fd);
|
||||||
|
delete ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
void E1TS__PT_PROVIDER::outgoing_send(const E1TS__unitdata& send_par)
|
||||||
|
{
|
||||||
|
/* find fd by map */
|
||||||
|
E1_Timeslot *ts = ts_by_id(send_par.id());
|
||||||
|
|
||||||
|
if (!ts)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ts->enqueue_tx(send_par.data(), send_par.data().lengthof());
|
||||||
|
Handler_Add_Fd_Write(ts->m_fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} /* namespace */
|
|
@ -0,0 +1,100 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <queue>
|
||||||
|
|
||||||
|
#include <TTCN3.hh>
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include <osmocom/e1d/proto_clnt.h>
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "E1TS_PortTypes.hh"
|
||||||
|
|
||||||
|
namespace E1TS__PortType {
|
||||||
|
|
||||||
|
using namespace E1TS__PortTypes;
|
||||||
|
|
||||||
|
class E1TS__PT_PROVIDER;
|
||||||
|
|
||||||
|
class DerivedId {
|
||||||
|
public:
|
||||||
|
DerivedId(const E1TS__identity &id);
|
||||||
|
unsigned int interface_nr;
|
||||||
|
unsigned int line_nr;
|
||||||
|
unsigned int ts_nr;
|
||||||
|
};
|
||||||
|
|
||||||
|
class QueueEntry {
|
||||||
|
public:
|
||||||
|
QueueEntry(const uint8_t *pdata, unsigned int plen);
|
||||||
|
~QueueEntry();
|
||||||
|
|
||||||
|
uint8_t *data;
|
||||||
|
unsigned int len;
|
||||||
|
};
|
||||||
|
|
||||||
|
class E1_Timeslot {
|
||||||
|
public:
|
||||||
|
E1_Timeslot(E1TS__PT_PROVIDER &pr, E1TS__identity id, E1TS__mode mode, int fd);
|
||||||
|
~E1_Timeslot();
|
||||||
|
|
||||||
|
int enqueue_tx(const uint8_t *data, unsigned int len);
|
||||||
|
int dequeue_tx(void);
|
||||||
|
|
||||||
|
E1TS__identity m_id;
|
||||||
|
int m_fd;
|
||||||
|
|
||||||
|
private:
|
||||||
|
E1TS__PT_PROVIDER &m_pt;
|
||||||
|
E1TS__mode m_mode;
|
||||||
|
std::queue<QueueEntry *> m_tx_queue;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class E1TS__PT_PROVIDER : public PORT {
|
||||||
|
public:
|
||||||
|
E1TS__PT_PROVIDER(const char *par_port_name);
|
||||||
|
~E1TS__PT_PROVIDER();
|
||||||
|
|
||||||
|
void set_parameter(const char *parameter_name, const char *parameter_value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void Handle_Fd_Event(int fd, boolean is_readable, boolean is_writable, boolean is_error);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void user_map(const char *system_port);
|
||||||
|
void user_unmap(const char *system_port);
|
||||||
|
|
||||||
|
void user_start();
|
||||||
|
void user_stop();
|
||||||
|
|
||||||
|
void outgoing_send(const E1TS__open& send_par);
|
||||||
|
void outgoing_send(const E1TS__close& send_par);
|
||||||
|
void outgoing_send(const E1TS__unitdata& send_par);
|
||||||
|
|
||||||
|
virtual void incoming_message(const E1TS__result& incoming_par) = 0;
|
||||||
|
virtual void incoming_message(const E1TS__unitdata &incoming_par) = 0;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void log(const char *fmt, ...);
|
||||||
|
|
||||||
|
private:
|
||||||
|
/* parameter */
|
||||||
|
const char *m_e1d_socket_path = E1DP_DEFAULT_SOCKET;
|
||||||
|
|
||||||
|
E1_Timeslot *ts_by_fd(int fd);
|
||||||
|
E1_Timeslot *ts_by_id(const E1TS__identity &id);
|
||||||
|
|
||||||
|
/* client to the E1 Daemon */
|
||||||
|
struct osmo_e1dp_client *m_e1d_clnt;
|
||||||
|
|
||||||
|
/* per-timeslot file descriptors */
|
||||||
|
std::map<DerivedId, E1_Timeslot *> m_ts_by_id;
|
||||||
|
std::map<int, E1_Timeslot *> m_ts_by_fd;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
module E1TS_PortType {
|
||||||
|
import from E1TS_PortTypes all;
|
||||||
|
|
||||||
|
type port E1TS_PT message {
|
||||||
|
out E1TS_open;
|
||||||
|
in E1TS_result;
|
||||||
|
|
||||||
|
out E1TS_unitdata;
|
||||||
|
in E1TS_unitdata;
|
||||||
|
} with { extension "provider" };
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,87 @@
|
||||||
|
module E1TS_PortTypes {
|
||||||
|
|
||||||
|
type record E1TS_identity {
|
||||||
|
integer interface_nr,
|
||||||
|
integer line_nr,
|
||||||
|
integer ts_nr
|
||||||
|
};
|
||||||
|
|
||||||
|
type enumerated E1TS_mode {
|
||||||
|
E1TS_MODE_RAW,
|
||||||
|
E1TS_MODE_HDLCFCS
|
||||||
|
};
|
||||||
|
|
||||||
|
type record E1TS_open {
|
||||||
|
integer req_hdl,
|
||||||
|
E1TS_identity id,
|
||||||
|
E1TS_mode mode,
|
||||||
|
charstring driver
|
||||||
|
};
|
||||||
|
|
||||||
|
type record E1TS_close {
|
||||||
|
E1TS_identity id
|
||||||
|
};
|
||||||
|
|
||||||
|
type record E1TS_result {
|
||||||
|
integer req_hdl,
|
||||||
|
integer status
|
||||||
|
};
|
||||||
|
|
||||||
|
type record E1TS_unitdata {
|
||||||
|
E1TS_identity id,
|
||||||
|
octetstring data
|
||||||
|
};
|
||||||
|
|
||||||
|
template (value) E1TS_identity ts_E1TS_ID(template (value) integer if_nr,
|
||||||
|
template (value) integer li_nr,
|
||||||
|
template (value) integer ts_nr) := {
|
||||||
|
interface_nr := if_nr,
|
||||||
|
line_nr := li_nr,
|
||||||
|
ts_nr := ts_nr
|
||||||
|
}
|
||||||
|
|
||||||
|
template (present) E1TS_identity tr_E1TS_ID(template (present) integer if_nr,
|
||||||
|
template (present) integer li_nr,
|
||||||
|
template (present) integer ts_nr) := {
|
||||||
|
interface_nr := if_nr,
|
||||||
|
line_nr := li_nr,
|
||||||
|
ts_nr := ts_nr
|
||||||
|
}
|
||||||
|
|
||||||
|
template (value) E1TS_open ts_E1TS_open(template (value) integer req_hdl,
|
||||||
|
template (value) E1TS_identity id,
|
||||||
|
template (value) E1TS_mode mode := E1TS_MODE_RAW,
|
||||||
|
template (value) charstring driver := "e1d") := {
|
||||||
|
req_hdl := req_hdl,
|
||||||
|
id := id,
|
||||||
|
mode := mode,
|
||||||
|
driver := driver
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template (value) E1TS_close ts_E1TS_close(template (value) E1TS_identity id) := {
|
||||||
|
id := id
|
||||||
|
}
|
||||||
|
|
||||||
|
template (present) E1TS_result tr_E1TS_result(template (present) integer req_hdl := ?,
|
||||||
|
template (present) integer status := ?) := {
|
||||||
|
req_hdl := req_hdl,
|
||||||
|
status := status
|
||||||
|
}
|
||||||
|
|
||||||
|
template (value) E1TS_unitdata ts_E1TS_unitdata(template (value) E1TS_identity id,
|
||||||
|
template (value) octetstring data) := {
|
||||||
|
id := id,
|
||||||
|
data := data
|
||||||
|
}
|
||||||
|
|
||||||
|
template (present) E1TS_unitdata tr_E1TS_unitdata(template (present) E1TS_identity id,
|
||||||
|
template (present) octetstring data) := {
|
||||||
|
id := id,
|
||||||
|
data := data
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue