renamed openair-cn to openair3

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7886 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
gauthier
2015-10-06 16:53:42 +00:00
parent c7518ecf42
commit 7b5431a62c
705 changed files with 206 additions and 208 deletions
+674
View File
@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+49
View File
@@ -0,0 +1,49 @@
################################################################################
# OpenAirInterface
# Copyright(c) 1999 - 2014 Eurecom
#
# OpenAirInterface is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
#
# OpenAirInterface is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenAirInterface.The full GNU General Public License is
# included in this distribution in the file called "COPYING". If not,
# see <http://www.gnu.org/licenses/>.
#
# Contact Information
# OpenAirInterface Admin: openair_admin@eurecom.fr
# OpenAirInterface Tech : openair_tech@eurecom.fr
# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
#
# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
#
################################################################################
ifndef PROJDIR
PROJDIR = $(PWD)/../../..
INCLUDES = -I. -I$(INCDIR) -I$(UTILDIR) -I$(IESDIR) -I$(EMMMSGDIR) -I$(ESMMSGDIR)
endif
include $(PROJDIR)/Makerules
include $(PROJDIR)/Makefile.inc
all: $(OBJS)
%.o: %.c Makefile
@echo Compiling $<
@$(CC) $(CFLAGS) -c $< -o $@
clean:
$(RM) $(OBJS) *.bak *~
depend:
makedepend -- ${CFLAGS} -- ${SRCS}
# DO NOT DELETE THIS LINE -- make depend depends on it.
File diff suppressed because it is too large Load Diff
+865
View File
@@ -0,0 +1,865 @@
/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenAirInterface is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>.
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
*******************************************************************************/
/*****************************************************************************
Source at_command.h
Version 0.1
Date 2012/03/07
Product NAS stack
Subsystem Application Programming Interface
Author Frederic Maurel
Description Defines the ATtention (AT) command set supported by the NAS
sublayer protocol
*****************************************************************************/
#ifndef __AT_COMMAND_H__
#define __AT_COMMAND_H__
#include "userDef.h"
#include "networkDef.h"
/****************************************************************************/
/********************* G L O B A L C O N S T A N T S *******************/
/****************************************************************************/
/* Bit masks indicating presence of AT command's optional parameters */
#define AT_COMMAND_PARAM0 0x0000 /* no any parameter is present */
#define AT_COMMAND_PARAM1 0x0001 /* first parameter is present */
#define AT_COMMAND_PARAM2 0x0002 /* 2nd parameter is present */
#define AT_COMMAND_PARAM3 0x0004 /* 3rd parameter is present */
#define AT_COMMAND_PARAM4 0x0008 /* 4th parameter is present */
#define AT_COMMAND_PARAM5 0x0010 /* 5th parameter is present */
#define AT_COMMAND_PARAM6 0x0020 /* 6th parameter is present */
#define AT_COMMAND_PARAM7 0x0040 /* 7th parameter is present */
#define AT_COMMAND_PARAM8 0x0080 /* 8th parameter is present */
#define AT_COMMAND_PARAM9 0x0100 /* 9th parameter is present */
#define AT_COMMAND_PARAM10 0x0200 /* 10th parameter is present */
#define AT_COMMAND_PARAM11 0x0400 /* 11th parameter is present */
#define AT_COMMAND_PARAM12 0x0800 /* 12th parameter is present */
#define AT_COMMAND_PARAM13 0x1000 /* 13th parameter is present */
#define AT_COMMAND_PARAM14 0x2000 /* 14th parameter is present */
#define AT_COMMAND_PARAM15 0x4000 /* 15th parameter is present */
#define AT_COMMAND_PARAM16 0x8000 /* 16th parameter is present */
/* Value of the mask parameter for AT commands without any parameters */
#define AT_COMMAND_NO_PARAM AT_COMMAND_PARAM0
/****************************************************************************/
/************************ G L O B A L T Y P E S ************************/
/****************************************************************************/
/*
* AT command identifiers
* ----------------------
* Those currently supported by our Mobile Equipment (ME)
*/
typedef enum {
/*
* General commands
* ----------------
*/
AT_CGSN=1, /* Request Product Serial Number identification (IMEI) */
AT_CGMI, /* Request manufacturer identification */
AT_CGMM, /* Request model identification */
AT_CGMR, /* Request revision identification */
AT_CIMI, /* Request International Mobile Subscriber Identity */
/*
* Mobile Termination control and status commands
* ----------------------------------------------
*/
AT_CFUN, /* Set phone functionality */
AT_CPIN, /* Enter PIN */
AT_CSQ, /* Signal quality */
AT_CESQ, /* Extented signal quality */
AT_CLAC, /* List all available AT commands */
/*
* Mobile Termination errors
* -------------------------
*/
AT_CMEE, /* Report mobile termination error */
/*
* Network service related commands
* ---------------------------------
*/
AT_CNUM, /* Subscriber number */
AT_CLCK, /* Facility lock */
AT_COPS, /* PLMN selection */
AT_CREG, /* Network registration */
/*
* Commands for Packet Domain
* ---------------------------
*/
AT_CGATT, /* PS attach/detach */
AT_CGREG, /* GPRS network registration status */
AT_CEREG, /* EPS network registration status */
AT_CGDCONT, /* Define PDP Context */
AT_CGACT, /* PDP context activate or deactivate */
AT_CGPADDR, /* Show PDP address(es) */
AT_CGEV, /* Packet Domain event unsolicited result code */
AT_COMMAND_ID_MAX
} at_command_id_t;
/*
* AT command types
* ----------------
* - AT action command, used to execute a particular function, which
* generally involves more than the simple storage of a value.
* - AT set parameter command, used to store a value or values of
* subparameters.
* - AT read parameter command, used to check the current values of
* subparameters.
* - AT test parameter command, used to test the existence of the
* command and to give information about the type of its subparameters.
*/
typedef enum {
AT_COMMAND_ACT, /* AT action command (ATCMD) */
AT_COMMAND_SET, /* AT set parameter command (ATCMD=) */
AT_COMMAND_GET, /* AT read parameter command (ATCMD?) */
AT_COMMAND_TST, /* AT test parameter command (ATCMD=?) */
AT_COMMAND_TYPE_MAX
} at_command_type_t;
/*
* ================
* General commands
* ================
*/
/* CGSN: Request Product Serial Number identification (IMEI)
* ---------------------------------------------------------
* Returns information text intended to permit the user to identify the
* individual Mobile Equipment to which it is connected to.
* Action command:
* no parameters
*/
/* CGSN AT command type */
#define AT_COMMAND_CGSN_MASK AT_COMMAND_NO_PARAM
typedef struct at_cgsn_s {} at_cgsn_t;
/* CGMI: Request manufacturer identification
* -----------------------------------------
* Returns information text intended to permit the user to identify the
* manufacturer of the Mobile Equipment to which it is connected to.
* Action command:
* no parameters
*/
/* CGMI AT command type */
#define AT_COMMAND_CGMI_MASK AT_COMMAND_NO_PARAM
typedef struct at_cgmi_s {} at_cgmi_t;
/* CGMM: Request model identification
* ----------------------------------
* Returns information text intended to permit the user to identify the
* specific model of the Mobile Equipment to which it is connected to.
* Action command:
* no parameters
*/
/* CGMM AT command type */
#define AT_COMMAND_CGMM_MASK AT_COMMAND_NO_PARAM
typedef struct at_cgmm_s {} at_cgmm_t;
/* CGMR: Request revision identification
* -------------------------------------
* Returns information text intended to permit the user to identify the
* version, revision level or date, or other pertinent information of the
* Mobile Equipment to which it is connected to.
* Action command:
* no parameters
*/
/* CGMR AT command type */
#define AT_COMMAND_CGMR_MASK AT_COMMAND_NO_PARAM
typedef struct at_cgmr_s {} at_cgmr_t;
/* CIMI: Request International Mobile Subscriber Identity
* ------------------------------------------------------
* Returns <IMSI>, which is intended to permit the user to identify the
* individual SIM card or active application in the UICC (GSM or USIM)
* which is attached to the Mobile Equipment to which it is connected to.
* Action command:
* no parameters
*/
/* CIMI AT command type */
#define AT_COMMAND_CIMI_MASK AT_COMMAND_NO_PARAM
typedef struct at_cimi_s {} at_cimi_t;
/*
* ==============================================
* Mobile Termination control and status commands
* ==============================================
*/
/* CFUN: Set phone functionality
* -----------------------------
* Used to set the Mobile Equipment to different power consumption states
* Parameter command:
* +CFUN=[<fun>[,<rst>]]
* <fun> level of functionality
* <rst> resetting parameter
*/
/* Functionality levels */
#define AT_CFUN_MIN 0 /* minimum functionality */
#define AT_CFUN_FULL 1 /* full functionality */
#define AT_CFUN_SEND 2 /* disable phone transmit RF circuits only */
#define AT_CFUN_RECV 3 /* disable phone receive RF circuits only */
#define AT_CFUN_BOTH 4 /* disable phone both transmit and receive
* RF circuits */
#define AT_CFUN_MAX AT_CFUN_BOTH
/* Maximum value of supported functionality
* level */
#define AT_CFUN_FUN_DEFAULT AT_CFUN_MIN
/* Default functionality level applied when
* no value is given */
/* Resetting parameter values */
#define AT_CFUN_NORST 0 /* do not reset the ME before setting it
* to <fun> power level (default when <rst>
* is not given) */
#define AT_CFUN_RST 1 /* reset the ME before setting it to <fun>
* power level */
#define AT_CFUN_RST_DEFAULT AT_CFUN_NORST
/* Default resetting action applied when
* no value is given */
/* Optional parameter bitmask */
#define AT_CFUN_FUN_MASK AT_COMMAND_PARAM1
#define AT_CFUN_RST_MASK AT_COMMAND_PARAM2
/* CFUN AT command type */
typedef struct {
int fun;
int rst;
} at_cfun_t;
/* CPIN: Enter PIN
* ---------------
* Used to enter MT passwords which are needed before any other
* functionality of the MT can be used
* Parameter command:
* +CPIN=<pin>[,<newpin>]
* <pin> personal identification number
* <newpin> new personal identification number
*/
/* Optional parameter bitmask */
#define AT_CPIN_NEWPIN_MASK AT_COMMAND_PARAM2
/* CPIN AT command type */
typedef struct {
#define AT_CPIN_SIZE USER_PIN_SIZE /* Number of characters in pin parameter */
char pin[AT_CPIN_SIZE+1];
char newpin[AT_CPIN_SIZE+1];
} at_cpin_t;
/* CSQ: Signal quality
* -------------------
* Returns received signal strength indication and channel bit error rate
* from the Mobile Equipment
* Action command:
* no parameters
*/
/* CSQ AT command type */
#define AT_COMMAND_CSQ_MASK AT_COMMAND_NO_PARAM
typedef struct at_csq_s {} at_csq_t;
/* CESQ: Extented signal quality
* -----------------------------
* Returns received signal quality parameters.
* Action command:
* no parameters
*/
/* CESQ AT command type */
#define AT_COMMAND_CESQ_MASK AT_COMMAND_NO_PARAM
typedef struct at_cesq_s {} at_cesq_t;
/* CLAC: List all available AT commands
* ------------------------------------
* Returns one or more lines of AT Commands that are available for the user.
* Action command:
* no parameters
*/
/* CLAC AT command type */
#define AT_COMMAND_CLAC_MASK AT_COMMAND_NO_PARAM
typedef struct at_clac_s {} at_clac_t;
/*
* =========================
* Mobile Termination errors
* =========================
*/
/*
* CMEE: Report mobile termination error
* -------------------------------------
* Disables or enables the use of final result code +CME ERROR: <err> as an
* indication of an error relating to the functionality of the MT.
* <n> = 0, disables result code and displays ERROR instead.
* <n> = 1, enables result code and displays numeric <err>
* <n> = 2, enables result code and displays verbose <err>
* Parameter command:
* +CMEE=[<n>]
* <n> numeric parameter
*/
/* Numeric parameter values */
#define AT_CMEE_OFF 0 /* disable result code */
#define AT_CMEE_NUMERIC 1 /* enable numeric result code */
#define AT_CMEE_VERBOSE 2 /* enable verbose result code */
#define AT_CMEE_N_MIN AT_CMEE_OFF
/* Minimum value of supported numeric parameter */
#define AT_CMEE_N_MAX AT_CMEE_VERBOSE
/* Maximum value of supported numeric parameter */
#define AT_CMEE_N_DEFAULT AT_CMEE_OFF
/* Default value of supported numeric parameter */
/* Optional parameter bitmask */
#define AT_CMEE_N_MASK AT_COMMAND_PARAM1
/* CMEE AT command type */
typedef struct {
int n;
} at_cmee_t;
/*
* ================================
* Network service related commands
* ================================
*/
/* CNUM: Subscriber number
* -----------------------
* Returns the MSISDNs related to the subscriber.
* Action command:
* no parameters
*/
/* CNUM AT command type */
#define AT_COMMAND_CNUM_MASK AT_COMMAND_NO_PARAM
typedef struct at_cnum_s {} at_cnum_t;
/* CLCK: Facility lock
* -------------------
* Used to lock, unlock or interrogate a MT or a network facility <fac>.
* Action command:
* +CLCK=<fac>,<mode>[,<passwd>]
* <fac> facility value
* <mode> operation mode
* <passwd> password (pin code)
*/
/* Facility values */
#define AT_CLCK_SC "SC" /* SIM lock/unlock */
/* Operation mode */
#define AT_CLCK_UNLOCK 0 /* Unlock (enable) a service */
#define AT_CLCK_LOCK 1 /* Lock (disable) a service */
#define AT_CLCK_STATUS 2 /* Query the status of a network service */
/* Optional parameter bitmask */
#define AT_CLCK_PASSWD_MASK AT_COMMAND_PARAM3
/* CLCK AT command type */
typedef struct {
#define AT_CLCK_FAC_SIZE 2
char fac[AT_CLCK_FAC_SIZE+1];
int mode;
#define AT_CLCK_PASSWD_SIZE USER_PIN_SIZE
char passwd[AT_CLCK_PASSWD_SIZE+1];
} at_clck_t;
/* COPS: PLMN selection
* --------------------
* Forces an attempt to select and register the GSM/UMTS/EPS network operator
* using the SIM/USIM card installed in the currently selected card slot.
* Parameter command:
* +COPS=[<mode>[,<format>[,<oper>[,<AcT>]]]]
* <mode> operation mode of the network selection
* <format> representation format of the network operator
* <oper> APN operator identifier
* <AcT> access technology
*/
/* Network selection operation modes */
#define AT_COPS_AUTO 0 /* automatic mode */
#define AT_COPS_MANUAL 1 /* manual mode */
#define AT_COPS_DEREG 2 /* deregister from network */
#define AT_COPS_FORMAT 3 /* set only <format> for read command +COPS? */
#define AT_COPS_MANAUTO 4 /* manual/automatic mode; if manual selection
* fails, automatic mode is entered */
#define AT_COPS_MODE_DEFAULT AT_COPS_AUTO
/* Default operation mode applied when no
* value is given */
/* Representation formats */
#define AT_COPS_LONG NET_FORMAT_LONG /* long format alphanumeric */
#define AT_COPS_SHORT NET_FORMAT_SHORT /* short format alphanumeric */
#define AT_COPS_NUM NET_FORMAT_NUM /* numeric */
#define AT_COPS_FORMAT_MIN AT_COPS_LONG
/* Minimum value of supported representation
* format */
#define AT_COPS_FORMAT_MAX AT_COPS_NUM
/* Maximum value of supported representation
* format */
#define AT_COPS_FORMAT_DEFAULT AT_COPS_LONG
/* Default representation format applied when
* no value is given */
/* Access technology indicators */
#define AT_COPS_GSM NET_ACCESS_GSM /* GSM */
#define AT_COPS_COMPACT NET_ACCESS_COMPACT /* GSM Compact */
#define AT_COPS_UTRAN NET_ACCESS_UTRAN /* UTRAN */
#define AT_COPS_EGPRS NET_ACCESS_EGPRS /* GSM w/EGPRS */
#define AT_COPS_HSDPA NET_ACCESS_HSDPA /* UTRAN w/HSDPA */
#define AT_COPS_HSUPA NET_ACCESS_HSUPA /* UTRAN w/HSUPA */
#define AT_COPS_HSDUPA NET_ACCESS_HSDUPA /* w/HSDPA and HSUPA */
#define AT_COPS_EUTRAN NET_ACCESS_EUTRAN /* E-UTRAN */
#define AT_COPS_ACT_MIN AT_COPS_GSM
/* Minimum value of supported access
* technology */
#define AT_COPS_ACT_MAX AT_COPS_EUTRAN
/* Maximum value of supported access
* technology */
#define AT_COPS_ACT_DEFAULT AT_COPS_GSM
/* Default access technology applied when
* no value is given */
/* Optional parameter bitmask */
#define AT_COPS_MODE_MASK AT_COMMAND_PARAM1
#define AT_COPS_FORMAT_MASK AT_COMMAND_PARAM2
#define AT_COPS_OPER_MASK AT_COMMAND_PARAM3
#define AT_COPS_ACT_MASK AT_COMMAND_PARAM4
/* COPS AT command type */
typedef struct {
int mode;
int format;
#define AT_COPS_NUM_SIZE NET_FORMAT_NUM_SIZE
/* Size of numeric representation format */
#define AT_COPS_LONG_SIZE NET_FORMAT_LONG_SIZE
/* Size of long alphanumeric representation format */
#define AT_COPS_SHORT_SIZE NET_FORMAT_SHORT_SIZE
/* Size of short alphanumeric representation format */
network_plmn_t plmn;
int AcT;
} at_cops_t;
/* CREG: network registration
* --------------------------
* When <n>=1, returns +CREG: <stat>, the Mobile Equipment's circuit mode
* network registration status in GERA/UTRA/E-UTRA Network.
* When <n>=2, returns +CREG: <stat>[,<lac>,<ci>[,<AcT>]], the Mobile
* Equipment's circuit mode network registration status and location information
* in GERA/UTRA/E-UTRA Network.
* Parameter command:
* +CREG=[<n>]
* <n> numeric parameter
*/
/* Numeric parameter values */
#define AT_CREG_OFF 0 /* disable network registration unsolicited
* result code */
#define AT_CREG_ON 1 /* enable network registration unsolicited
* result code +CREG: <stat> */
#define AT_CREG_BOTH 2 /* enable network registration and location
* information unsolicited result code
* +CREG: <stat>[,<lac>,<ci>[,<AcT>]] */
#define AT_CREG_N_MIN AT_CREG_OFF
/* Minimum value of supported unsolicited
* result code */
#define AT_CREG_N_MAX AT_CREG_BOTH
/* Maximum value of supported unsolicited
* result code */
#define AT_CREG_N_DEFAULT AT_CREG_OFF
/* Default unsolicited result code applied
* when no value is given */
/* Optional parameter bitmask */
#define AT_CREG_N_MASK AT_COMMAND_PARAM1
/* CREG AT command type */
typedef struct {
int n;
} at_creg_t;
/*
* ==========================
* Commands for Packet Domain
* ==========================
*/
/* CGATT: EPS service attach/detach
* --------------------------------
* Used to attach the MT to, or detach the MT from, the EPS service.
* Action command (with optional parameters):
* +CGATT=[<state>]
* <state> numeric parameter that indicates the state of EPS attachment
*/
/* PS attachment status */
#define AT_CGATT_DETACHED 0 /* To detach from EPS service */
#define AT_CGATT_ATTACHED 1 /* To attach from EPS service */
#define AT_CGATT_STATE_MIN AT_CGATT_DETACHED
/* Minimum value of EPS attachment code */
#define AT_CGATT_STATE_MAX AT_CGATT_ATTACHED
/* Maximum value of EPS attachment code */
/* Optional parameter bitmask */
#define AT_CGATT_STATE_MASK AT_COMMAND_PARAM1
/* CGATT AT command type */
typedef struct {
int state;
} at_cgatt_t;
/* CGREG: GPRS network registration status
* ---------------------------------------
* When <n>=1, returns +CGREG: <stat>, the Mobile Equipment's GPRS network
* registration status in GERA/UTRA Network.
* When <n>=2, returns +CGREG: <stat>[,<lac>,<ci>[,<AcT>,<rac>]], the Mobile
* Equipment's GPRS network registration status and location information in
* GERA/UTRA Network.
* Parameter command:
* +CGREG=[<n>]
* <n> numeric parameter
*/
/* Numeric parameter values */
#define AT_CGREG_OFF 0 /* disable network registration unsolicited
* result code */
#define AT_CGREG_ON 1 /* enable network registration unsolicited
* result code +CGREG: <stat> */
#define AT_CGREG_BOTH 2 /* enable network registration and location
* information unsolicited result code
* +CGREG: <stat>[,<lac>,<ci>[,<AcT>,<rac>]] */
#define AT_CGREG_N_MIN AT_CGREG_OFF
/* Minimum value of supported unsolicited
* result code */
#define AT_CGREG_N_MAX AT_CGREG_BOTH
/* Maximum value of supported unsolicited
* result code */
#define AT_CGREG_N_DEFAULT AT_CGREG_OFF
/* Default unsolicited result code applied
* when no value is given */
/* Optional parameter bitmask */
#define AT_CGREG_N_MASK AT_COMMAND_PARAM1
/* CGREG AT command type */
typedef struct {
int n;
} at_cgreg_t;
/* CEREG: EPS network registration status
* --------------------------------------
* When <n>=1, returns +CEREG: <stat>, the Mobile Equipment's EPS services
* registration status in EUTRA Network.
* When <n>=2, returns +CEREG: <stat>[,<tac>,<ci>[,<AcT>]], the Mobile
* Equipment's EPS services registration status and location information in
* EUTRA Network.
* Parameter command:
* +CEREG=[<n>]
* <n> numeric parameter
*/
/* Numeric parameter values */
#define AT_CEREG_OFF 0 /* disable network registration unsolicited
* result code */
#define AT_CEREG_ON 1 /* enable network registration unsolicited
* result code +CEREG: <stat> */
#define AT_CEREG_BOTH 2 /* enable network registration and location
* information unsolicited result code
* +CEREG: <stat>[,<tac>,<ci>[,<AcT>]] */
#define AT_CEREG_N_MIN AT_CEREG_OFF
/* Minimum value of supported unsolicited
* result code */
#define AT_CEREG_N_MAX AT_CEREG_BOTH
/* Maximum value of supported unsolicited
* result code */
#define AT_CEREG_N_DEFAULT AT_CEREG_OFF
/* Default unsolicited result code applied
* when no value is given */
/* Optional parameter bitmask */
#define AT_CEREG_N_MASK AT_COMMAND_PARAM1
/* CEREG AT command type */
typedef struct {
int n;
} at_cereg_t;
/* CGDCONT: Define PDP Context
* ---------------------------
* Specifies PDP context parameter values for a PDP context identified by
* the (local) context identification parameter, <cid>.
* Parameter command:
* +CGDCONT=[<cid>[,<PDP_type>[,<APN>[,<PDP_addr>[,<d_comp>[,<h_comp>
* [,<IPv4AddrAlloc>[,<emergency indication>[,<P-CSCF_discovery>
* [,<IM_CN_Signalling_Flag_Ind>]]]]]]]]]]
* <cid> a numeric parameter which specifies a particular PDP
* context definition
* <PDP_type> type of packet data protocol ("IP", "IPV6", "IPV4V6")
* <APN> Access Point logical Name
* <PDP_addr> Mobile Equipment PDP address (not applicable to EPS)
* <d_comp> PDP data compression parameter
* <h_comp> PDP header compression parameter
* <IPv4AddrAlloc> IPv4 address allocation parameter
* <emergency indication> emergency bearer services support indication
* <P-CSCF_discovery> P-CSCF address discovery parameter
* <IM_CN_Signalling_Flag_Ind> IM CN subsystem-related signalling
* support indication
*/
/* PDP context identifier */
#define AT_CGDCONT_CID_MIN 1 /* Minimum value of context identifier */
#define AT_CGDCONT_CID_DEFAULT AT_CGDCONT_CID_MIN
/* PDP data compression parameter values */
#define AT_CGDCONT_D_COMP_OFF 0 /* PDP data compression is disabled */
#define AT_CGDCONT_D_COMP_ON 1 /* manufacturer preferred compression */
#define AT_CGDCONT_D_COMP_V42B 2 /* V.42bis */
#define AT_CGDCONT_D_COMP_V44 3 /* V.44 */
#define AT_CGDCONT_D_COMP_MIN AT_CGDCONT_D_COMP_OFF
#define AT_CGDCONT_D_COMP_MAX AT_CGDCONT_D_COMP_V44
#define AT_CGDCONT_D_COMP_DEFAULT AT_CGDCONT_D_COMP_OFF
/* PDP header compression parameter values */
#define AT_CGDCONT_H_COMP_OFF 0 /* PDP header compression is disabled */
#define AT_CGDCONT_H_COMP_ON 1 /* manufacturer preferred compression */
#define AT_CGDCONT_H_COMP_1144 2 /* RFC1144 (applicable for SNDCP only) */
#define AT_CGDCONT_H_COMP_2507 3 /* RFC2507 */
#define AT_CGDCONT_H_COMP_3095 4 /* RFC3095 (applicable for PDCP only) */
#define AT_CGDCONT_H_COMP_MIN AT_CGDCONT_H_COMP_OFF
#define AT_CGDCONT_H_COMP_MAX AT_CGDCONT_H_COMP_3095
#define AT_CGDCONT_H_COMP_DEFAULT AT_CGDCONT_H_COMP_OFF
/* IPv4AddrAlloc parameter values */
#define AT_CGDCONT_IPV4_NAS 0 /* IPv4 Address Allocation through NAS
* Signalling */
#define AT_CGDCONT_IPV4_DHCP 1 /* IPv4 Address Allocation through DHCP */
#define AT_CGDCONT_IPV4_MIN AT_CGDCONT_IPV4_NAS
#define AT_CGDCONT_IPV4_MAX AT_CGDCONT_IPV4_DHCP
#define AT_CGDCONT_IPV4_DEFAULT AT_CGDCONT_IPV4_NAS
/* emergency_indication parameter values */
#define AT_CGDCONT_EBS_OFF 0 /* PDP context is not for emergency bearer
* services */
#define AT_CGDCONT_EBS_ON 1 /* PDP context is for emergency bearer
* services */
#define AT_CGDCONT_EBS_MIN AT_CGDCONT_EBS_OFF
#define AT_CGDCONT_EBS_MAX AT_CGDCONT_EBS_ON
#define AT_CGDCONT_EBS_DEFAULT AT_CGDCONT_EBS_OFF
/* P_CSCF_discovery parameter values */
#define AT_CGDCONT_PCSCF_OFF 0 /* Preference of P-CSCF address discovery
* not influenced by +CGDCONTPDP */
#define AT_CGDCONT_PCSCF_NAS 1 /* Preference of P-CSCF address discovery
* through NAS Signalling */
#define AT_CGDCONT_PCSCF_DHCP 2 /* Preference of P-CSCF address discovery
* through DHCP */
#define AT_CGDCONT_PCSCF_MIN AT_CGDCONT_PCSCF_OFF
#define AT_CGDCONT_PCSCF_MAX AT_CGDCONT_PCSCF_DHCP
#define AT_CGDCONT_PCSCF_DEFAULT AT_CGDCONT_PCSCF_OFF
/* IM_CN_Signalling_Flag_Ind parameter values */
#define AT_CGDCONT_IM_CN_OFF 0 /* UE indicates that the PDP context is not
* for IM CN subsystem-related signalling
* only */
#define AT_CGDCONT_IM_CN_ON 1 /* UE indicates that the PDP context is for
* IM CN subsystem-related signalling
* only */
#define AT_CGDCONT_IM_CM_MIN AT_CGDCONT_IM_CN_OFF
#define AT_CGDCONT_IM_CM_MAX AT_CGDCONT_IM_CN_ON
#define AT_CGDCONT_IM_CM_DEFAULT AT_CGDCONT_IM_CN_OFF
/* Optional parameter bitmask */
#define AT_CGDCONT_CID_MASK AT_COMMAND_PARAM1
#define AT_CGDCONT_PDP_TYPE_MASK AT_COMMAND_PARAM2
#define AT_CGDCONT_APN_MASK AT_COMMAND_PARAM3
#define AT_CGDCONT_PDP_ADDR_MASK AT_COMMAND_PARAM4
#define AT_CGDCONT_D_COMP_MASK AT_COMMAND_PARAM5
#define AT_CGDCONT_H_COMP_MASK AT_COMMAND_PARAM6
#define AT_CGDCONT_IPV4ADDRALLOC_MASK AT_COMMAND_PARAM7
#define AT_CGDCONT_EMERGECY_INDICATION_MASK AT_COMMAND_PARAM8
#define AT_CGDCONT_P_CSCF_DISCOVERY_MASK AT_COMMAND_PARAM9
#define AT_CGDCONT_IM_CN_SIGNALLING_FLAG_IND_MASK AT_COMMAND_PARAM10
/* CGDCONT AT command type */
typedef struct {
int cid;
#define AT_CGDCONT_PDP_SIZE 6 /* PDP_type may be "IP", "IPV6", "IPV4V6" */
char PDP_type[AT_CGDCONT_PDP_SIZE+1];
#define AT_CGDCONT_APN_SIZE 100 /* number of characters in APN parameter */
char APN[AT_CGDCONT_APN_SIZE+1];
#define AT_CGDCONT_ADDR_SIZE 63 /* number of characters in PDP addr
* parameter (IPv6 address notation) */
char PDP_addr[AT_CGDCONT_ADDR_SIZE+1]; /* Does not apply to EPS */
int d_comp;
int h_comp;
int IPv4AddrAlloc;
int emergency_indication;
int P_CSCF_discovery;
int IM_CN_Signalling_Flag_Ind;
} at_cgdcont_t;
/* CGACT: PDP context activate or deactivate
* -----------------------------------------
* Used to activate or deactivate the specified PDP context(s).
* Action command (with optional parameters):
* +CGACT=[<state>[,<cid>[,<cid>[,...]]]]
* <state> numeric parameter that indicates the state of PDP context
* activation
* <cid> a numeric parameter which specifies a particular PDP context
* definition
*/
/* PDP context identifier */
#define AT_CGACT_CID_MIN 1 /* Minimum value of context identifier */
/* PDP context activation status */
#define AT_CGACT_DEACTIVATED 0 /* To deactivate the PDP context */
#define AT_CGACT_ACTIVATED 1 /* To activate the PDP context */
#define AT_CGACT_STATE_MIN AT_CGACT_DEACTIVATED
#define AT_CGACT_STATE_MAX AT_CGACT_ACTIVATED
#define AT_CGACT_STATE_DEFAULT AT_CGACT_DEACTIVATED
/* Optional parameter bitmask */
#define AT_CGACT_STATE_MASK AT_COMMAND_PARAM1
#define AT_CGACT_CID_MASK AT_COMMAND_PARAM2
/* CGACT AT command type */
typedef struct {
int state;
int cid;
} at_cgact_t;
/* CGPADDR: Show PDP address(es)
* -----------------------------
* Returns a list of PDP addresses for the specified context identifiers.
* +CGPADDR=[<cid>[,<cid>[,...]]]
* <cid> a numeric parameter which specifies a particular PDP
* context definition
*/
/* PDP context identifier */
#define AT_CGPADDR_CID_MIN 1 /* Minimum value of context identifier */
/* Optional parameter bitmask */
#define AT_CGPADDR_CID_MASK AT_COMMAND_PARAM1
/* CGPADDR AT command type */
typedef struct {
int cid;
} at_cgpaddr_t;
/*
* =================================
* Global AT command type definition
* =================================
*/
/* AT command type */
typedef struct {
at_command_id_t id; /* AT command identifier */
at_command_type_t type; /* AT command type */
int mask; /* Optional parameter bitmask */
union {
at_cgsn_t cgsn;
at_cgmm_t cgmm;
at_cgmr_t cgmr;
at_cimi_t cimi;
at_cfun_t cfun;
at_cpin_t cpin;
at_csq_t csq;
at_cesq_t cesq;
at_clac_t clac;
at_cmee_t cmee;
at_cnum_t cnum;
at_clck_t clck;
at_cops_t cops;
at_cgatt_t cgatt;
at_creg_t creg;
at_cgreg_t cgreg;
at_cereg_t cereg;
at_cgdcont_t cgdcont;
at_cgact_t cgact;
at_cgpaddr_t cgpaddr;
} command;
} at_command_t;
/****************************************************************************/
/******************** G L O B A L V A R I A B L E S ********************/
/****************************************************************************/
/****************************************************************************/
/****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/
/****************************************************************************
** **
** Name: at_command_decode() **
** **
** Description: Parses AT command line and accordingly fills data struc- **
** ture. The main functions of the AT command parser are: **
** - check the AT command syntax **
** - fill parameter values into the data structure **
** **
** Inputs: buffer: Pointer to the buffer containing AT com- **
** mand line **
** length: Number of bytes that should be processed **
** Others: None **
** **
** Outputs: at_command: AT command data structure to be filled **
** Return: The number of AT commands successfully **
** decoded; RETURNerror if an error occurred **
** Others: None **
** **
***************************************************************************/
int at_command_decode(const char* buffer, int length, at_command_t* at_command);
/****************************************************************************
** **
** Name: at_command_get_list() **
** **
** Description: Returns the list of supported AT commands. **
** **
** Inputs: buffer: Pointer to the buffer containing the **
** string representaton of the first AT com- **
** mand that is supported by the NAS sublayer **
** n_max: Maximum number of AT commands the buffer **
** may contain **
** Others: None **
** **
** Outputs: None **
** Return: The number of AT commands actually suppor- **
** ted by the NAS sublayer **
** Others: None **
** **
***************************************************************************/
int at_command_get_list(const char** buffer, int n_max);
#endif /* __AT_COMMAND_H__*/
+438
View File
@@ -0,0 +1,438 @@
/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenAirInterface is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>.
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
*******************************************************************************/
/*****************************************************************************
Source at_error.c
Version 0.1
Date 2012/03/12
Product NAS stack
Subsystem Application Programming Interface
Author Frederic Maurel
Description Defines error codes returned when execution of AT command
failed.
*****************************************************************************/
#include "at_error.h"
#include "commonDef.h"
#include "nas_log.h"
#include <string.h> // strcpy
#include <stdio.h> // sprintf
/****************************************************************************/
/**************** E X T E R N A L D E F I N I T I O N S ****************/
/****************************************************************************/
extern int at_response_format_v1;
/*
* Result code suppression indicator (set by ATQ0 and ATQ1)
* -------------------------------------------------------
* FALSE - Result codes are transmitted to the user application
* TRUE - Result codes are suppressed and not transmitted
*/
int at_error_code_suppression_q1 = FALSE;
/*
* Verbose mode indicator (set by ATV0, ATV1 and AT+CMEE)
* ------------------------------------------------------
*/
at_error_format_t at_error_format = AT_ERROR_OFF;
/****************************************************************************/
/******************* L O C A L D E F I N I T I O N S *******************/
/****************************************************************************/
/*
* General errors
* --------------
*/
static const char * _at_error_str[] = {
"phone failure",
"no connection to phone",
"phone-adaptor link reserved",
"operation not allowed",
"operation not supported",
"PH-SIM PIN required",
"PH-FSIM PIN required",
"PH-FSIM PUK required",
NULL,
NULL,
"SIM not inserted",
"SIM PIN required",
"SIM PUK required",
"SIM failure",
"SIM busy",
"SIM wrong",
"incorrect password",
"SIM PIN2 required",
"SIM PUK2 required",
NULL,
"memory full",
"invalid index",
"not found",
"memory failure",
"text string too long",
"invalid characters in text string",
"dial string too long",
"invalid characters in dial string",
NULL,
NULL,
"no network service",
"network timeout",
"network not allowed - emergency calls only",
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
"network personalization PIN required",
"network personalization PUK required",
"network subset personalization PIN required",
"network subset personalization PUK required",
"service provider personalization PIN required",
"service provider personalization PUK required",
"corporate personalization PIN required",
"corporate personalization PUK required",
"hidden key required",
"EAP method not supported",
"Incorrect parameters",
};
/*
* GPRS-related errors
* -------------------
*/
static const char* _at_error_gprs[] = {
"Illegal MS",
NULL,
NULL,
"Illegal ME",
"GPRS services not allowed",
NULL,
NULL,
NULL,
"PLMN not allowed",
"Location area not allowed",
"Roaming not allowed in this location area",
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
"service option not supported",
"requested service option not subscribed",
"service option temporarily out of order",
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
"unspecified GPRS error",
"PDP authentication failure",
"invalid mobile class",
"Last PDN disconnection not allowed",
};
/*
* VBS / VGCS and eMLPP -related errors
* ------------------------------------
*/
static const char* _at_error_vbs[] = {
/* 151 "VBS/VGCS not supported by the network" */
"No service subscription on SIM",
"No subscription for group ID",
"Group Id not activated on SIM",
"No matching notification",
"VBS/VGCS call already present",
"Congestion",
"Network failure",
"Uplink busy",
"No access rights for SIM file",
"No subscription for priority",
"operation not applicable or not possible",
"Group Id prefixes not supported",
"Group Id prefixes not usable for VBS",
"Group Id prefix value invalid",
};
/* Returns the verbose value of AT command error */
static const char* _at_error_to_string(int error);
static int _at_error_encode_ok(char* buffer);
static int _at_error_encode_ko(char* buffer, at_error_type_t type, int error);
/****************************************************************************/
/****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/
/****************************************************************************
** **
** Name: at_error_set_format() **
** **
** Description: Sets the format of the error code **
** **
** Inputs: format: Format of the error code **
** Others: None **
** **
** Outputs: Return: None **
** Others: at_error_format **
** **
***************************************************************************/
void at_error_set_format(at_error_format_t format)
{
LOG_FUNC_IN;
at_error_format = format;
LOG_FUNC_OUT;
}
/****************************************************************************
** **
** Name: at_error_get_format() **
** **
** Description: Gets the format of the error code **
** **
** Inputs: format: Format of the error code **
** Others: None **
** **
** Outputs: Return: None **
** Others: at_error_format **
** **
***************************************************************************/
at_error_format_t at_error_get_format(void)
{
LOG_FUNC_IN;
LOG_FUNC_RETURN (at_error_format);
}
/****************************************************************************
** **
** Name: at_error_encode() **
** **
** Description: Encodes result code returned when AT command has been **
** processed. Result code can be OK or 0, if the command **
** succeed, ERROR or 4, if the command failed; depending of **
** the response format selected by the user. **
** **
** Inputs type: Type of the error code to encode **
** error: Error code to encode **
** Others: None **
** **
** Outputs: buffer: Pointer to the encoded data buffer **
** Return: The number of characters that have been **
** successfully encoded; **
** Others: None **
** **
***************************************************************************/
int at_error_encode(char* buffer, at_error_type_t type, int error)
{
LOG_FUNC_IN;
int bytes = 0;
/* Result code suppression (ATQ0, ATQ1) */
if (at_error_code_suppression_q1) {
LOG_FUNC_RETURN (0);
}
if (type == AT_ERROR_OK) {
/* Encode success return code */
bytes = _at_error_encode_ok(buffer);
} else {
/* Encode failure return code */
bytes = _at_error_encode_ko(buffer, type, error);
}
LOG_FUNC_RETURN (bytes);
}
/****************************************************************************/
/********************* L O C A L F U N C T I O N S *********************/
/****************************************************************************/
/****************************************************************************
** **
** Name: _at_error_encode_ok() **
** **
** Description: Encodes AT command success result code message **
** **
** Inputs None **
** Others: None **
** **
** Outputs: buffer: Pointer to the encoded data buffer **
** Return: The number of characters that have been **
** successfully encoded; **
** Others: None **
** **
***************************************************************************/
static int _at_error_encode_ok(char* buffer)
{
LOG_FUNC_IN;
int offset = 0;
if (at_response_format_v1) {
offset += sprintf(buffer, "\r\n");
}
offset += sprintf(buffer + offset, "OK\r\n");
LOG_FUNC_RETURN (offset);
}
/****************************************************************************
** **
** Name: _at_error_encode_ko() **
** **
** Description: Encodes AT command error code message **
** **
** Inputs type: Type of the error code to encode **
** error: Error code to encode **
** Others: at_error_format **
** **
** Outputs: buffer: Pointer to the encoded data buffer **
** Return: The number of characters that have been **
** successfully encoded; **
** Others: None **
** **
***************************************************************************/
static int _at_error_encode_ko(char* buffer, at_error_type_t type, int error)
{
LOG_FUNC_IN;
int offset = 0;
if (at_response_format_v1) {
offset += sprintf(buffer, "\r\n");
}
/* Result code is disabled */
if (at_error_format == AT_ERROR_OFF) {
offset += sprintf(buffer + offset, "ERROR\r\n");
} else {
/* Error related to execution of AT command operation */
if (type == AT_ERROR_CME) {
offset += sprintf(buffer + offset, "+CME ERROR: ");
}
/* Result code is enabled for numeric values */
if (at_error_format == AT_ERROR_NUMERIC) {
offset += sprintf(buffer + offset, "%d\r\n", error);
}
/* Result code is enabled for verbose values */
else {
const char* error_str = _at_error_to_string(error);
if (error_str != NULL) {
offset += sprintf(buffer + offset, "%s\r\n", error_str);
} else {
/* Error code is not valid */
offset += sprintf(buffer + offset, "invalid error code\r\n");
}
}
}
LOG_FUNC_RETURN (offset);
}
/****************************************************************************
** **
** Name: at_error_to_string() **
** **
** Description: Returns the verbose value of AT command error **
** **
** Inputs: error: AT command error identifier **
** Others: None **
** **
** Outputs: Return: The error's verbose value **
** NULL if the error code is not valid **
** Others: None **
** **
***************************************************************************/
static const char* _at_error_to_string(int error)
{
if (error < AT_ERROR_LAST_GENERAL_ERROR + 1) {
/* General errors */
if (error > AT_ERROR_FIRST_GENERAL_ERROR - 1) {
return _at_error_str[error];
} else {
return NULL;
}
} else if (error < AT_ERROR_LAST_GPRS_RELATED_ERROR + 1) {
/* GPRS-related errors */
if (error > AT_ERROR_FIRST_GPRS_RELATED_ERROR - 1) {
return _at_error_gprs[error - AT_ERROR_FIRST_GPRS_RELATED_ERROR];
} else {
return NULL;
}
} else if (error < AT_ERROR_LAST_VBS_RELATED_ERROR + 1) {
/* VBS / VGCS and eMLPP -related errors */
if (error > AT_ERROR_FIRST_VBS_RELATED_ERROR - 1) {
return _at_error_vbs[error - AT_ERROR_FIRST_VBS_RELATED_ERROR];
} else {
return NULL;
}
}
return NULL;
}
+201
View File
@@ -0,0 +1,201 @@
/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenAirInterface is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>.
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
*******************************************************************************/
/*****************************************************************************
Source at_error.h
Version 0.1
Date 2012/03/12
Product NAS stack
Subsystem Application Programming Interface
Author Frederic Maurel
Description Defines error codes returned when execution of AT command
failed.
*****************************************************************************/
#ifndef __AT_ERROR_H__
#define __AT_ERROR_H__
/****************************************************************************/
/********************* G L O B A L C O N S T A N T S *******************/
/****************************************************************************/
/*
* Cause code used to notify that the NAS procedure has been successfully
* processed
*/
#define AT_ERROR_SUCCESS (-1)
/*
* General errors
* --------------
*/
#define AT_ERROR_FIRST_GENERAL_ERROR AT_ERROR_PHONE_FAILURE
#define AT_ERROR_PHONE_FAILURE 0
#define AT_ERROR_NO_CONNECTION_TO_PHONE 1
#define AT_ERROR_PHONE_ADAPTOR_LINK_RESERVED 2
#define AT_ERROR_OPERATION_NOT_ALLOWED 3
#define AT_ERROR_OPERATION_NOT_SUPPORTED 4
#define AT_ERROR_PHSIM_PIN_REQUIRED 5
#define AT_ERROR_PHFSIM_PIN_REQUIRED 6
#define AT_ERROR_PHFSIM_PUK_REQUIRED 7
#define AT_ERROR_SIM_NOT_INSERTED 10
#define AT_ERROR_SIM_PIN_REQUIRED 11
#define AT_ERROR_SIM_PUK_REQUIRED 12
#define AT_ERROR_SIM_FAILURE 13
#define AT_ERROR_SIM_BUSY 14
#define AT_ERROR_SIM_WRONG 15
#define AT_ERROR_INCORRECT_PASSWD 16
#define AT_ERROR_SIM_PIN2_REQUIRED 17
#define AT_ERROR_SIM_PUK2_REQUIRED 18
#define AT_ERROR_MEMORY_FULL 20
#define AT_ERROR_INVALID_INDEX 21
#define AT_ERROR_NOT_FOUND 22
#define AT_ERROR_MEMORY_FAILURE 23
#define AT_ERROR_TEXT_STRING_TOO_LONG 24
#define AT_ERROR_TEXT_STRING_INVALID_CHAR 25
#define AT_ERROR_DIAL_STRING_TOO_LONG 26
#define AT_ERROR_DIAL_STRING_INVALID_CHAR 27
#define AT_ERROR_NO_NETWORK_SERVICE 30
#define AT_ERROR_TIMEOUT 31
#define AT_ERROR_NETWORK_NOT_ALLOWED 32
#define AT_ERROR_NETWORK_PERSO_PIN_REQUIRED 40
#define AT_ERROR_NETWORK_PERSO_PUK_REQUIRED 41
#define AT_ERROR_NETWORK_SUBNET_PERSO_PIN_REQUIRED 42
#define AT_ERROR_SUBNET_PERSO_PUK_REQUIRED 43
#define AT_ERROR_PROVIDER_PERSO_PIN_REQUIRED 44
#define AT_ERROR_PROVIDER_PERSO_PUK_REQUIRED 45
#define AT_ERROR_CORPORATE_PERSO_PIN_REQUIRED 46
#define AT_ERROR_CORPORATE_PERSO_PUK_REQUIRED 47
#define AT_ERROR_HIDDEN_KEY_REQUIRED 48
#define AT_ERROR_EAP_METHOD_NOT_SUPPORTED 49
#define AT_ERROR_INCORRECT_PARAMETERS 50
#define AT_ERROR_LAST_GENERAL_ERROR AT_ERROR_INCORRECT_PARAMETERS
#define AT_ERROR_UNKNOWN 100
/*
* GPRS-related errors
* -------------------
*/
/* Errors related to a failure to perform an attach */
#define AT_ERROR_FIRST_GPRS_RELATED_ERROR AT_ERROR_ILLEGAL_MS
#define AT_ERROR_ILLEGAL_MS 103
#define AT_ERROR_ILLEGAL_ME 106
#define AT_ERROR_GPRS_NOT_ALLOWED 107
#define AT_ERROR_PLMN_NOT_ALLOWED 111
#define AT_ERROR_LOCATION_AREA_NOT_ALLOWED 112
#define AT_ERROR_ROAMING_NOT_ALLOWED 113
/* Errors related to a failure to activate a context */
#define AT_ERROR_OPTION_NOT_SUPPORTED 132
#define AT_ERROR_OPTION_NOT_SUBSCRIBED 133
#define AT_ERROR_OPTION_TEMPORARILY_OUT_OF_ORDER 134
#define AT_ERROR_PDP_AUTHENTICATION_FAILURE 149
/* Errors related to a failure to disconnect a PDN */
#define AT_ERROR_LAST_PDP_DISCONNECT_NOT_ALLOWED 151
/* Other GPRS errors */
#define AT_ERROR_UNSPECIFIED_GPRS_ERROR 148
#define AT_ERROR_INVALID_MOBILE_CLASS 150
#define AT_ERROR_LAST_GPRS_RELATED_ERROR AT_ERROR_LAST_PDP_DISCONNECT_NOT_ALLOWED
/*
* VBS / VGCS and eMLPP -related errors
* ------------------------------------
*/
#define AT_ERROR_FIRST_VBS_RELATED_ERROR AT_ERROR_NO_SERVICE_SUBSCRIPTION_ON_SIM
/* AT_ERROR_VBS_VGCS_NOT_SUPPORTED=151,*/ /* !!! Conflict with AT_ERROR_LAST_PDP_DISCONNECT_NOT_ALLOWED !!! */
#define AT_ERROR_NO_SERVICE_SUBSCRIPTION_ON_SIM 152
#define AT_ERROR_NO_SUBSCRIPTION_FOR_GROUP_ID 153
#define AT_ERROR_GROUP_ID_NOT_ACTIVATED_ON_SIM 154
#define AT_ERROR_NO_MATCHING_NOTIFICATION 155
#define AT_ERROR_VBS_VGCS_CALL_ALREADY_PRESENT 156
#define AT_ERROR_CONGESTION 157
#define AT_ERROR_NETWORK_FAILURE 158
#define AT_ERROR_UPLINK_BUSY 159
#define AT_ERROR_NO_ACCESS_RIGHTS_FOR_SIM_FILE 160
#define AT_ERROR_NO_SUBSCRIPTION_FOR_PRIORITY 161
#define AT_ERROR_OPERATION_NOT_APPLICABLE_OR_NOT_POSSIBLE 162
#define AT_ERROR_GROUP_ID_PREFIXES_NOT_SUPPORTED 163
#define AT_ERROR_GROUP_ID_PREFIXES_NOT_USABLE_FOR_VBS 164
#define AT_ERROR_GROUP_ID_PREFIX_VALUE_INVALID 165
#define AT_ERROR_LAST_VBS_RELATED_ERROR AT_ERROR_GROUP_ID_PREFIX_VALUE_INVALID
/****************************************************************************/
/************************ G L O B A L T Y P E S ************************/
/****************************************************************************/
/*
* Error type identifiers
*/
typedef enum {
AT_ERROR_NONE, /* No error code displayed */
AT_ERROR_OK, /* AT command successfully processed */
AT_ERROR_SYNTAX, /* AT command syntax error */
AT_ERROR_CME, /* Error related to execution of AT command
* operation */
} at_error_type_t;
/*
* Error code format identifiers
*/
typedef enum {
AT_ERROR_OFF, /* disable result code and use ERROR instead */
AT_ERROR_NUMERIC, /* enable result code and use numeric error values */
AT_ERROR_VERBOSE, /* enable result code and use verbose error values */
} at_error_format_t;
/****************************************************************************/
/******************** G L O B A L V A R I A B L E S ********************/
/****************************************************************************/
/****************************************************************************/
/****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/
void at_error_set_format(at_error_format_t format);
at_error_format_t at_error_get_format(void);
int at_error_encode(char* buffer, at_error_type_t type, int error);
#endif /* __AT_ERROR_H__*/
File diff suppressed because it is too large Load Diff
+789
View File
@@ -0,0 +1,789 @@
/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenAirInterface is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>.
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
*******************************************************************************/
/*****************************************************************************
Source at_response.h
Version 0.1
Date 2012/03/09
Product NAS stack
Subsystem Application Programming Interface
Author Frederic Maurel
Description Defines structure of the AT command response returned after
completion of AT command processing.
*****************************************************************************/
#ifndef __AT_RESPONSE_H__
#define __AT_RESPONSE_H__
#include "at_command.h"
#include "commonDef.h"
#include "networkDef.h"
/****************************************************************************/
/********************* G L O B A L C O N S T A N T S *******************/
/****************************************************************************/
/*
* Total number of characters, including line terminators, in information text
*/
#define AT_RESPONSE_INFO_TEXT_SIZE 2048
/*
* Value of the mask parameter for AT command reponses without any optional
* parameters
*/
#define AT_RESPONSE_NO_PARAM AT_COMMAND_PARAM0
/*
* Maximum value of an AT command response identifier
*/
#define AT_RESPONSE_ID_MAX AT_COMMAND_ID_MAX
/****************************************************************************/
/************************ G L O B A L T Y P E S ************************/
/****************************************************************************/
/*
* ================
* General commands
* ================
*/
/* CGSN: Request Product Serial Number identification (IMEI)
* ---------------------------------------------------------
* Returns information text intended to permit the user to identify the
* individual Mobile Equipment to which it is connected to.
* Action command:
* +CGSN returns <sn>
* <sn> information text containing the IMEI
*/
/* Optional parameter bitmask */
#define AT_RESPONSE_CGSN_MASK AT_RESPONSE_NO_PARAM
/* CGSN AT command response type */
typedef struct {
char sn[AT_RESPONSE_INFO_TEXT_SIZE+1];
} at_cgsn_resp_t;
/* CGMI: Request manufacturer identification
* -----------------------------------------
* Returns information text intended to permit the user to identify the
* manufacturer of the Mobile Equipment to which it is connected to.
* Action command:
* +CGMI returns <manufacturer>
* <manufacturer> information text containing the manufacturer id
*/
/* Optional parameter bitmask */
#define AT_RESPONSE_CGMI_MASK AT_RESPONSE_NO_PARAM
/* CGMI AT command response type */
typedef struct {
char manufacturer[AT_RESPONSE_INFO_TEXT_SIZE+1];
} at_cgmi_resp_t;
/* CGMM: Request model identification
* ----------------------------------
* Returns information text intended to permit the user to identify the
* specific model of the Mobile Equipment to which it is connected to.
* +CGMM returns <model>
* <model> information text containing the model id
*/
/* Optional parameter bitmask */
#define AT_RESPONSE_CGMM_MASK AT_RESPONSE_NO_PARAM
/* CGMM AT command response type */
typedef struct {
char model[AT_RESPONSE_INFO_TEXT_SIZE+1];
} at_cgmm_resp_t;
/* CGMR: Request revision identification
* -------------------------------------
* Returns information text intended to permit the user to identify the
* version, revision level or date, or other pertinent information of the
* Mobile Equipment to which it is connected to.
* +CGMR returns <revision>
* <revision> information text containing the revision of the firmware
*/
/* Optional parameter bitmask */
#define AT_RESPONSE_CGMR_MASK AT_RESPONSE_NO_PARAM
/* CGMR AT command response type */
typedef struct {
char revision[AT_RESPONSE_INFO_TEXT_SIZE+1];
} at_cgmr_resp_t;
/* CIMI: Request International Mobile Subscriber Identity
* ------------------------------------------------------
* Returns <IMSI>, which is intended to permit the user to identify the
* individual SIM card or active application in the UICC (GSM or USIM)
* which is attached to the Mobile Equipment to which it is connected to.
* Action command:
* +CIMI returns <IMSI>
* <IMSI> International Mobile Subscriber Identity (string without
* double quotes)
*/
/* Optional parameter bitmask */
#define AT_RESPONSE_CIMI_MASK AT_RESPONSE_NO_PARAM
/* CIMI AT command response type */
typedef struct {
char IMSI[AT_RESPONSE_INFO_TEXT_SIZE+1];
} at_cimi_resp_t;
/*
* ==============================================
* Mobile Termination control and status commands
* ==============================================
*/
/* CFUN: Set phone functionality
* -----------------------------
* Used to set the Mobile Equipment to different power consumption states
* Read parameter command:
* +CFUN? returns +CFUN: <fun>
* <fun> integer type - level of functionality
* Test parameter command:
* +CFUN=? returns +CFUN: (list of supported <fun>s),(list of supported <rst>s)
*/
/* Optional parameter bitmask */
#define AT_RESPONSE_CFUN_MASK AT_RESPONSE_NO_PARAM
/* CFUN AT command response type */
typedef struct {
int fun;
} at_cfun_resp_t;
/* CPIN: Enter PIN
* ---------------
* Used to enter MT passwords which are needed before any other
* functionality of the MT can be used
* Read parameter command:
* +CPIN? returns +CPIN: <code>
* <code> string - value may be: "READY", "SIM PIN"
*/
/* Optional parameter bitmask */
#define AT_RESPONSE_CPIN_MASK AT_RESPONSE_NO_PARAM
/* CPIN AT command response type */
typedef struct {
#define AT_CPIN_RESP_SIZE 16
char code[AT_CPIN_RESP_SIZE+1];
} at_cpin_resp_t;
/* CSQ: Signal quality
* -------------------
* Returns received signal strength indication and channel bit error rate
* from the Mobile Equipment
* Action command:
* +CSQ returns +CSQ: <rssi>, <ber>
* <rssi> integer type - received signal strength indication (in dBm)
* <ber> integer type - channel bit error rate (in percent)
*/
/* Received signal strength indicator */
#define AT_CSQ_RSSI_0 0 /* -113 dBm or less */
#define AT_CSQ_RSSI_31 31 /* -51 dBm or greater */
#define AT_CSQ_RSSI_UNKNOWN 99 /* not known or not detectable */
/* Channel bit error rate */
#define AT_CSQ_BER_0 0 /* BER < 0.2 % */
#define AT_CSQ_BER_1 1 /* 0.2 % < BER < 0.4 % */
#define AT_CSQ_BER_2 2 /* 0.4 % < BER < 0.8 % */
#define AT_CSQ_BER_3 3 /* 0.8 % < BER < 1.6 % */
#define AT_CSQ_BER_4 4 /* 1.6 % < BER < 3.2 % */
#define AT_CSQ_BER_5 5 /* 3.2 % < BER < 6.4 % */
#define AT_CSQ_BER_6 6 /* 6.4 % < BER < 12.8 % */
#define AT_CSQ_BER_7 7 /* 12.8 % < BER */
#define AT_CSQ_BER_UNKNOWN 99 /* not known or not detectable */
/* Optional parameter bitmask */
#define AT_RESPONSE_CSQ_MASK AT_RESPONSE_NO_PARAM
/* CSQ AT command response type */
typedef struct {
int rssi;
int ber;
} at_csq_resp_t;
/* CESQ: Extended signal quality
* -----------------------------
* Returns received signal quality parameters.
* Action command:
* +CESQ returns +CESQ: <rssi>,<ber>,<rscp>,<ecno>,<rsrq>,<rsrp>
* <rssi> integer type - received signal strength indication (in dBm)
* <ber> integer type - channel bit error rate (in percent)
* <rscp> integer type - received signal code power (in dBm)
* <ecno> integer type - ratio of the received energy per PN chip (in dBm)
* <rsrq> integer type - reference signal received quality (in dBm)
* <rsrp> integer type - reference signal received power (in dBm)
*/
/* Received signal strength indicator */
#define AT_CESQ_RSSI_0 0 /* -113 dBm or less */
#define AT_CESQ_RSSI_31 31 /* -51 dBm or greater */
#define AT_CESQ_RSSI_UNKNOWN 99 /* not known or not detectable */
/* Channel bit error rate */
#define AT_CESQ_BER_0 0 /* BER < 0.2 % */
#define AT_CESQ_BER_1 1 /* 0.2 % < BER < 0.4 % */
#define AT_CESQ_BER_2 2 /* 0.4 % < BER < 0.8 % */
#define AT_CESQ_BER_3 3 /* 0.8 % < BER < 1.6 % */
#define AT_CESQ_BER_4 4 /* 1.6 % < BER < 3.2 % */
#define AT_CESQ_BER_5 5 /* 3.2 % < BER < 6.4 % */
#define AT_CESQ_BER_6 6 /* 6.4 % < BER < 12.8 % */
#define AT_CESQ_BER_7 7 /* 12.8 % < BER */
#define AT_CESQ_BER_UNKNOWN 99 /* not known or not detectable */
/* Received signal code power */
#define AT_CESQ_RSCP_0 0 /* -120 dBm or less */
#define AT_CESQ_RSCP_96 96 /* -24 dBm or greater */
#define AT_CESQ_RSCP_UNKNOWN 255 /* not known or not detectable */
/* Ratio of the received energy per PN chip (Ec/No) */
#define AT_CESQ_ECNO_0 0 /* -24 dBm or less */
#define AT_CESQ_ECNO_49 49 /* 0,5 dBm or greater */
#define AT_CESQ_ECNO_UNKNOWN 255 /* not known or not detectable */
/* Reference signal received quality */
#define AT_CESQ_RSRQ_0 0 /* -19,5 dBm or less */
#define AT_CESQ_RSRQ_34 34 /* -2,5 dBm or greater */
#define AT_CESQ_RSRQ_UNKNOWN 255 /* not known or not detectable */
/* Reference signal received power */
#define AT_CESQ_RSRP_0 0 /* -140 dBm or less */
#define AT_CESQ_RSRP_97 97 /* -43 dBm or greater */
#define AT_CESQ_RSRP_UNKNOWN 255 /* not known or not detectable */
/* Optional parameter bitmask */
#define AT_RESPONSE_CESQ_MASK AT_RESPONSE_NO_PARAM
/* CSQ AT command response type */
typedef struct {
int rssi;
int ber;
int rscp;
int ecno;
int rsrq;
int rsrp;
} at_cesq_resp_t;
/* CLAC: List all available AT commands
* ------------------------------------
* Returns one or more lines of AT Commands that are available for the user.
* Action command:
* +CLAC returns +CLAC: <AT Command1>[<CR><LF><AT Command2>[...]]
* <AT Command> string - defines the AT command including the prefix AT
*/
/* Optional parameter bitmask */
#define AT_RESPONSE_CLAC_MASK AT_RESPONSE_NO_PARAM
/* CLAC AT command response type */
typedef struct {
int n_acs;
#define AT_CLAC_RESP_SIZE 100
const char* ac[AT_CLAC_RESP_SIZE];
} at_clac_resp_t;
/*
* =========================
* Mobile Termination errors
* =========================
*/
/*
* CMEE: Report mobile termination error
* -------------------------------------
* Disables or enables the use of final result code +CME ERROR: <err> as an
* indication of an error relating to the functionality of the MT.
* Read parameter command:
* +CMEE? returns +CMEE: <n>
* <n> numeric parameter
*/
/* Optional parameter bitmask */
#define AT_RESPONSE_CMEE_MASK AT_RESPONSE_NO_PARAM
/* CMEE AT command response type */
typedef at_cmee_t at_cmee_resp_t;
/*
* ================================
* Network service related commands
* ================================
*/
/* CNUM: Subscriber number
* -----------------------
* Returns the MSISDNs related to the subscriber.
* Action command:
* +CNUM returns +CNUM: <number1>,<type1>[<CR><LF>
* +CNUM: <number2>,<type2>[...]]
* <numberx> string type phone number of format specified by <typex>
* <typex> type of address octet in integer format
*/
/* Optional parameter bitmask */
#define AT_RESPONSE_CNUM_MASK AT_RESPONSE_NO_PARAM
/* CNUM AT command response type */
typedef struct {
#define AT_CNUM_NUMBER_SIZE MSISDN_DIGIT_SIZE
char number[AT_CNUM_NUMBER_SIZE];
int type;
} at_cnum_resp_t;
/* CLCK: Facility lock
* -------------------
* Used to lock, unlock or interrogate a MT or a network facility <fac>.
* When <mode>=2, returns +CLCK: <status>
* <status> state of the network service
*/
/* Network service status */
#define AT_CLCK_RESP_STATUS_NOT_ACTIVE 0
#define AT_CLCK_RESP_STATUS_ACTIVE 1
/* Optional parameter bitmask */
#define AT_RESPONSE_CLCK_MASK AT_RESPONSE_NO_PARAM
/* CLCK AT command response type */
typedef struct {
int status;
} at_clck_resp_t;
/* COPS: PLMN selection
* --------------------
* Forces an attempt to select and register the GSM/UMTS/EPS network operator
* using the SIM/USIM card installed in the currently selected card slot.
* Read parameter command:
* +COPS? returns +COPS:<mode>[,<format>,<oper>[,<AcT>]]
* <mode> operation mode of the network selection
* <format> representation format of the network operator
* <oper> APN operator identifier
* <AcT> access technology
* Test command returns a set of parameters, each representing an operator
* present in the network:
* +COPS=? returns +COPS: [list of supported (<stat>,long alphanumeric <oper>,
* short alphanumeric <oper>,numeric <oper>[,<AcT>])s][,,(list of supported
* <mode>s),(list of supported <format>s)]
* <stat> network operator availability
*/
/* Optional parameter bitmask */
#define AT_COPS_RESP_FORMAT_MASK AT_COMMAND_PARAM2
#define AT_COPS_RESP_OPER_MASK AT_COMMAND_PARAM3
#define AT_COPS_RESP_ACT_MASK AT_COMMAND_PARAM4
/* Structure of COPS AT test parameter command */
typedef struct {
const char* data; /* String representation of the list of operators */
int size; /* Size in byte of the data to be dislayed */
} at_cops_tst_t;
/* Structure of COPS AT read parameter command */
typedef at_cops_t at_cops_get_t;
/* COPS AT command response type */
typedef union {
at_cops_tst_t tst;
at_cops_get_t get;
} at_cops_resp_t;
/* CREG: network registration
* --------------------------
* When <n>=1, returns +CREG: <stat>, the Mobile Equipment's circuit mode
* network registration status in GERA/UTRA/E-UTRA Network.
* When <n>=2, returns +CREG: <stat>[,<lac>,<ci>[,<AcT>]], the Mobile
* Equipment's circuit mode network registration status and location information
* in GERA/UTRA/E-UTRA Network.
* Read parameter command:
* +CREG? returns +CREG:<n>,<stat>[,<lac>,<ci>[,<AcT>]]
* <n> numeric parameter
* <stat> numeric parameter that indicates the circuit mode registration
* status
* <lac> string type; two byte location area code in hexadecimal format
* <ci> string type; four byte GERAN/UTRAN/E-UTRAN cell ID in hexadeci-
* mal format
* <AcT> a numeric parameter that indicates the access technology of
* the serving cell
*/
/* Network registration status */
#define AT_CREG_RESP_REG_OFF NET_REG_STATE_OFF
#define AT_CREG_RESP_REG_HN NET_REG_STATE_HN
#define AT_CREG_RESP_REG_ON NET_REG_STATE_ON
#define AT_CREG_RESP_REG_DENIED NET_REG_STATE_DENIED
#define AT_CREG_RESP_REG_UNKNOWN NET_REG_STATE_UNKNOWN
#define AT_CREG_RESP_REG_SMS_HN NET_REG_STATE_SMS_HN
#define AT_CREG_RESP_REG_SMS_ROAMING NET_REG_STATE_SMS_ROAMING
#define AT_CREG_RESP_REG_ROAMING NET_REG_STATE_ROAMING
/* Access technology indicators */
#define AT_CREG_RESP_GSM NET_ACCESS_GSM /* GSM */
#define AT_CREG_RESP_COMPACT NET_ACCESS_COMPACT /* GSM Compact */
#define AT_CREG_RESP_UTRAN NET_ACCESS_UTRAN /* UTRAN */
#define AT_CREG_RESP_EGPRS NET_ACCESS_EGPRS /* GSM w/EGPRS */
#define AT_CREG_RESP_HSDPA NET_ACCESS_HSDPA /* UTRAN w/HSDPA */
#define AT_CREG_RESP_HSUPA NET_ACCESS_HSUPA /* UTRAN w/HSUPA */
#define AT_CREG_RESP_HSDUPA NET_ACCESS_HSDUPA /* w/HSDPA and HSUPA */
#define AT_CREG_RESP_EUTRAN NET_ACCESS_EUTRAN /* E-UTRAN */
/* Optional parameter bitmask */
//#define AT_CREG_RESP_N_MASK AT_COMMAND_PARAM1
#define AT_CREG_RESP_LAC_MASK AT_COMMAND_PARAM3
#define AT_CREG_RESP_CI_MASK AT_COMMAND_PARAM4
#define AT_CREG_RESP_ACT_MASK AT_COMMAND_PARAM5
/* CREG AT command response type */
typedef struct {
int n;
int stat;
#define AT_CREG_RESP_LAC_SIZE 4
char lac[AT_CREG_RESP_LAC_SIZE+1];
#define AT_CREG_RESP_CI_SIZE 8
char ci[AT_CREG_RESP_CI_SIZE+1];
int AcT;
} at_creg_resp_t;
/*
* ==========================
* Commands for Packet Domain
* ==========================
*/
/* CGATT: GPRS service attach/detach
* ---------------------------------
* Used to attach the MT to, or detach the MT from, the GPRS service.
* Read parameter command:
* +CGATT? returns CGATT: <state>
* <state> numeric parameter that indicates the state of GPRS attachment
* Test parameter command:
* +CGATT=? returns CGATT: (list of supported <state>s)
*/
/* Optional parameter bitmask */
#define AT_RESPONSE_CGATT_MASK AT_RESPONSE_NO_PARAM
/* CGATT AT command response type */
typedef struct {
int state;
} at_cgatt_resp_t;
/* CGREG: GPRS network registration status
* ---------------------------------------
* When <n>=1, returns +CGREG: <stat>, the Mobile Equipment's GPRS network
* registration status in GERA/UTRA Network.
* When <n>=2, returns +CGREG: <stat>[,<lac>,<ci>[,<AcT>,<rac>]], the Mobile
* Equipment's GPRS network registration status and location information in
* GERA/UTRA Network.
* Read parameter command:
* +CGREG? returns +CGREG:<n>,<stat>[,<lac>,<ci>[,<AcT>,<rac>]]
* <n> numeric parameter
* <stat> numeric parameter that indicates the GPRS registration status
* <lac> string type; two byte location area code in hexadecimal format
* <ci> string type; four byte GERAN/UTRAN cell ID in hexadecimal format
* <AcT> a numeric parameter that indicates the access technology of
* the serving cell
* <rac> string type; one byte routing area code in hexadecimal format
*/
/* Network registration status */
#define AT_CGREG_RESP_REG_OFF NET_REG_STATE_OFF
#define AT_CGREG_RESP_REG_HN NET_REG_STATE_HN
#define AT_CGREG_RESP_REG_ON NET_REG_STATE_ON
#define AT_CGREG_RESP_REG_DENIED NET_REG_STATE_DENIED
#define AT_CGREG_RESP_REG_UNKNOWN NET_REG_STATE_UNKNOWN
#define AT_CGREG_RESP_REG_ROAMING NET_REG_STATE_ROAMING
#define AT_CGREG_RESP_REG_EMERGENCY NET_REG_STATE_EMERGENCY
/* Access technology indicators */
#define AT_CGREG_RESP_GSM NET_ACCESS_GSM /* GSM */
#define AT_CGREG_RESP_COMPACT NET_ACCESS_COMPACT /* GSM Compact */
#define AT_CGREG_RESP_UTRAN NET_ACCESS_UTRAN /* UTRAN */
#define AT_CGREG_RESP_EGPRS NET_ACCESS_EGPRS /* GSM w/EGPRS */
#define AT_CGREG_RESP_HSDPA NET_ACCESS_HSDPA /* UTRAN w/HSDPA */
#define AT_CGREG_RESP_HSUPA NET_ACCESS_HSUPA /* UTRAN w/HSUPA */
#define AT_CGREG_RESP_HSDUPA NET_ACCESS_HSDUPA /* w/HSDPA and HSUPA */
/* Optional parameter bitmask */
//#define AT_CGREG_RESP_N_MASK AT_COMMAND_PARAM1
#define AT_CGREG_RESP_LAC_MASK AT_COMMAND_PARAM3
#define AT_CGREG_RESP_CI_MASK AT_COMMAND_PARAM4
#define AT_CGREG_RESP_ACT_MASK AT_COMMAND_PARAM5
#define AT_CGREG_RESP_RAC_MASK AT_COMMAND_PARAM6
/* CGREG AT command response type */
typedef struct {
int n;
int stat;
#define AT_CGREG_RESP_LAC_SIZE 4
char lac[AT_CGREG_RESP_LAC_SIZE+1];
#define AT_CGREG_RESP_CI_SIZE 8
char ci[AT_CGREG_RESP_CI_SIZE+1];
int AcT;
#define AT_CGREG_RESP_RAC_SIZE 2
char rac[AT_CGREG_RESP_RAC_SIZE+1];
} at_cgreg_resp_t;
/* CEREG: EPS network registration status
* --------------------------------------
* When <n>=1, returns +CEREG: <stat>, the Mobile Equipment's EPS services
* registration status in EUTRA Network.
* When <n>=2, returns +CEREG: <stat>[,<tac>,<ci>[,<AcT>]], the Mobile
* Equipment's EPS services registration status and location information in
* EUTRA Network.
* Read parameter command:
* +CEREG? returns +CEREG:<n>,<stat>[,<tac>,<ci>[,<AcT>]]
* <n> numeric parameter
* <stat> numeric parameter that indicates the EPS registration status
* <tac> string type; two byte tracking area code in hexadecimal format
* <ci> string type; four byte E-UTRAN cell ID in hexadecimal format
* <AcT> a numeric parameter that indicates the access technology of
* the serving cell
*/
/* Network registration status */
#define AT_CEREG_RESP_REG_OFF NET_REG_STATE_OFF
#define AT_CEREG_RESP_REG_HN NET_REG_STATE_HN
#define AT_CEREG_RESP_REG_ON NET_REG_STATE_ON
#define AT_CEREG_RESP_REG_DENIED NET_REG_STATE_DENIED
#define AT_CEREG_RESP_REG_UNKNOWN NET_REG_STATE_UNKNOWN
#define AT_CEREG_RESP_REG_ROAMING NET_REG_STATE_ROAMING
#define AT_CEREG_RESP_REG_EMERGENCY NET_REG_STATE_EMERGENCY
/* Access technology indicators */
#define AT_CEREG_RESP_EUTRAN NET_ACCESS_EUTRAN /* E-UTRAN */
/* Optional parameter bitmask */
//#define AT_CEREG_RESP_N_MASK AT_COMMAND_PARAM1
#define AT_CEREG_RESP_TAC_MASK AT_COMMAND_PARAM3
#define AT_CEREG_RESP_CI_MASK AT_COMMAND_PARAM4
#define AT_CEREG_RESP_ACT_MASK AT_COMMAND_PARAM5
/* CEREG AT command response type */
typedef struct {
int n;
int stat;
#define AT_CEREG_RESP_TAC_SIZE 4
char tac[AT_CEREG_RESP_TAC_SIZE+1];
#define AT_CEREG_RESP_CI_SIZE 8
char ci[AT_CEREG_RESP_CI_SIZE+1];
int AcT;
} at_cereg_resp_t;
/* CGDCONT: Define PDP Context
* ---------------------------
* Specifies PDP context parameter values for a PDP context identified by
* the (local) context identification parameter, <cid>.
* Read parameter command:
* +CGDCONT? returns +CGDCONT: <cid>,<PDP_type>,<APN>,<PDP_addr>,<d_comp>,
* <h_comp>[,<IPv4AddrAlloc>[,<emergency indication>[,<P-CSCF_
* discovery>[,<IM_CN_Signalling_Flag_Ind>]]]][<CR><LF>
* +CGDCONT: <cid>,<PDP_type>,<APN>,<PDP_addr>,<d_comp>,
* <h_comp>[,<IPv4AddrAlloc>[,<emergency indication>[,<P-CSCF_
* discovery>[,<IM_CN_Signalling_Flag_Ind>]]]]
* [...]]
* <cid> a numeric parameter which specifies a particular PDP
* context definition
* <PDP_type> type of packet data protocol ("IP", "IPV6", "IPV4V6")
* <APN> Access Point logical Name
* <PDP_addr> Mobile Equipment PDP address (not applicable to EPS)
* <d_comp> PDP data compression parameter
* <h_comp> PDP header compression parameter
* <IPv4AddrAlloc> IPv4 address allocation parameter
* <emergency indication> emergency bearer services support indication
* <P-CSCF_discovery> P-CSCF address discovery parameter
* <IM_CN_Signalling_Flag_Ind> IM CN subsystem-related signalling
* support indication
*/
/* Optional parameter bitmask */
#define AT_CGDCONT_RESP_IPV4ADDRALLOC_MASK AT_COMMAND_PARAM7
#define AT_CGDCONT_RESP_EMERGECY_INDICATION_MASK AT_COMMAND_PARAM8
#define AT_CGDCONT_RESP_P_CSCF_DISCOVERY_MASK AT_COMMAND_PARAM9
#define AT_CGDCONT_RESP_IM_CN_SIGNALLING_FLAG_IND_MASK AT_COMMAND_PARAM10
/* Structure of CGDCONT AT read parameter command */
typedef struct {
#define AT_CGDCONT_RESP_SIZE 8
int n_pdns; /* Number of defined PDN contexts in the lists */
int cid[AT_CGDCONT_RESP_SIZE]; /* List of PDN context identifiers */
int PDP_type[AT_CGDCONT_RESP_SIZE];
const char* APN[AT_CGDCONT_RESP_SIZE];
int d_comp[AT_CGDCONT_RESP_SIZE];
int h_comp[AT_CGDCONT_RESP_SIZE];
} at_cgdcont_get_t;
/* Structure of CGDCONT AT read parameter command */
typedef struct {
int n_cid; /* Range of supported PDN context identifiers */
} at_cgdcont_tst_t;
/* CGDCONT AT command response type */
typedef union {
at_cgdcont_tst_t tst;
at_cgdcont_get_t get;
} at_cgdcont_resp_t;
/* CGACT: PDP context activate or deactivate
* -----------------------------------------
* Read command returns the current activation states for all the defined
* PDP contexts.
* Read parameter command:
* +CGACT? returns +CGACT: <cid>,<state>[<CR><LF>+CGACT: <cid>,<state>[...]]
* <cid> a numeric parameter which specifies a particular PDP context
* definition
* <state> numeric parameter that indicates the state of PDP context
* activation
*/
/* Optional parameter bitmask */
#define AT_RESPONSE_CGACT_MASK AT_RESPONSE_NO_PARAM
/* CGACT AT command response type */
typedef struct {
#define AT_CGACT_RESP_SIZE AT_CGDCONT_RESP_SIZE
int n_pdns; /* Number of defined PDN contexts in the lists */
int cid[AT_CGACT_RESP_SIZE]; /* List of PDN context identifiers */
int state[AT_CGACT_RESP_SIZE]; /* List of PDN context states */
} at_cgact_resp_t;
/* CGPADDR: Show PDP address(es)
* -----------------------------
* Returns a list of PDP addresses for the specified context identifiers.
* +CGPADDR= returns +CGPADDR: <cid>[,PDP_addr_1[,PDP_addr_2]][<CR><LF>
* +CGPADDR: <cid>[,PDP_addr_1[,PDP_addr_2]][...]]
* <cid> a numeric parameter which specifies a particular PDP
* context definition
* <PDP_addr_x> string that identifies the MT in the address space
* applicable to the PDP
*/
/* Optional parameter bitmask */
#define AT_RESPONSE_CGPADDR_MASK AT_RESPONSE_NO_PARAM
/* CGPADDR AT command response type */
typedef struct {
#define AT_CGPADDR_RESP_SIZE AT_CGDCONT_RESP_SIZE
int n_pdns; /* Number of defined PDP addresses in the lists */
int cid[AT_CGPADDR_RESP_SIZE]; /* List of PDN context identifiers */
/* List of IPv4 addresses */
const char* PDP_addr_1[AT_CGPADDR_RESP_SIZE];
/* List of IPv6 addresses */
const char* PDP_addr_2[AT_CGPADDR_RESP_SIZE];
} at_cgpaddr_resp_t;
/* CGEV: Unsolicited result
* ------------------------
* Returns unsolicited result codes in case of certain events occurring
* in the Packet Domain MT or the network.
* +CGREV: <code> <cid>
* <code> unsolicited result code
* <cid> a numeric parameter which specifies a particular PDP
* context definition
*/
/* Optional parameter bitmask */
#define AT_RESPONSE_CGEV_MASK AT_RESPONSE_NO_PARAM
/* Unsolicited result codes */
#define AT_CGEV_RESP_NW_PDN_ACT (-1) /* Not applicable for LTE */
#define AT_CGEV_RESP_ME_PDN_ACT NET_PDN_MT_DEFAULT_ACT
#define AT_CGEV_RESP_NW_PDN_DEACT NET_PDN_NW_DEFAULT_DEACT
#define AT_CGEV_RESP_ME_PDN_DEACT NET_PDN_MT_DEFAULT_DEACT
#define AT_CGEV_RESP_NW_ACT NET_PDN_NW_DEDICATED_ACT
#define AT_CGEV_RESP_ME_ACT NET_PDN_MT_DEDICATED_ACT
#define AT_CGEV_RESP_NW_DEACT NET_PDN_NW_DEDICATED_DEACT
#define AT_CGEV_RESP_ME_DEACT NET_PDN_MT_DEDICATED_DEACT
/* CGEV unsolicited result type */
typedef struct {
int code;
int cid;
} at_cgev_resp_t;
/*
* ==========================================
* Global AT command response type definition
* ==========================================
*/
/* AT command response type */
typedef struct {
at_command_id_t id; /* AT command identifier */
at_command_type_t type; /* AT command type */
int mask; /* Optional parameter bitmask */
int cause_code; /* AT command error cause code */
union {
at_cgsn_resp_t cgsn;
at_cgmi_resp_t cgmi;
at_cgmm_resp_t cgmm;
at_cgmr_resp_t cgmr;
at_cimi_resp_t cimi;
at_cfun_resp_t cfun;
at_cpin_resp_t cpin;
at_csq_resp_t csq;
at_cesq_resp_t cesq;
at_clac_resp_t clac;
at_cmee_resp_t cmee;
at_cnum_resp_t cnum;
at_clck_resp_t clck;
at_cops_resp_t cops;
at_cgatt_resp_t cgatt;
at_creg_resp_t creg;
at_cgreg_resp_t cgreg;
at_cereg_resp_t cereg;
at_cgdcont_resp_t cgdcont;
at_cgact_resp_t cgact;
at_cgpaddr_resp_t cgpaddr;
at_cgev_resp_t cgev;
} response;
} at_response_t;
/****************************************************************************/
/******************** G L O B A L V A R I A B L E S ********************/
/****************************************************************************/
/****************************************************************************/
/****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/
int at_response_encode(char* buffer, const at_response_t* at_response);
#endif /* __AT_RESPONSE_H__*/
+65
View File
@@ -0,0 +1,65 @@
################################################################################
# OpenAirInterface
# Copyright(c) 1999 - 2014 Eurecom
#
# OpenAirInterface is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
#
# OpenAirInterface is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenAirInterface.The full GNU General Public License is
# included in this distribution in the file called "COPYING". If not,
# see <http://www.gnu.org/licenses/>.
#
# Contact Information
# OpenAirInterface Admin: openair_admin@eurecom.fr
# OpenAirInterface Tech : openair_tech@eurecom.fr
# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
#
# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
#
################################################################################
ifndef PROJDIR
PROJDIR = $(PWD)/../../../..
endif
include $(PROJDIR)/Makerules
include $(PROJDIR)/Makefile.inc
LIBS = -lutil -lapi -lEMMmsg -lESMmsg -lies
INCLUDES = -I. -I$(INCDIR) -I$(UTILDIR) -I$(USERAPIDIR)
LIBSAPI = $(LIBDIR)/$(LIBAPI).a $(LIBDIR)/$(LIBAPI).so
TST_OBJ = at_parser.o
TST_TARGET = at_parser
TARGETS = $(TST_TARGET)
all: $(TARGETS)
%.o: %.c Makefile
$(CC) $(CFLAGS) -c $< -o $@
$(TST_TARGET): $(TST_OBJ)
$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
clean:
$(RM) $(OBJS) $(TARGETS) *.bak *~
depend:
makedepend -- ${CFLAGS} -- ${SRCS}
# DO NOT DELETE THIS LINE -- make depend depends on it.
at_parser.o: $(USERAPIDIR)/at_command.h
at_parser.o: $(INCDIR)/commonDef.h $(INCDIR)/userDef.h
at_parser.o: $(INCDIR)/networkDef.h $(UTILDIR)/log.h
+156
View File
@@ -0,0 +1,156 @@
/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenAirInterface is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>.
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
*******************************************************************************/
/*****************************************************************************
Source main.c
Version 0.1
Date 01/04/2012
Product NAS stack
Subsystem Application Programming Interface
Author Baris Demiray
Description Interacts with AT parser for testing purposes
*****************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "at_command.h"
#include "nas_log.h"
int main()
{
const char * sample_at_commands[] = {
"AT+CGSN\r", "AT+CGSN=?\r", "AT+CGMI\r", "AT+CGMI=?\r", "AT+CGMM\r",
"AT+CGMM=?\r", "AT+CIMI\r", "AT+CIMI=?\r", "AT+CFUN=1,1\r",
"AT+CFUN=2\r", "AT+CFUN?\r", "AT+CFUN=?\r", "AT+CPIN=1234\r",
"AT+CPIN=1234,4321\r", "AT+CPIN?\r", "AT+CPIN=?\r", "AT+CSQ\r",
"AT+CSQ=?\r", "AT+COPS=1,1,EURECOM\r", "AT+COPS=2,3\r", "AT+COPS=5\r",
"AT+COPS?\r", "AT+COPS=?\r", "AT+CGREG=1\r", "AT+CGREG?\r",
"AT+CGREG=?\r", "AT+CGDCONT=1\r", "AT+CGDCONT?\r", "AT+CGDCONT=?\r",
"AT+CGACT=1\r", "AT+CGACT?\r", "AT+CGACT=?\r", "AT+CGMR\r",
"AT+CGMR=?\r", "AT+CESQ\r", "AT+CESQ=?\r", "AT+CMEE=2\r",
"AT+CMEE?\r", "AT+CMEE=?\r", "AT+CLCK=SC,2\r", "AT+CLCK=?\r",
"AT+CREG=1\r", "AT+CREG?\r", "AT+CREG=?\r",
"AT+CEREG=1\r", "AT+CEREG?\r", "AT+CEREG=?\r",
"AT+CGATT=1\r", "AT+CGATT?\r", "AT+CGATT=?\r",
"AT\r", "null"
};
const char * sample_faulty_at_commands[] = {
"AT+CGSN=3,4\r", "AT+CGSN=??\r", "AT+CGMI=1,b\r", "AT+CGMI==\r",
"AT+CGMM?\r", "AT+CGMM==n\r", "AT+CIMI=4\r", "AT+CIMI=?t\r",
"AT+CFUN=n1,1\r", "AT+CFUN??\r", "AT+CFUN=a?\r", "AT+CPIN=1fd4\r",
"AT+CPIN=1sd+,432\r", "AT+CPIN?4\r", "AT+CPIN=?,?\r", "AT+CSQ=AT\r",
"AT+CSQ=q\r",
"AT+COPS=123121123123123123,EURECOMEURECOMEURECOMEURECOM\r",
"AT+COPS=2asd3,33ads1\r", "AT+COPS.=5\r", "AT+COPS?/r\\r",
"AT+COPS=?\n\r\r", "AT+CGREG=da1243\42r", "AT+CGREG.?\r",
"AT+CGREG1=?\r", "AT+CGDCONT=d31\r", "AT+CGDCONTxc?\\crca",
"AT+CGDCONcTc=c?\r", "AT+CGA12C3T=11\123r", "AT+CGACT';;.,?\r",
"AT+CGACT=?]\\;e23\r", "\r\r\r", "AT+COP\r", "null"
};
at_command_t at_command;
unsigned int at_command_index;
//log_init(0x2f);
/* Parse valid AT commands */
at_command_index = 0;
while (strncmp(sample_at_commands[at_command_index], "null", 4) != 0) {
if (at_command_decode(sample_at_commands[at_command_index],
strlen(sample_at_commands[at_command_index]),
&at_command) > 0) {
printf("INFO: Fine, parser interpreted valid command %s\n",
sample_at_commands[at_command_index]);
} else {
printf("ERROR: Parser rejected valid command %s\n",
sample_at_commands[at_command_index]);
}
at_command_index++;
}
/* Parse invalid AT commands */
at_command_index = 0;
while (strncmp(sample_faulty_at_commands[at_command_index], "null", 4) != 0) {
if (at_command_decode(sample_faulty_at_commands[at_command_index],
strlen(sample_faulty_at_commands[at_command_index]),
&at_command) > 0) {
printf("ERROR: Parser interpreted invalid command %s\n",
sample_faulty_at_commands[at_command_index]);
} else {
printf("INFO: Fine, parser rejected the command %s\n",
sample_faulty_at_commands[at_command_index]);
}
at_command_index++;
}
/*
* Provide a console to the user
*/
int bytes_read;
size_t input_size = 100;
char *input;
printf("Note 1: Carriage return will be appended to every command by default\n");
printf("Note 2: Enter 'quit' to exit\n");
printf("AT Command> ");
input = (char *)malloc(input_size + 1);
bytes_read = getline(&input, &input_size, stdin);
while (strncmp(input, "quit", 4) != 0) {
if (bytes_read == -1) {
puts("Cannot read user input!\n");
} else {
input[bytes_read - 1] = '\r';
if (at_command_decode(input, bytes_read, &at_command) > 0)
printf("INFO: Parser interpreted command %s\n", input);
else
printf("ERROR: Parser rejected command %s\n", input);
}
printf("\nAT Command> ");
memset(input, 0x00, input_size);
bytes_read = getline(&input, &input_size, stdin);
}
free(input);
printf("Exiting...\n");
return 0;
}
@@ -0,0 +1,2 @@
AT+COPS=3,0;+COPS?;+COPS=3,1;+COPS?;+COPS=3,2;+COPS?
quit
@@ -0,0 +1,59 @@
ATE0Q0V1
ATE0Q0V1
ATS0=0
AT+CMEE=1
AT+CREG=2
AT+CGREG=1
AT+CCWA=1
AT+CMOD=0
AT+CSSN=0,1
AT+COLP=0
AT+CSCS="HEX"
AT+CUSD=1
AT+CGEREP=1,0
AT+CMGF=0
AT+CFUN?
AT+CPIN?
AT+CSMS=1
AT+CNMI=1,2,2,1,0
AT+CFUN=0
AT+CFUN=1
AT+CPIN?
AT+CSMS=1
AT+CNMI=1,2,2,1,0
AT+CGSN
AT+COPS=3,0;+COPS?;+COPS=3,1;+COPS?;+COPS=3,2;+COPS?
AT+CGREG?
AT+CREG?
AT+COPS?
AT+CLCC
AT+COPS=3,0;+COPS?;+COPS=3,1;+COPS?;+COPS=3,2;+COPS?
AT+CGREG?
AT+CREG?
AT+COPS?
AT+COPS=0
AT+COPS=3,0;+COPS?;+COPS=3,1;+COPS?;+COPS=3,2;+COPS?
AT+CGREG?
AT+CREG?
AT+COPS?
AT+CIMI
AT+CRSM=192,12258,0,0,15
AT+CRSM=192,28480,0,0,15
AT+CRSM=192,28617,0,0,15
AT+CRSM=192,28589,0,0,15
AT+CRSM=192,28618,0,0,15
AT+CRSM=192,28433,0,0,15
AT+CRSM=192,28619,0,0,15
AT+CRSM=192,28435,0,0,15
AT+CRSM=192,28486,0,0,15
AT+CRSM=192,28621,0,0,15
AT+CRSM=192,28613,0,0,15
AT+CRSM=192,28472,0,0,15
AT+CRSM=192,28438,0,0,15
AT+CRSM=192,28437,0,0,15
AT+CPIN?
AT+CRSM=192,28439,0,0,15
AT+CRSM=192,28436,0,0,15
AT+CRSM=192,28440,0,0,15
AT+CSQ
quit
@@ -0,0 +1,90 @@
INFO: Fine, parser interpreted valid command AT+CGSN
INFO: Fine, parser interpreted valid command AT+CGSN=?
INFO: Fine, parser interpreted valid command AT+CGMI
INFO: Fine, parser interpreted valid command AT+CGMI=?
INFO: Fine, parser interpreted valid command AT+CGMM
INFO: Fine, parser interpreted valid command AT+CGMM=?
INFO: Fine, parser interpreted valid command AT+CIMI
INFO: Fine, parser interpreted valid command AT+CIMI=?
INFO: Fine, parser interpreted valid command AT+CFUN=1,1
INFO: Fine, parser interpreted valid command AT+CFUN=2
INFO: Fine, parser interpreted valid command AT+CFUN?
INFO: Fine, parser interpreted valid command AT+CFUN=?
INFO: Fine, parser interpreted valid command AT+CPIN=1234
INFO: Fine, parser interpreted valid command AT+CPIN=1234,4321
INFO: Fine, parser interpreted valid command AT+CPIN?
INFO: Fine, parser interpreted valid command AT+CPIN=?
INFO: Fine, parser interpreted valid command AT+CSQ
INFO: Fine, parser interpreted valid command AT+CSQ=?
INFO: Fine, parser interpreted valid command AT+COPS=1,1,EURECOM
INFO: Fine, parser interpreted valid command AT+COPS=2,3
INFO: Fine, parser interpreted valid command AT+COPS=5
INFO: Fine, parser interpreted valid command AT+COPS?
INFO: Fine, parser interpreted valid command AT+COPS=?
INFO: Fine, parser interpreted valid command AT+CGREG=1
INFO: Fine, parser interpreted valid command AT+CGREG?
INFO: Fine, parser interpreted valid command AT+CGREG=?
INFO: Fine, parser interpreted valid command AT+CGDCONT=1
INFO: Fine, parser interpreted valid command AT+CGDCONT?
INFO: Fine, parser interpreted valid command AT+CGDCONT=?
INFO: Fine, parser interpreted valid command AT+CGACT=1
INFO: Fine, parser interpreted valid command AT+CGACT?
INFO: Fine, parser interpreted valid command AT+CGACT=?
INFO: Fine, parser interpreted valid command AT+CGMR
INFO: Fine, parser interpreted valid command AT+CGMR=?
INFO: Fine, parser interpreted valid command AT+CESQ
INFO: Fine, parser interpreted valid command AT+CESQ=?
INFO: Fine, parser interpreted valid command AT+CMEE=2
INFO: Fine, parser interpreted valid command AT+CMEE?
INFO: Fine, parser interpreted valid command AT+CMEE=?
INFO: Fine, parser interpreted valid command AT+CLCK=SC,2
INFO: Fine, parser interpreted valid command AT+CLCK=?
INFO: Fine, parser interpreted valid command AT+CREG=1
INFO: Fine, parser interpreted valid command AT+CREG?
INFO: Fine, parser interpreted valid command AT+CREG=?
INFO: Fine, parser interpreted valid command AT+CEREG=1
INFO: Fine, parser interpreted valid command AT+CEREG?
INFO: Fine, parser interpreted valid command AT+CEREG=?
INFO: Fine, parser interpreted valid command AT+CGATT=1
INFO: Fine, parser interpreted valid command AT+CGATT?
INFO: Fine, parser interpreted valid command AT+CGATT=?
INFO: Fine, parser interpreted valid command AT
INFO: Fine, parser rejected the command AT+CGSN=3,4
INFO: Fine, parser rejected the command AT+CGSN=??
INFO: Fine, parser rejected the command AT+CGMI=1,b
INFO: Fine, parser rejected the command AT+CGMI==
INFO: Fine, parser rejected the command AT+CGMM?
INFO: Fine, parser rejected the command AT+CGMM==n
INFO: Fine, parser rejected the command AT+CIMI=4
INFO: Fine, parser rejected the command AT+CIMI=?t
INFO: Fine, parser rejected the command AT+CFUN=n1,1
INFO: Fine, parser rejected the command AT+CFUN??
INFO: Fine, parser rejected the command AT+CFUN=a?
INFO: Fine, parser rejected the command AT+CPIN=1fd4
INFO: Fine, parser rejected the command AT+CPIN=1sd+,432
INFO: Fine, parser rejected the command AT+CPIN?4
INFO: Fine, parser rejected the command AT+CPIN=?,?
INFO: Fine, parser rejected the command AT+CSQ=AT
INFO: Fine, parser rejected the command AT+CSQ=q
INFO: Fine, parser rejected the command AT+COPS=123121123123123123,EURECOMEURECOMEURECOMEURECOM
INFO: Fine, parser rejected the command AT+COPS=2asd3,33ads1
INFO: Fine, parser rejected the command AT+COPS.=5
INFO: Fine, parser rejected the command AT+COPS?/r\r
INFO: Fine, parser rejected the command AT+COPS=?
␍
INFO: Fine, parser rejected the command AT+CGREG=da1243"r
INFO: Fine, parser rejected the command AT+CGREG.?
INFO: Fine, parser rejected the command AT+CGREG1=?
INFO: Fine, parser rejected the command AT+CGDCONT=d31
INFO: Fine, parser rejected the command AT+CGDCONTxc?\crca
INFO: Fine, parser rejected the command AT+CGDCONcTc=c?
INFO: Fine, parser rejected the command AT+CGA12C3T=11Sr
INFO: Fine, parser rejected the command AT+CGACT';;.,?
INFO: Fine, parser rejected the command AT+CGACT=?]\;e23
INFO: Fine, parser rejected the command ␍␍
INFO: Fine, parser rejected the command AT+COP
Note 1: Carriage return will be appended to every command by default
Note 2: Enter 'quit' to exit
AT Command> INFO: Parser interpreted command AT+COPS=3,0;+COPS?;+COPS=3,1;+COPS?;+COPS=3,2;+COPS?
AT Command> Exiting...
@@ -0,0 +1,204 @@
INFO: Fine, parser interpreted valid command AT+CGSN
INFO: Fine, parser interpreted valid command AT+CGSN=?
INFO: Fine, parser interpreted valid command AT+CGMI
INFO: Fine, parser interpreted valid command AT+CGMI=?
INFO: Fine, parser interpreted valid command AT+CGMM
INFO: Fine, parser interpreted valid command AT+CGMM=?
INFO: Fine, parser interpreted valid command AT+CIMI
INFO: Fine, parser interpreted valid command AT+CIMI=?
INFO: Fine, parser interpreted valid command AT+CFUN=1,1
INFO: Fine, parser interpreted valid command AT+CFUN=2
INFO: Fine, parser interpreted valid command AT+CFUN?
INFO: Fine, parser interpreted valid command AT+CFUN=?
INFO: Fine, parser interpreted valid command AT+CPIN=1234
INFO: Fine, parser interpreted valid command AT+CPIN=1234,4321
INFO: Fine, parser interpreted valid command AT+CPIN?
INFO: Fine, parser interpreted valid command AT+CPIN=?
INFO: Fine, parser interpreted valid command AT+CSQ
INFO: Fine, parser interpreted valid command AT+CSQ=?
INFO: Fine, parser interpreted valid command AT+COPS=1,1,EURECOM
INFO: Fine, parser interpreted valid command AT+COPS=2,3
INFO: Fine, parser interpreted valid command AT+COPS=5
INFO: Fine, parser interpreted valid command AT+COPS?
INFO: Fine, parser interpreted valid command AT+COPS=?
INFO: Fine, parser interpreted valid command AT+CGREG=1
INFO: Fine, parser interpreted valid command AT+CGREG?
INFO: Fine, parser interpreted valid command AT+CGREG=?
INFO: Fine, parser interpreted valid command AT+CGDCONT=1
INFO: Fine, parser interpreted valid command AT+CGDCONT?
INFO: Fine, parser interpreted valid command AT+CGDCONT=?
INFO: Fine, parser interpreted valid command AT+CGACT=1
INFO: Fine, parser interpreted valid command AT+CGACT?
INFO: Fine, parser interpreted valid command AT+CGACT=?
INFO: Fine, parser interpreted valid command AT+CGMR
INFO: Fine, parser interpreted valid command AT+CGMR=?
INFO: Fine, parser interpreted valid command AT+CESQ
INFO: Fine, parser interpreted valid command AT+CESQ=?
INFO: Fine, parser interpreted valid command AT+CMEE=2
INFO: Fine, parser interpreted valid command AT+CMEE?
INFO: Fine, parser interpreted valid command AT+CMEE=?
INFO: Fine, parser interpreted valid command AT+CLCK=SC,2
INFO: Fine, parser interpreted valid command AT+CLCK=?
INFO: Fine, parser interpreted valid command AT+CREG=1
INFO: Fine, parser interpreted valid command AT+CREG?
INFO: Fine, parser interpreted valid command AT+CREG=?
INFO: Fine, parser interpreted valid command AT+CEREG=1
INFO: Fine, parser interpreted valid command AT+CEREG?
INFO: Fine, parser interpreted valid command AT+CEREG=?
INFO: Fine, parser interpreted valid command AT+CGATT=1
INFO: Fine, parser interpreted valid command AT+CGATT?
INFO: Fine, parser interpreted valid command AT+CGATT=?
INFO: Fine, parser interpreted valid command AT
INFO: Fine, parser rejected the command AT+CGSN=3,4
INFO: Fine, parser rejected the command AT+CGSN=??
INFO: Fine, parser rejected the command AT+CGMI=1,b
INFO: Fine, parser rejected the command AT+CGMI==
INFO: Fine, parser rejected the command AT+CGMM?
INFO: Fine, parser rejected the command AT+CGMM==n
INFO: Fine, parser rejected the command AT+CIMI=4
INFO: Fine, parser rejected the command AT+CIMI=?t
INFO: Fine, parser rejected the command AT+CFUN=n1,1
INFO: Fine, parser rejected the command AT+CFUN??
INFO: Fine, parser rejected the command AT+CFUN=a?
INFO: Fine, parser rejected the command AT+CPIN=1fd4
INFO: Fine, parser rejected the command AT+CPIN=1sd+,432
INFO: Fine, parser rejected the command AT+CPIN?4
INFO: Fine, parser rejected the command AT+CPIN=?,?
INFO: Fine, parser rejected the command AT+CSQ=AT
INFO: Fine, parser rejected the command AT+CSQ=q
INFO: Fine, parser rejected the command AT+COPS=123121123123123123,EURECOMEURECOMEURECOMEURECOM
INFO: Fine, parser rejected the command AT+COPS=2asd3,33ads1
INFO: Fine, parser rejected the command AT+COPS.=5
INFO: Fine, parser rejected the command AT+COPS?/r\r
INFO: Fine, parser rejected the command AT+COPS=?
␍
INFO: Fine, parser rejected the command AT+CGREG=da1243"r
INFO: Fine, parser rejected the command AT+CGREG.?
INFO: Fine, parser rejected the command AT+CGREG1=?
INFO: Fine, parser rejected the command AT+CGDCONT=d31
INFO: Fine, parser rejected the command AT+CGDCONTxc?\crca
INFO: Fine, parser rejected the command AT+CGDCONcTc=c?
INFO: Fine, parser rejected the command AT+CGA12C3T=11Sr
INFO: Fine, parser rejected the command AT+CGACT';;.,?
INFO: Fine, parser rejected the command AT+CGACT=?]\;e23
INFO: Fine, parser rejected the command ␍␍
INFO: Fine, parser rejected the command AT+COP
Note 1: Carriage return will be appended to every command by default
Note 2: Enter 'quit' to exit
AT Command> INFO: Parser interpreted command ATE0Q0V1
AT Command> INFO: Parser interpreted command ATE0Q0V1
AT Command> ERROR: Parser rejected command ATS0=0
AT Command> INFO: Parser interpreted command AT+CMEE=1
AT Command> INFO: Parser interpreted command AT+CREG=2
AT Command> INFO: Parser interpreted command AT+CGREG=1
AT Command> ERROR: Parser rejected command AT+CCWA=1
AT Command> ERROR: Parser rejected command AT+CMOD=0
AT Command> ERROR: Parser rejected command AT+CSSN=0,1
AT Command> ERROR: Parser rejected command AT+COLP=0
AT Command> ERROR: Parser rejected command AT+CSCS="HEX"
AT Command> ERROR: Parser rejected command AT+CUSD=1
AT Command> ERROR: Parser rejected command AT+CGEREP=1,0
AT Command> ERROR: Parser rejected command AT+CMGF=0
AT Command> INFO: Parser interpreted command AT+CFUN?
AT Command> INFO: Parser interpreted command AT+CPIN?
AT Command> ERROR: Parser rejected command AT+CSMS=1
AT Command> ERROR: Parser rejected command AT+CNMI=1,2,2,1,0
AT Command> INFO: Parser interpreted command AT+CFUN=0
AT Command> INFO: Parser interpreted command AT+CFUN=1
AT Command> INFO: Parser interpreted command AT+CPIN?
AT Command> ERROR: Parser rejected command AT+CSMS=1
AT Command> ERROR: Parser rejected command AT+CNMI=1,2,2,1,0
AT Command> INFO: Parser interpreted command AT+CGSN
AT Command> INFO: Parser interpreted command AT+COPS=3,0;+COPS?;+COPS=3,1;+COPS?;+COPS=3,2;+COPS?
AT Command> INFO: Parser interpreted command AT+CGREG?
AT Command> INFO: Parser interpreted command AT+CREG?
AT Command> INFO: Parser interpreted command AT+COPS?
AT Command> ERROR: Parser rejected command AT+CLCC
AT Command> INFO: Parser interpreted command AT+COPS=3,0;+COPS?;+COPS=3,1;+COPS?;+COPS=3,2;+COPS?
AT Command> INFO: Parser interpreted command AT+CGREG?
AT Command> INFO: Parser interpreted command AT+CREG?
AT Command> INFO: Parser interpreted command AT+COPS?
AT Command> INFO: Parser interpreted command AT+COPS=0
AT Command> INFO: Parser interpreted command AT+COPS=3,0;+COPS?;+COPS=3,1;+COPS?;+COPS=3,2;+COPS?
AT Command> INFO: Parser interpreted command AT+CGREG?
AT Command> INFO: Parser interpreted command AT+CREG?
AT Command> INFO: Parser interpreted command AT+COPS?
AT Command> INFO: Parser interpreted command AT+CIMI
AT Command> ERROR: Parser rejected command AT+CRSM=192,12258,0,0,15
AT Command> ERROR: Parser rejected command AT+CRSM=192,28480,0,0,15
AT Command> ERROR: Parser rejected command AT+CRSM=192,28617,0,0,15
AT Command> ERROR: Parser rejected command AT+CRSM=192,28589,0,0,15
AT Command> ERROR: Parser rejected command AT+CRSM=192,28618,0,0,15
AT Command> ERROR: Parser rejected command AT+CRSM=192,28433,0,0,15
AT Command> ERROR: Parser rejected command AT+CRSM=192,28619,0,0,15
AT Command> ERROR: Parser rejected command AT+CRSM=192,28435,0,0,15
AT Command> ERROR: Parser rejected command AT+CRSM=192,28486,0,0,15
AT Command> ERROR: Parser rejected command AT+CRSM=192,28621,0,0,15
AT Command> ERROR: Parser rejected command AT+CRSM=192,28613,0,0,15
AT Command> ERROR: Parser rejected command AT+CRSM=192,28472,0,0,15
AT Command> ERROR: Parser rejected command AT+CRSM=192,28438,0,0,15
AT Command> ERROR: Parser rejected command AT+CRSM=192,28437,0,0,15
AT Command> INFO: Parser interpreted command AT+CPIN?
AT Command> ERROR: Parser rejected command AT+CRSM=192,28439,0,0,15
AT Command> ERROR: Parser rejected command AT+CRSM=192,28436,0,0,15
AT Command> ERROR: Parser rejected command AT+CRSM=192,28440,0,0,15
AT Command> INFO: Parser interpreted command AT+CSQ
AT Command> Exiting...
+23
View File
@@ -0,0 +1,23 @@
Fully implemented:
AT Command> INFO: Parser interpreted command AT+CGSN
AT Command> INFO: Parser interpreted command AT+CGMM
AT Command> INFO: Parser interpreted command AT+CGMI
AT Command> INFO: Parser interpreted command AT+CPIN?
AT Command> INFO: Parser interpreted command ATE0Q0V1+CMEE=1
AT Command> INFO: Parser interpreted command AT+CFUN?
AT Command> INFO: Parser interpreted command AT+CFUN=1
AT Command> INFO: Parser interpreted command AT+CIMI
AT Command> INFO: Parser interpreted command AT+COPS?
AT Command> ERROR: Parser rejected command AT+CREG
AT Command> INFO: Parser interpreted command AT+CGACT=1,1
AT Command> INFO: Parser interpreted command AT+CGDCONT?
Not implemented:
AT Command> ERROR: Parser rejected command AT+CNUM
AT Command> ERROR: Parser rejected command AT+CRSM
AT Command> ERROR: Parser rejected command AT+CGMR
AT Command> ERROR: Parser rejected command AT+CESQ
AT Command> ERROR: Parser rejected command AT+CNTI
AT Command> ERROR: Parser rejected command AT!BAND?
AT Command> ERROR: Parser rejected command AT+PACSP?
+851
View File
@@ -0,0 +1,851 @@
/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenAirInterface is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>.
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
*******************************************************************************/
/*****************************************************************************
Source user_api.c
Version 0.1
Date 2012/02/28
Product NAS stack
Subsystem Application Programming Interface
Author Frederic Maurel
Description Implements the API used by the NAS layer running in the UE
to send/receive message to/from the user application layer
*****************************************************************************/
#include "user_api.h"
#include "nas_log.h"
#include "socket.h"
#include "device.h"
#include "nas_user.h"
#include "at_command.h"
#include "at_response.h"
#include "at_error.h"
#include "user_indication.h"
#include <string.h> // strerror, memset
#include <netdb.h> // gai_strerror
#include <errno.h> // errno
#include <stdio.h> // sprintf
#include <unistd.h> // gethostname
/****************************************************************************/
/**************** E X T E R N A L D E F I N I T I O N S ****************/
/****************************************************************************/
/****************************************************************************/
/******************* L O C A L D E F I N I T I O N S *******************/
/****************************************************************************/
/*
* Asynchronous notification procedure handlers
*/
static int _user_api_registration_handler(unsigned char id, const void* data, size_t size);
static int _user_api_location_handler(unsigned char id, const void* data, size_t size);
static int _user_api_network_handler(unsigned char id, const void* data, size_t size);
static int _user_api_pdn_connection_handler(unsigned char id, const void* data, size_t size);
static int _user_api_send(at_response_t* data);
/* -------------------
* Connection endpoint
* -------------------
* The connection endpoint is used to send/receive data to/from the
* user application layer. Its definition depends on the underlaying
* mechanism chosen to communicate (network socket, I/O terminal device).
* A connection endpoint is handled using an identifier, and functions
* used to retreive the file descriptor actually allocated by the system,
* to receive data, to send data, and to perform clean up when connection
* is shut down.
* Only one single end to end connection with the user is managed at a
* time.
*/
static struct {
/* Connection endpoint reference */
void* endpoint;
/* Connection endpoint handlers */
void* (*open) (int, const char*, const char*);
int (*getfd)(const void*);
ssize_t (*recv) (void*, char*, size_t);
ssize_t (*send) (const void*, const char*, size_t);
void (*close)(void*);
} _user_api_id;
#define USER_API_OPEN(a, b, c) _user_api_id.open(a, b, c)
#define USER_API_GETFD() _user_api_id.getfd(_user_api_id.endpoint)
#define USER_API_RECV(a, b) _user_api_id.recv(_user_api_id.endpoint, a, b)
#define USER_API_SEND(a, b) _user_api_id.send(_user_api_id.endpoint, a, b)
#define USER_API_CLOSE() _user_api_id.close(_user_api_id.endpoint)
/*
* The buffer used to receive data from the user application layer
*/
#define USER_API_RECV_BUFFER_SIZE 4096
static char _user_api_recv_buffer[USER_API_RECV_BUFFER_SIZE];
/*
* The buffer used to send data to the user application layer
*/
#define USER_API_SEND_BUFFER_SIZE USER_API_RECV_BUFFER_SIZE
static char _user_api_send_buffer[USER_API_SEND_BUFFER_SIZE];
/*
* The decoded data received from the user application layer
*/
static struct {
int n_cmd; /* number of user data to be processed */
#define USER_DATA_MAX 10
at_command_t cmd[USER_DATA_MAX]; /* user data to be processed */
} _user_data = {};
/****************************************************************************/
/****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/
/****************************************************************************
** **
** Name: user_api_initialize() **
** **
** Description: Initializes the user API from which the NAS layer **
** will send/receive messages to/from the user application **
** layer **
** **
** Inputs: host: The name of the host from which the user **
** application layer will connect **
** port: The local port number **
** Others: None **
** **
** Outputs: Return: RETURNerror, RETURNok **
** Others: _user_api_id **
** **
***************************************************************************/
int user_api_initialize(const char* host, const char* port,
const char* devname, const char* devparams)
{
LOG_FUNC_IN;
gethostname(_user_api_send_buffer, USER_API_SEND_BUFFER_SIZE);
if (devname != NULL) {
/* Initialize device handlers */
_user_api_id.open = device_open;
_user_api_id.getfd = device_get_fd;
_user_api_id.recv = device_read;
_user_api_id.send = device_write;
_user_api_id.close = device_close;
/* Initialize communication channel */
_user_api_id.endpoint = USER_API_OPEN(DEVICE, devname, devparams);
if (_user_api_id.endpoint == NULL) {
LOG_TRACE(ERROR, "USR-API - Failed to open connection endpoint, "
"%s", strerror(errno));
LOG_FUNC_RETURN (RETURNerror);
}
LOG_TRACE(INFO, "USR-API - User's communication device %d is OPENED "
"on %s/%s", user_api_get_fd(), _user_api_send_buffer, devname);
} else {
/* Initialize network socket handlers */
_user_api_id.open = socket_udp_open;
_user_api_id.getfd = socket_get_fd;
_user_api_id.recv = socket_recv;
_user_api_id.send = socket_send;
_user_api_id.close = socket_close;
/* Initialize communication channel */
_user_api_id.endpoint = USER_API_OPEN(SOCKET_SERVER, host, port);
if (_user_api_id.endpoint == NULL) {
const char* error = ( (errno < 0) ?
gai_strerror(errno) : strerror(errno) );
LOG_TRACE(ERROR, "USR-API - Failed to open connection endpoint, "
"%s", error);
LOG_FUNC_RETURN (RETURNerror);
}
LOG_TRACE(INFO, "USR-API - User's UDP socket %d is BOUND to %s/%s",
user_api_get_fd(), _user_api_send_buffer, port);
}
/* Register the asynchronous notification handlers */
if (user_ind_register(USER_IND_REG, 0, _user_api_registration_handler) != RETURNok) {
LOG_TRACE(WARNING, "USR-API - "
"Failed to register registration notification");
} else if (user_ind_register(USER_IND_LOC, 0, _user_api_location_handler) != RETURNok) {
LOG_TRACE(WARNING, "USR-API - "
"Failed to register location notification");
} else if (user_ind_register(USER_IND_PLMN, 0, _user_api_network_handler) != RETURNok) {
LOG_TRACE(WARNING, "USR-API - "
"Failed to register network notification");
} else if (user_ind_register(USER_IND_PLMN, 0, NULL) != RETURNok) {
LOG_TRACE(WARNING, "USR-API - Failed to enable network notification");
} else if (user_ind_register(USER_IND_PDN, 0, _user_api_pdn_connection_handler) != RETURNok) {
LOG_TRACE(WARNING, "USR-API - "
"Failed to register PDN connection notification");
} else if (user_ind_register(USER_IND_PDN, AT_CGACT, NULL) != RETURNok) {
LOG_TRACE(WARNING, "USR-API - "
"Failed to enable PDN connection notification");
} else {
LOG_TRACE(INFO, "USR-API - "
"Notification handlers successfully registered");
}
LOG_FUNC_RETURN (RETURNok);
}
/****************************************************************************
** **
** Name: user_api_get_fd() **
** **
** Description: Get the file descriptor of the connection endpoint used **
** to send/receive messages to/from the user application **
** layer **
** **
** Inputs: None **
** Others: _user_api_id **
** **
** Outputs: Return: The file descriptor of the connection end- **
** point used by the user application layer **
** Others: None **
** **
***************************************************************************/
int user_api_get_fd(void)
{
LOG_FUNC_IN;
LOG_FUNC_RETURN (USER_API_GETFD());
}
/****************************************************************************
** **
** Name: user_api_get_data() **
** **
** Description: Get a generic pointer to the user data structure at the **
** given index. Casting to the proper type is necessary **
** before its usage. **
** **
** Inputs: index: Index of the user data structure to get **
** Others: _user_data **
** **
** Outputs: Return: A generic pointer to the user data **
** structure **
** Others: None **
** **
***************************************************************************/
const void* user_api_get_data(int index)
{
LOG_FUNC_IN;
if (index < _user_data.n_cmd) {
LOG_FUNC_RETURN ((void*)(&_user_data.cmd[index]));
}
LOG_FUNC_RETURN (NULL);
}
/****************************************************************************
** **
** Name: user_api_read_data() **
** **
** Description: Read data received from the user application layer **
** **
** Inputs: fd: File descriptor of the connection endpoint **
** from which data have been received **
** Others: _user_api_id **
** **
** Outputs: Return: The number of bytes read when success; **
** RETURNerror Otherwise **
** Others: _user_api_recv_buffer, _user_api_id **
** **
***************************************************************************/
int user_api_read_data(int fd)
{
LOG_FUNC_IN;
int rbytes;
/* Sanity check */
int sfd = user_api_get_fd();
if (fd != sfd) {
LOG_TRACE(ERROR, "USR-API - Endpoint %d is not the one created for communication with the user application layer (%d)", fd, sfd);
LOG_FUNC_RETURN (RETURNerror);
}
memset(_user_api_recv_buffer, 0, USER_API_RECV_BUFFER_SIZE);
/* Receive data from the user application layer */
rbytes = USER_API_RECV(_user_api_recv_buffer, USER_API_RECV_BUFFER_SIZE);
if (rbytes == RETURNerror) {
LOG_TRACE(ERROR, "USR-API - recv() failed, %s", strerror(errno));
LOG_FUNC_RETURN (RETURNerror);
} else if (rbytes == 0) {
//LOG_TRACE(WARNING, "USR-API - A signal was caught");
} else {
LOG_TRACE(INFO, "USR-API - %d bytes received "
"from the user application layer", rbytes);
LOG_DUMP(_user_api_recv_buffer, rbytes);
}
LOG_FUNC_RETURN (rbytes);
}
/****************************************************************************
** **
** Name: user_api_set_data() **
** **
** Description: Set content of data received buffer to allow loop back **
** **
** Inputs: message: Message to set into the received buffer **
** **
** Outputs: Return: The number of bytes write when success; **
** RETURNerror Otherwise **
** Others: _user_api_recv_buffer **
** **
***************************************************************************/
int user_api_set_data(char *message)
{
LOG_FUNC_IN;
int rbytes;
memset(_user_api_recv_buffer, 0, USER_API_RECV_BUFFER_SIZE);
strncpy(_user_api_recv_buffer, message, USER_API_RECV_BUFFER_SIZE);
rbytes = strlen(_user_api_recv_buffer);
LOG_TRACE(INFO, "USR-API - %d bytes write", rbytes);
LOG_DUMP(_user_api_recv_buffer, rbytes);
LOG_FUNC_RETURN (rbytes);
}
/****************************************************************************
** **
** Name: user_api_send_data() **
** **
** Description: Send data to the user application layer **
** **
** Inputs: fd: File descriptor of the connection endpoint **
** to which data have to be sent **
** length: Number of bytes to send **
** Others: _user_api_send_buffer, _user_api_id **
** **
** Outputs: Return: The number of bytes sent when success; **
** RETURNerror Otherwise **
** Others: None **
** **
***************************************************************************/
static int _user_api_send_data(int length)
{
int sbytes = USER_API_SEND(_user_api_send_buffer, length);
if (sbytes == RETURNerror) {
LOG_TRACE(ERROR, "USR-API - send() failed, %s", strerror(errno));
return RETURNerror;
} else if (sbytes == 0) {
LOG_TRACE(WARNING, "USR-API - A signal was caught");
} else {
LOG_TRACE(INFO, "USR-API - %d bytes sent "
"to the user application layer", sbytes);
LOG_DUMP(_user_api_send_buffer, sbytes);
}
return sbytes;
}
int user_api_send_data(int fd, int length)
{
LOG_FUNC_IN;
/* Sanity check */
int sfd = user_api_get_fd();
if (fd != sfd) {
LOG_TRACE(ERROR, "USR-API - Endpoint %d is not the one created for communication with the user application layer (%d)", fd, sfd);
LOG_FUNC_RETURN (RETURNerror);
}
/* Send data to the user application layer */
int sbytes = 0;
if (length > 0) {
sbytes = _user_api_send_data(length);
}
LOG_FUNC_RETURN (sbytes);
}
/****************************************************************************
** **
** Name: user_api_close() **
** **
** Description: Close the user API from which the NAS layer sent/received **
** messages to/from the user application layer **
** **
** Inputs: fd: File descriptor of the connection endpoint **
** allocated by the system to communicate **
** with the user application layer **
** Others: None **
** **
** Outputs: Return: None **
** Others: _user_api_id **
** **
***************************************************************************/
void user_api_close(int fd)
{
LOG_FUNC_IN;
/* Sanity check */
int sfd = user_api_get_fd();
if (fd != sfd) {
LOG_TRACE(ERROR, "USR-API - Endpoint %d is not the one created for communication with the user application layer (%d)", fd, sfd);
LOG_FUNC_OUT;
return;
}
/* Cleanup the connection endpoint */
USER_API_CLOSE();
_user_api_id.endpoint = NULL;
LOG_FUNC_OUT;
}
/****************************************************************************
** **
** Name: user_api_decode_data() **
** **
** Description: Parses the message received from the user application **
** (mainly AT commands) and fills the user data structure. **
** Returns an AT syntax error code to the user application **
** layer when the AT command failed to be decoded. **
** **
** Inputs: length: Number of bytes to decode **
** Others: _user_api_recv_buffer **
** **
** Outputs: Return: The number of AT commands succeessfully **
** decoded **
** Others: _user_api_send_buffer, _user_data **
** **
***************************************************************************/
int user_api_decode_data(int length)
{
LOG_FUNC_IN;
/* Parse the AT command line */
LOG_TRACE(INFO, "USR-API - Decode user data: %s", _user_api_recv_buffer);
_user_data.n_cmd = at_command_decode(_user_api_recv_buffer, length,
_user_data.cmd);
if (_user_data.n_cmd > 0) {
/* AT command data received from the user application layer
* has been successfully decoded */
LOG_TRACE(INFO, "USR-API - %d AT command%s ha%s been successfully "
"decoded", _user_data.n_cmd,
(_user_data.n_cmd > 1) ? "s" : "",
(_user_data.n_cmd > 1) ? "ve" : "s");
} else {
int bytes;
/* Failed to decode AT command data received from the user
* application layer; Return syntax error code message */
LOG_TRACE(ERROR, "USR-API - Syntax error: Failed to decode "
"AT command data %s", _user_api_recv_buffer);
/* Encode the syntax error code message */
bytes = at_error_encode(_user_api_send_buffer, AT_ERROR_SYNTAX,
AT_ERROR_OPERATION_NOT_SUPPORTED);
/* Send the syntax error code message */
(void) _user_api_send_data(bytes);
}
LOG_FUNC_RETURN (_user_data.n_cmd);
}
/****************************************************************************
** **
** Name: user_api_encode_data() **
** **
** Description: Encodes AT command response message **
** **
** Inputs data: Generic pointer to the data to encode **
** success_code: Indicates whether success code has to be **
** displayed or not (covers the case where **
** more than one AT command is executed in **
** the same user command line). **
** Others: None **
** **
** Outputs: Return: The number of characters that have been **
** successfully encoded; **
** RETURNerror otherwise. **
** Others: _user_api_send_buffer **
** **
***************************************************************************/
int user_api_encode_data(const void* data, int success_code)
{
LOG_FUNC_IN;
const at_response_t* user_data = (at_response_t*)(data);
int bytes;
/* Encode AT command error message */
if (user_data->cause_code != AT_ERROR_SUCCESS) {
bytes = at_error_encode(_user_api_send_buffer, AT_ERROR_CME,
user_data->cause_code);
}
/* Encode AT command response message */
else {
bytes = at_response_encode(_user_api_send_buffer, user_data);
/* Add success result code */
if ( (success_code) && (bytes != RETURNerror) ) {
bytes += at_error_encode(&_user_api_send_buffer[bytes],
AT_ERROR_OK, 0);
}
}
if (bytes != RETURNerror) {
LOG_TRACE(INFO, "USR-API - %d bytes encoded", bytes);
} else {
LOG_TRACE(ERROR, "USR-API - Syntax error: Failed to encode AT "
"response data (%d)", user_data->id);
}
LOG_FUNC_RETURN (bytes);
}
/****************************************************************************
** **
** Name: user_api_callback() **
** **
** Description: Notifies the user application that asynchronous notifica- **
** tion has been received from the EPS Mobility Management **
** sublayer. **
** **
** Inputs: stat: Network registration status **
** tac: Location/Tracking Area Code **
** ci: Indentifier of the serving cell **
** AcT: Access Technology supported by the cell **
** data: Data string to display to the user **
** size: Size of the notification data (only used **
** to display string information to the user **
** application) **
** Others: None **
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others: None **
** **
***************************************************************************/
int user_api_emm_callback(Stat_t stat, tac_t tac, ci_t ci, AcT_t AcT,
const char* data, size_t size)
{
LOG_FUNC_IN;
int rc = RETURNok;
if (size > 1) {
/*
* The list of available operators present in the network has to be
* displayed to the user application
*/
rc = user_ind_notify(USER_IND_PLMN, (void*)data, size);
} else {
user_indication_t ind;
ind.notification.reg.status = stat;
if (size > 0) {
/* The UE's network registration status has changed */
rc = user_ind_notify(USER_IND_REG, (void*)&ind, 0);
}
if (rc != RETURNerror) {
/* The UE's location area has changed or,
* the UE's network registration status has changed and
* only location information notification is enabled */
ind.notification.loc.tac = tac;
ind.notification.loc.ci = ci;
ind.notification.loc.AcT = AcT;
rc = user_ind_notify(USER_IND_LOC, (void*)&ind, 0);
}
}
if (rc != RETURNerror) {
LOG_FUNC_RETURN (RETURNok);
}
LOG_FUNC_RETURN (rc);
}
/****************************************************************************
** **
** Name: user_api_esm_callback() **
** **
** Description: Notifies the user application that asynchronous notifica- **
** tion has been received from the EPS Session Management **
** sublayer. **
** **
** Inputs: cid: PDN connection identifier **
** state: PDN connection status **
** Others: None **
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others: None **
** **
***************************************************************************/
int user_api_esm_callback(int cid, network_pdn_state_t state)
{
LOG_FUNC_IN;
int rc = RETURNok;
user_indication_t ind;
ind.notification.pdn.cid = cid;
ind.notification.pdn.status = state;
/* The status of the specified PDN connection has changed */
rc = user_ind_notify(USER_IND_PDN, (void*)&ind, 0);
LOG_FUNC_RETURN (rc);
}
/****************************************************************************/
/********************* L O C A L F U N C T I O N S *********************/
/****************************************************************************/
/****************************************************************************
** **
** Name: _user_api_send() **
** **
** Description: Encodes and sends data to the user application layer **
** **
** Inputs: data: The data to send **
** Others: _user_api_send_buffer, _user_api_id **
** **
** Outputs: Return: The number of bytes sent when success; **
** RETURNerror Otherwise **
** Others: None **
** **
***************************************************************************/
static int _user_api_send(at_response_t* data)
{
LOG_FUNC_IN;
/* Encode AT command response message */
int bytes = at_response_encode(_user_api_send_buffer, data);
/* Send the AT command response message to the user application */
if (bytes != RETURNerror) {
bytes = _user_api_send_data(bytes);
}
LOG_FUNC_RETURN (bytes);
}
/****************************************************************************
** **
** Name: _user_api_registration_handler() **
** **
** Description: Procedure executed upon receiving registration notifica- **
** tion whenever there is a change in the UE's network re- **
** gistration status in GERAN/UTRAN/E-UTRAN. **
** The network registration data are then displayed to the **
** user. **
** **
** Inputs: id: Network registration AT command identifier **
** data: Generic pointer to the registration data **
** size: Not used **
** Others: None **
** **
** Outputs: None **
** Return: The number of bytes actually sent to the **
** user application **
** Others: None **
** **
***************************************************************************/
static int _user_api_registration_handler(unsigned char id, const void* data,
size_t size)
{
LOG_FUNC_IN;
/* Get registration notification data */
user_ind_reg_t* reg = (user_ind_reg_t*)data;
/* Setup AT command response message for AT+CEREG? read command */
at_response_t at_response;
at_response.id = id; // may be +CREG, +CGREG, +CEREG
at_response.type = AT_COMMAND_GET;
at_response.mask = AT_RESPONSE_NO_PARAM;
at_response.response.cereg.n = AT_CEREG_ON;
at_response.response.cereg.stat = reg->status;
/* Encode and send the AT command response message to the user */
int bytes = _user_api_send(&at_response);
LOG_FUNC_RETURN (bytes);
}
/****************************************************************************
** **
** Name: _user_api_location_handler() **
** **
** Description: Procedure executed upon receiving location notification **
** whenever there is a change in the network serving cell **
** in GERAN/UTRAN/E-UTRAN. **
** The location data are then displayed to the user. **
** **
** Inputs: id: Network registration AT command identifier **
** data: Generic pointer to the registration data **
** size: Not used **
** Others: None **
** **
** Outputs: None **
** Return: The number of bytes actually sent to the **
** user application **
** Others: None **
** **
***************************************************************************/
static int _user_api_location_handler(unsigned char id, const void* data,
size_t size)
{
LOG_FUNC_IN;
/* Get location notification data */
user_ind_loc_t* loc = (user_ind_loc_t*)data;
/* Setup AT command response message for AT+CEREG? read command */
at_response_t at_response;
at_response.id = id; // may be +CREG, +CGREG, +CEREG
at_response.type = AT_COMMAND_GET;
at_response.mask = (AT_CEREG_RESP_TAC_MASK | AT_CEREG_RESP_CI_MASK);
at_response.response.cereg.n = AT_CEREG_BOTH;
at_response.response.cereg.stat = loc->status;
sprintf(at_response.response.cereg.tac, "%.4x", loc->tac); // two byte
sprintf(at_response.response.cereg.ci, "%.8x", loc->ci); // four byte
if (at_response.response.cereg.AcT != NET_ACCESS_UNAVAILABLE) {
at_response.response.cereg.AcT = loc->AcT;
at_response.mask |= AT_CEREG_RESP_ACT_MASK;
}
/* Encode and send the AT command response message to the user */
int bytes = _user_api_send(&at_response);
LOG_FUNC_RETURN (bytes);
}
/****************************************************************************
** **
** Name: _user_api_network_handler() **
** **
** Description: Procedure executed whenever the list of operators present **
** in the network has to be displayed to the user. **
** **
** Inputs: id: Not used **
** data: Generic pointer to the list of operators **
** size: The size of the data to display **
** Others: None **
** **
** Outputs: None **
** Return: The number of bytes actually sent to the **
** user application **
** Others: None **
** **
***************************************************************************/
static int _user_api_network_handler(unsigned char id, const void* data,
size_t size)
{
LOG_FUNC_IN;
/* Setup AT command response message for AT+COPS=? test command */
at_response_t at_response;
at_response.id = AT_COPS;
at_response.type = AT_COMMAND_TST;
at_response.response.cops.tst.data = (char*)data;
at_response.response.cops.tst.size = size;
/* Encode and send the AT command response message to the user */
int bytes = _user_api_send(&at_response);
LOG_FUNC_RETURN (bytes);
}
/****************************************************************************
** **
** Name: _user_api_pdn_connection_handler() **
** **
** Description: Procedure executed upon receiving PDN connection notifi- **
** cation whenever the user or the network has activated or **
** desactivated a PDN connection. **
** The PDN connection data are then displayed to the user. **
** **
** Inputs: id: Not used **
** data: Generic pointer to the PDN connection data **
** size: Not used **
** Others: None **
** **
** Outputs: None **
** Return: The number of bytes actually sent to the **
** user application **
** Others: None **
** **
***************************************************************************/
static int _user_api_pdn_connection_handler(unsigned char id, const void* data,
size_t size)
{
LOG_FUNC_IN;
/* Get PDN connection notification data */
user_ind_pdn_t* pdn = (user_ind_pdn_t*)data;
/* Setup AT command unsolicited result response message for +CGEV */
at_response_t at_response;
at_response.id = AT_CGEV;
at_response.type = AT_COMMAND_GET;
at_response.mask = AT_RESPONSE_CGEV_MASK;
at_response.response.cgev.cid = pdn->cid;
at_response.response.cgev.code = pdn->status;
/* Encode and send the AT command response message to the user */
int bytes = _user_api_send(&at_response);
LOG_FUNC_RETURN (bytes);
}
+85
View File
@@ -0,0 +1,85 @@
/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenAirInterface is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>.
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
*******************************************************************************/
/*****************************************************************************
Source user_api.h
Version 0.1
Date 2012/02/28
Product NAS stack
Subsystem Application Programming Interface
Author Frederic Maurel
Description Implements the API used by the NAS layer running in the UE
to send/receive message to/from the user application layer
*****************************************************************************/
#ifndef __USER_API_H__
#define __USER_API_H__
#include "commonDef.h"
#include "networkDef.h"
/****************************************************************************/
/********************* G L O B A L C O N S T A N T S *******************/
/****************************************************************************/
/****************************************************************************/
/************************ G L O B A L T Y P E S ************************/
/****************************************************************************/
/****************************************************************************/
/******************** G L O B A L V A R I A B L E S ********************/
/****************************************************************************/
/****************************************************************************/
/****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/
int user_api_initialize(const char* host, const char* port, const char* devname, const char* devparams);
int user_api_emm_callback(Stat_t stat, tac_t tac, ci_t ci, AcT_t AcT, const char* data, size_t size);
int user_api_esm_callback(int cid, network_pdn_state_t state);
int user_api_get_fd(void);
const void* user_api_get_data(int index);
int user_api_read_data(int fd);
int user_api_set_data(char *message);
int user_api_send_data(int fd, int length);
void user_api_close(int fd);
int user_api_decode_data(int length);
int user_api_encode_data(const void* data, int add_success_code);
#endif /* __USER_API_H__ */
+182
View File
@@ -0,0 +1,182 @@
/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenAirInterface is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>.
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
*******************************************************************************/
/*****************************************************************************
Source user_indication.c
Version 0.1
Date 2012/10/25
Product NAS stack
Subsystem Application Programming Interface
Author Frederic Maurel
Description Defines functions which allow the user application to register
procedures to be executed upon receiving asynchronous notifi-
cation.
*****************************************************************************/
#include "user_indication.h"
#include "nas_log.h"
/****************************************************************************/
/**************** E X T E R N A L D E F I N I T I O N S ****************/
/****************************************************************************/
/****************************************************************************/
/******************* L O C A L D E F I N I T I O N S *******************/
/****************************************************************************/
/* Notification handler */
static struct {
unsigned char id;
unsigned char mask;
user_ind_callback_t callback[USER_IND_MAX];
} _user_ind_handler = {};
/****************************************************************************/
/****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/
/****************************************************************************
** **
** Name: user_ind_register() **
** **
** Description: Register the specified procedure to be executed upon **
** receiving the given asynchronous notification **
** **
** Inputs: ind: The notification type **
** id: The notification identifier **
** cb: The procedure to register **
** Others: None **
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others: _user_ind_handler **
** **
***************************************************************************/
int user_ind_register(user_ind_t ind, unsigned char id, user_ind_callback_t cb)
{
LOG_FUNC_IN;
int rc = RETURNerror;
if (ind < USER_IND_MAX) {
/* Register the notification callback */
if (cb != NULL) {
_user_ind_handler.callback[ind] = cb;
} else {
_user_ind_handler.id = id;
_user_ind_handler.mask |= (1 << ind);
}
rc = RETURNok;
}
LOG_FUNC_RETURN(rc);
}
/****************************************************************************
** **
** Name: user_ind_deregister() **
** **
** Description: Prevent a registered procedure from being executed upon **
** receiving the given asynchronous notification **
** **
** Inputs: ind: The notification identifier **
** Others: None **
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others: _user_ind_handler **
** **
***************************************************************************/
int user_ind_deregister(user_ind_t ind)
{
LOG_FUNC_IN;
int rc = RETURNerror;
if (ind < USER_IND_MAX) {
_user_ind_handler.mask &= ~(1 << ind);
rc = RETURNok;
}
LOG_FUNC_RETURN(rc);
}
/****************************************************************************
** **
** Name: user_ind_notify() **
** **
** Description: Execute the procedure if registered for the received **
** notification identifier **
** **
** Inputs: ind: The notification identifier **
** data: Generic pointer to the notification data **
** size: The size parameter of the registered call- **
** back procedure to execute **
** Others: _user_ind_handler **
** **
** Outputs: None **
** Return: RETURNok, RETURNerror **
** Others: None **
** **
***************************************************************************/
int user_ind_notify(user_ind_t ind, const void* data, size_t size)
{
LOG_FUNC_IN;
int rc = RETURNerror;
if (ind < USER_IND_MAX) {
if (_user_ind_handler.mask & (1 << ind)) {
/* Execute the notification callback */
user_ind_callback_t notify = _user_ind_handler.callback[ind];
if (notify != NULL) {
rc = (*notify)(_user_ind_handler.id, data, size);
}
} else {
/* Silently discard not registered notification */
rc = RETURNok;
}
}
LOG_FUNC_RETURN(rc);
}
/****************************************************************************/
/********************* L O C A L F U N C T I O N S *********************/
/****************************************************************************/
+129
View File
@@ -0,0 +1,129 @@
/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenAirInterface is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>.
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
*******************************************************************************/
/*****************************************************************************
Source user_indication.h
Version 0.1
Date 2012/10/25
Product NAS stack
Subsystem Application Programming Interface
Author Frederic Maurel
Description Defines functions which allow the user application to register
procedures to be executed upon receiving asynchronous notifi-
cation.
*****************************************************************************/
#ifndef __USER_IND_H__
#define __USER_IND_H__
#include "commonDef.h"
#include "networkDef.h"
/****************************************************************************/
/********************* G L O B A L C O N S T A N T S *******************/
/****************************************************************************/
/*
* Type of notification that may be asynchronously received by the user
*/
typedef enum {
USER_IND_REG = 0, /* Registration notification */
USER_IND_LOC, /* Location notification */
USER_IND_PLMN, /* Network notification */
USER_IND_PDN, /* PDN connection notification */
USER_IND_MAX
} user_ind_t;
/*
* Registration notification are received whenever there is a change in the
* UE's network registration status in GERAN/UTRAN/E-UTRAN
*/
typedef struct {
Stat_t status; /* network registration status */
} user_ind_reg_t;
/*
* Location notification are received whenever there is a change in the
* network serving cell in GERAN/UTRAN/E-UTRAN
*/
typedef struct {
Stat_t status; /* network registration status */
tac_t tac; /* Location/Tracking area code */
ci_t ci; /* GERAN/UTRAN/E-UTRAN cell ID */
AcT_t AcT; /* Supported Access Technology */
} user_ind_loc_t;
/*
* PDN connection notification are received whenever the user or the network
* has activated or desactivated a PDN connection
*/
typedef struct {
uint8_t cid; /* PDN connection identifier */
network_pdn_state_t status; /* PDN connection status */
} user_ind_pdn_t;
/*
* Structure of asynchronous notification received by the user
*/
typedef struct {
union {
user_ind_reg_t reg; /* Registration notification */
user_ind_loc_t loc; /* Location notification */
user_ind_pdn_t pdn; /* PDN connection notification */
} notification;
} user_indication_t;
/*
* Type of procedure executed upon receiving registered notification
*/
typedef int (*user_ind_callback_t) (unsigned char, const void*, size_t);
/****************************************************************************/
/************************ G L O B A L T Y P E S ************************/
/****************************************************************************/
/****************************************************************************/
/******************** G L O B A L V A R I A B L E S ********************/
/****************************************************************************/
/****************************************************************************/
/****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/
int user_ind_register(user_ind_t ind, unsigned char id, user_ind_callback_t cb);
int user_ind_deregister(user_ind_t ind);
int user_ind_notify(user_ind_t ind, const void* data, size_t size);
#endif /* __USER_IND_H__*/
+674
View File
@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+49
View File
@@ -0,0 +1,49 @@
################################################################################
# OpenAirInterface
# Copyright(c) 1999 - 2014 Eurecom
#
# OpenAirInterface is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
#
# OpenAirInterface is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenAirInterface.The full GNU General Public License is
# included in this distribution in the file called "COPYING". If not,
# see <http://www.gnu.org/licenses/>.
#
# Contact Information
# OpenAirInterface Admin: openair_admin@eurecom.fr
# OpenAirInterface Tech : openair_tech@eurecom.fr
# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
#
# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
#
################################################################################
ifndef PROJDIR
PROJDIR = $(PWD)/../../..
INCLUDES = -I. -I$(INCDIR) -I$(UTILDIR) -I$(IESDIR) -I$(EMMMSGDIR) -I$(ESMMSGDIR)
endif
include $(PROJDIR)/Makerules
include $(PROJDIR)/Makefile.inc
all: $(OBJS)
%.o: %.c Makefile
@echo Compiling $<
@$(CC) $(CFLAGS) -c $< -o $@
clean:
$(RM) $(OBJS) *.bak *~
depend:
makedepend -- ${CFLAGS} -- ${SRCS}
# DO NOT DELETE THIS LINE -- make depend depends on it.
+485
View File
@@ -0,0 +1,485 @@
/*-------------------------------------------------------------------
* Example algorithms f1, f1*, f2, f3, f4, f5, f5*
*-------------------------------------------------------------------
*
* A sample implementation of the example 3GPP authentication and
* key agreement functions f1, f1*, f2, f3, f4, f5 and f5*. This is
* a byte-oriented implementation of the functions, and of the block
* cipher kernel function Rijndael.
*
* This has been coded for clarity, not necessarily for efficiency.
*
* The functions f2, f3, f4 and f5 share the same inputs and have
* been coded together as a single function. f1, f1* and f5* are
* all coded separately.
* From 3GPP 35.206-900
*-----------------------------------------------------------------*/
#include "aka_functions.h"
#include "nas_log.h"
/*--------- Operator Variant Algorithm Configuration Field --------*/
/*------- Insert your value of OP here -------*/
/* PFT OP used currently in HSS (OPENAIRHSS/auc/kdf.c) */
u8 OP[16] = {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11
};
/*------- Insert your value of OP here -------*/
/*-------------------------------------------------------------------
* Algorithm f1
*-------------------------------------------------------------------
*
* Computes network authentication code MAC-A from key K, random
* challenge RAND, sequence number SQN and authentication management
* field AMF.
*
*-----------------------------------------------------------------*/
void f1 ( u8 k_pP[16], u8 rand_pP[16], u8 sqn_pP[6], u8 amf_pP[2],
u8 mac_a_pP[8] )
{
u8 op_c[16];
u8 temp[16];
u8 in1[16];
u8 out1[16];
u8 rijndaelInput[16];
u8 i;
RijndaelKeySchedule( k_pP );
ComputeOPc( op_c );
for (i=0; i<16; i++)
rijndaelInput[i] = rand_pP[i] ^ op_c[i];
RijndaelEncrypt( rijndaelInput, temp );
for (i=0; i<6; i++) {
in1[i] = sqn_pP[i];
in1[i+8] = sqn_pP[i];
}
for (i=0; i<2; i++) {
in1[i+6] = amf_pP[i];
in1[i+14] = amf_pP[i];
}
/* XOR op_c and in1, rotate by r1=64, and XOR *
* on the constant c1 (which is all zeroes) */
for (i=0; i<16; i++)
rijndaelInput[(i+8) % 16] = in1[i] ^ op_c[i];
/* XOR on the value temp computed before */
for (i=0; i<16; i++)
rijndaelInput[i] ^= temp[i];
RijndaelEncrypt( rijndaelInput, out1 );
for (i=0; i<16; i++)
out1[i] ^= op_c[i];
for (i=0; i<8; i++)
mac_a_pP[i] = out1[i];
return;
} /* end of function f1 */
/*-------------------------------------------------------------------
* Algorithms f2-f5
*-------------------------------------------------------------------
*
* Takes key K and random challenge RAND, and returns response RES,
* confidentiality key CK, integrity key IK and anonymity key AK.
*
*-----------------------------------------------------------------*/
void f2345 ( u8 k_pP[16], u8 rand_pP[16],
u8 res_pP[8], u8 ck_pP[16], u8 ik_pP[16], u8 ak_pP[6] )
{
u8 op_c[16];
u8 temp[16];
u8 out[16];
u8 rijndaelInput[16];
u8 i;
LOG_TRACE(DEBUG,
"USIM-API - f2345 : in k[0..15]=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
k_pP[0],k_pP[1],k_pP[2], k_pP[3], k_pP[4], k_pP[5], k_pP[6], k_pP[7],
k_pP[8],k_pP[9],k_pP[10],k_pP[11],k_pP[12],k_pP[13],k_pP[14],k_pP[15]);
LOG_TRACE(DEBUG,
"USIM-API - f2345 : in rand[0..15]=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
rand_pP[0],rand_pP[1],rand_pP[2], rand_pP[3], rand_pP[4], rand_pP[5], rand_pP[6], rand_pP[7],
rand_pP[8],rand_pP[9],rand_pP[10],rand_pP[11],rand_pP[12],rand_pP[13],rand_pP[14],rand_pP[15]);
RijndaelKeySchedule( k_pP );
ComputeOPc( op_c );
for (i=0; i<16; i++)
rijndaelInput[i] = rand_pP[i] ^ op_c[i];
RijndaelEncrypt( rijndaelInput, temp );
/* To obtain output block OUT2: XOR OPc and TEMP, *
* rotate by r2=0, and XOR on the constant c2 (which *
* is all zeroes except that the last bit is 1). */
for (i=0; i<16; i++)
rijndaelInput[i] = temp[i] ^ op_c[i];
rijndaelInput[15] ^= 1;
RijndaelEncrypt( rijndaelInput, out );
for (i=0; i<16; i++)
out[i] ^= op_c[i];
for (i=0; i<8; i++)
res_pP[i] = out[i+8];
for (i=0; i<6; i++)
ak_pP[i] = out[i];
LOG_TRACE(DEBUG,
"USIM-API - f2345 : out f2 res[0..7]=%02X%02X%02X%02X%02X%02X%02X%02X",
res_pP[0],res_pP[1],res_pP[2], res_pP[3], res_pP[4], res_pP[5], res_pP[6], res_pP[7]);
LOG_TRACE(DEBUG,
"USIM-API - f2345 : out f5 ak[0..5]=%02X%02X%02X%02X%02X%02X",
ak_pP[0],ak_pP[1],ak_pP[2], ak_pP[3], ak_pP[4], ak_pP[5]);
/* To obtain output block OUT3: XOR OPc and TEMP, *
* rotate by r3=32, and XOR on the constant c3 (which *
* is all zeroes except that the next to last bit is 1). */
for (i=0; i<16; i++)
rijndaelInput[(i+12) % 16] = temp[i] ^ op_c[i];
rijndaelInput[15] ^= 2;
RijndaelEncrypt( rijndaelInput, out );
for (i=0; i<16; i++)
out[i] ^= op_c[i];
for (i=0; i<16; i++)
ck_pP[i] = out[i];
LOG_TRACE(DEBUG,
"USIM-API - f2345 : out f3 ck_pP[0..7]=%02X%02X%02X%02X%02X%02X%02X%02X",
ck_pP[0],ck_pP[1],ck_pP[2], ck_pP[3], ck_pP[4], ck_pP[5], ck_pP[6], ck_pP[7]);
/* To obtain output block OUT4: XOR OPc and TEMP, *
* rotate by r4=64, and XOR on the constant c4 (which *
* is all zeroes except that the 2nd from last bit is 1). */
for (i=0; i<16; i++)
rijndaelInput[(i+8) % 16] = temp[i] ^ op_c[i];
rijndaelInput[15] ^= 4;
RijndaelEncrypt( rijndaelInput, out );
for (i=0; i<16; i++)
out[i] ^= op_c[i];
for (i=0; i<16; i++)
ik_pP[i] = out[i];
LOG_TRACE(DEBUG,
"USIM-API - f2345 : out f4 ik_pP[0..15]=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
ik_pP[0],ik_pP[1],ik_pP[2], ik_pP[3], ik_pP[4], ik_pP[5], ik_pP[6], ik_pP[7],
ik_pP[8],ik_pP[9],ik_pP[10],ik_pP[11],ik_pP[12],ik_pP[13],ik_pP[14],ik_pP[15]);
return;
} /* end of function f2345 */
/*-------------------------------------------------------------------
* Algorithm f1*
*-------------------------------------------------------------------
*
* Computes resynch authentication code MAC-S from key K, random
* challenge RAND, sequence number SQN and authentication management
* field AMF.
*
*-----------------------------------------------------------------*/
void f1star( u8 k_pP[16], u8 rand_pP[16], u8 sqn_pP[6], u8 amf_pP[2],
u8 mac_s_pP[8] )
{
u8 op_c[16];
u8 temp[16];
u8 in1[16];
u8 out1[16];
u8 rijndaelInput[16];
u8 i;
RijndaelKeySchedule( k_pP );
ComputeOPc( op_c );
for (i=0; i<16; i++)
rijndaelInput[i] = rand_pP[i] ^ op_c[i];
RijndaelEncrypt( rijndaelInput, temp );
for (i=0; i<6; i++) {
in1[i] = sqn_pP[i];
in1[i+8] = sqn_pP[i];
}
for (i=0; i<2; i++) {
in1[i+6] = amf_pP[i];
in1[i+14] = amf_pP[i];
}
/* XOR op_c and in1, rotate by r1=64, and XOR *
* on the constant c1 (which is all zeroes) */
for (i=0; i<16; i++)
rijndaelInput[(i+8) % 16] = in1[i] ^ op_c[i];
/* XOR on the value temp computed before */
for (i=0; i<16; i++)
rijndaelInput[i] ^= temp[i];
RijndaelEncrypt( rijndaelInput, out1 );
for (i=0; i<16; i++)
out1[i] ^= op_c[i];
for (i=0; i<8; i++)
mac_s_pP[i] = out1[i+8];
return;
} /* end of function f1star */
/*-------------------------------------------------------------------
* Algorithm f5*
*-------------------------------------------------------------------
*
* Takes key K and random challenge RAND, and returns resynch
* anonymity key AK.
*
*-----------------------------------------------------------------*/
void f5star( u8 k_pP[16], u8 rand_pP[16],
u8 ak_pP[6] )
{
u8 op_c[16];
u8 temp[16];
u8 out[16];
u8 rijndaelInput[16];
u8 i;
RijndaelKeySchedule( k_pP );
ComputeOPc( op_c );
for (i=0; i<16; i++)
rijndaelInput[i] = rand_pP[i] ^ op_c[i];
RijndaelEncrypt( rijndaelInput, temp );
/* To obtain output block OUT5: XOR OPc and TEMP, *
* rotate by r5=96, and XOR on the constant c5 (which *
* is all zeroes except that the 3rd from last bit is 1). */
for (i=0; i<16; i++)
rijndaelInput[(i+4) % 16] = temp[i] ^ op_c[i];
rijndaelInput[15] ^= 8;
RijndaelEncrypt( rijndaelInput, out );
for (i=0; i<16; i++)
out[i] ^= op_c[i];
for (i=0; i<6; i++)
ak_pP[i] = out[i];
return;
} /* end of function f5star */
/*-------------------------------------------------------------------
* Function to compute OPc from OP and K. Assumes key schedule has
already been performed.
*-----------------------------------------------------------------*/
void ComputeOPc( u8 op_c_pP[16] )
{
u8 i;
LOG_TRACE(DEBUG,
"USIM-API - ComputeOPc : OP[0..15]=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
OP[0],OP[1],OP[2], OP[3], OP[4], OP[5], OP[6], OP[7],
OP[8],OP[9],OP[10],OP[11],OP[12],OP[13],OP[14],OP[15]);
RijndaelEncrypt( OP, op_c_pP );
for (i=0; i<16; i++)
op_c_pP[i] ^= OP[i];
return;
} /* end of function ComputeOPc */
/*-------------------- Rijndael round subkeys ---------------------*/
u8 roundKeys[11][4][4];
/*--------------------- Rijndael S box table ----------------------*/
u8 S[256] = {
99,124,119,123,242,107,111,197, 48, 1,103, 43,254,215,171,118,
202,130,201,125,250, 89, 71,240,173,212,162,175,156,164,114,192,
183,253,147, 38, 54, 63,247,204, 52,165,229,241,113,216, 49, 21,
4,199, 35,195, 24,150, 5,154, 7, 18,128,226,235, 39,178,117,
9,131, 44, 26, 27,110, 90,160, 82, 59,214,179, 41,227, 47,132,
83,209, 0,237, 32,252,177, 91,106,203,190, 57, 74, 76, 88,207,
208,239,170,251, 67, 77, 51,133, 69,249, 2,127, 80, 60,159,168,
81,163, 64,143,146,157, 56,245,188,182,218, 33, 16,255,243,210,
205, 12, 19,236, 95,151, 68, 23,196,167,126, 61,100, 93, 25,115,
96,129, 79,220, 34, 42,144,136, 70,238,184, 20,222, 94, 11,219,
224, 50, 58, 10, 73, 6, 36, 92,194,211,172, 98,145,149,228,121,
231,200, 55,109,141,213, 78,169,108, 86,244,234,101,122,174, 8,
186,120, 37, 46, 28,166,180,198,232,221,116, 31, 75,189,139,138,
112, 62,181,102, 72, 3,246, 14, 97, 53, 87,185,134,193, 29,158,
225,248,152, 17,105,217,142,148,155, 30,135,233,206, 85, 40,223,
140,161,137, 13,191,230, 66,104, 65,153, 45, 15,176, 84,187, 22,
};
/*------- This array does the multiplication by x in GF(2^8) ------*/
u8 Xtime[256] = {
0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62,
64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94,
96, 98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,
128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,
160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,
192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,
224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,
27, 25, 31, 29, 19, 17, 23, 21, 11, 9, 15, 13, 3, 1, 7, 5,
59, 57, 63, 61, 51, 49, 55, 53, 43, 41, 47, 45, 35, 33, 39, 37,
91, 89, 95, 93, 83, 81, 87, 85, 75, 73, 79, 77, 67, 65, 71, 69,
123,121,127,125,115,113,119,117,107,105,111,109, 99, 97,103,101,
155,153,159,157,147,145,151,149,139,137,143,141,131,129,135,133,
187,185,191,189,179,177,183,181,171,169,175,173,163,161,167,165,
219,217,223,221,211,209,215,213,203,201,207,205,195,193,199,197,
251,249,255,253,243,241,247,245,235,233,239,237,227,225,231,229
};
/*-------------------------------------------------------------------
* Rijndael key schedule function. Takes 16-byte key and creates
* all Rijndael's internal subkeys ready for encryption.
*-----------------------------------------------------------------*/
void RijndaelKeySchedule( u8 key[16] )
{
u8 roundConst;
int i, j;
/* first round key equals key */
for (i=0; i<16; i++)
roundKeys[0][i & 0x03][i>>2] = key[i];
roundConst = 1;
/* now calculate round keys */
for (i=1; i<11; i++) {
roundKeys[i][0][0] = S[roundKeys[i-1][1][3]]
^ roundKeys[i-1][0][0] ^ roundConst;
roundKeys[i][1][0] = S[roundKeys[i-1][2][3]]
^ roundKeys[i-1][1][0];
roundKeys[i][2][0] = S[roundKeys[i-1][3][3]]
^ roundKeys[i-1][2][0];
roundKeys[i][3][0] = S[roundKeys[i-1][0][3]]
^ roundKeys[i-1][3][0];
for (j=0; j<4; j++) {
roundKeys[i][j][1] = roundKeys[i-1][j][1] ^ roundKeys[i][j][0];
roundKeys[i][j][2] = roundKeys[i-1][j][2] ^ roundKeys[i][j][1];
roundKeys[i][j][3] = roundKeys[i-1][j][3] ^ roundKeys[i][j][2];
}
/* update round constant */
roundConst = Xtime[roundConst];
}
return;
} /* end of function RijndaelKeySchedule */
/* Round key addition function */
void KeyAdd(u8 state[4][4], u8 roundKeys[11][4][4], int round)
{
int i, j;
for (i=0; i<4; i++)
for (j=0; j<4; j++)
state[i][j] ^= roundKeys[round][i][j];
return;
}
/* Byte substitution transformation */
int ByteSub(u8 state[4][4])
{
int i, j;
for (i=0; i<4; i++)
for (j=0; j<4; j++)
state[i][j] = S[state[i][j]];
return 0;
}
/* Row shift transformation */
void ShiftRow(u8 state[4][4])
{
u8 temp;
/* left rotate row 1 by 1 */
temp = state[1][0];
state[1][0] = state[1][1];
state[1][1] = state[1][2];
state[1][2] = state[1][3];
state[1][3] = temp;
/* left rotate row 2 by 2 */
temp = state[2][0];
state[2][0] = state[2][2];
state[2][2] = temp;
temp = state[2][1];
state[2][1] = state[2][3];
state[2][3] = temp;
/* left rotate row 3 by 3 */
temp = state[3][0];
state[3][0] = state[3][3];
state[3][3] = state[3][2];
state[3][2] = state[3][1];
state[3][1] = temp;
return;
}
/* MixColumn transformation*/
void MixColumn(u8 state[4][4])
{
u8 temp, tmp, tmp0;
int i;
/* do one column at a time */
for (i=0; i<4; i++) {
temp = state[0][i] ^ state[1][i] ^ state[2][i] ^ state[3][i];
tmp0 = state[0][i];
/* Xtime array does multiply by x in GF2^8 */
tmp = Xtime[state[0][i] ^ state[1][i]];
state[0][i] ^= temp ^ tmp;
tmp = Xtime[state[1][i] ^ state[2][i]];
state[1][i] ^= temp ^ tmp;
tmp = Xtime[state[2][i] ^ state[3][i]];
state[2][i] ^= temp ^ tmp;
tmp = Xtime[state[3][i] ^ tmp0];
state[3][i] ^= temp ^ tmp;
}
return;
}
/*-------------------------------------------------------------------
* Rijndael encryption function. Takes 16-byte input and creates
* 16-byte output (using round keys already derived from 16-byte
* key).
*-----------------------------------------------------------------*/
void RijndaelEncrypt( u8 input[16], u8 output[16] )
{
u8 state[4][4];
int i, r;
/* initialise state array from input byte string */
for (i=0; i<16; i++)
state[i & 0x3][i>>2] = input[i];
/* add first round_key */
KeyAdd(state, roundKeys, 0);
/* do lots of full rounds */
for (r=1; r<=9; r++) {
ByteSub(state);
ShiftRow(state);
MixColumn(state);
KeyAdd(state, roundKeys, r);
}
/* final round */
ByteSub(state);
ShiftRow(state);
KeyAdd(state, roundKeys, r);
/* produce output byte string from state array */
for (i=0; i<16; i++) {
output[i] = state[i & 0x3][i>>2];
}
return;
} /* end of function RijndaelEncrypt */
+42
View File
@@ -0,0 +1,42 @@
/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenAirInterface is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>.
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
*******************************************************************************/
typedef unsigned char u8;
/*--------------------------- prototypes --------------------------*/
void f1 ( u8 k[16], u8 rand[16], u8 sqn[6], u8 amf[2],
u8 mac_a[8] );
void f2345 ( u8 k[16], u8 rand[16],
u8 res[8], u8 ck[16], u8 ik[16], u8 ak[6] );
void f1star( u8 k[16], u8 rand[16], u8 sqn[6], u8 amf[2],
u8 mac_s[8] );
void f5star( u8 k[16], u8 rand[16],
u8 ak[6] );
void ComputeOPc( u8 op_c[16] );
void RijndaelKeySchedule( u8 key[16] );
void RijndaelEncrypt( u8 input[16], u8 output[16] );
+404
View File
@@ -0,0 +1,404 @@
/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenAirInterface is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>.
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
*******************************************************************************/
/*****************************************************************************
Source usim_api.h
Version 0.1
Date 2012/10/09
Product NAS stack
Subsystem Application Programming Interface
Author Frederic Maurel
Description Implements the API used by the NAS layer to read/write
data to/from the USIM application
*****************************************************************************/
#include "usim_api.h"
#include "nas_log.h"
#include "memory.h"
#include "aka_functions.h"
#include <string.h> // memcpy, memset
#include <stdlib.h> // malloc, free
/****************************************************************************/
/**************** E X T E R N A L D E F I N I T I O N S ****************/
/****************************************************************************/
/****************************************************************************/
/******************* L O C A L D E F I N I T I O N S *******************/
/****************************************************************************/
/*
* The name of the file where are stored data of the USIM application
*/
#define USIM_API_NVRAM_FILENAME ".usim.nvram"
/*
* The name of the environment variable which defines the directory
* where the USIM application file is located
*/
#define USIM_API_NVRAM_DIRNAME "USIM_DIR"
/*
* Subscriber authentication security key
*/
#define USIM_API_K_SIZE 16
#define USIM_API_K_VALUE "8BAF473F2F8FD09487CCCBD7097C6862"
static uint8_t _usim_api_k[USIM_API_K_SIZE];
/*
* List of last used Sequence Numbers SQN
*/
static struct _usim_api_data_s {
/* Highest sequence number the USIM has ever accepted */
uint32_t sqn_ms;
/* List of the last used sequence numbers */
#define USIM_API_SQN_LIST_SIZE 32
uint8_t n_sqns;
uint32_t sqn[USIM_API_SQN_LIST_SIZE];
} _usim_api_data;
static uint8_t _usim_api_hex_char_to_hex_value (char c);
static void _usim_api_hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int size);
static int _usim_api_check_sqn(uint32_t seq, uint8_t ind);
/****************************************************************************/
/****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/
/****************************************************************************
** **
** Name: usim_api_read() **
** **
** Description: Reads data from the USIM application **
** **
** Inputs: None **
** Others: File where are stored USIM data **
** **
** Outputs: data: Pointer to the USIM application data **
** Return: RETURNerror, RETURNok **
** Others: None **
** **
***************************************************************************/
int usim_api_read(usim_data_t* data)
{
LOG_FUNC_IN;
/* Get USIM application pathname */
char* path = memory_get_path(USIM_API_NVRAM_DIRNAME,
USIM_API_NVRAM_FILENAME);
if (path == NULL) {
LOG_TRACE(ERROR, "USIM-API - Failed to get USIM pathname");
LOG_FUNC_RETURN (RETURNerror);
}
/* Read USIM application data */
if (memory_read(path, data, sizeof(usim_data_t)) != RETURNok) {
LOG_TRACE(ERROR, "USIM-API - %s file is either not valid "
"or not present", path);
free(path);
LOG_FUNC_RETURN (RETURNerror);
}
/* initialize the subscriber authentication security key */
_usim_api_hex_string_to_hex_value(_usim_api_k, USIM_API_K_VALUE, USIM_API_K_SIZE);
free(path);
LOG_FUNC_RETURN (RETURNok);
}
/****************************************************************************
** **
** Name: usim_api_write() **
** **
** Description: Writes data to the USIM application **
** **
** Inputs: data: Pointer to the USIM application data **
** Others: None **
** **
** Outputs: None **
** Return: RETURNerror, RETURNok **
** Others: None **
** **
***************************************************************************/
int usim_api_write(const usim_data_t* data)
{
LOG_FUNC_IN;
/* Get USIM application pathname */
char* path = memory_get_path(USIM_API_NVRAM_DIRNAME,
USIM_API_NVRAM_FILENAME);
if (path == NULL) {
LOG_TRACE(ERROR, "USIM-API - Failed to get USIM pathname");
LOG_FUNC_RETURN (RETURNerror);
}
/* Write USIM application data */
if (memory_write(path, data, sizeof(usim_data_t)) != RETURNok) {
LOG_TRACE(ERROR, "USIM-API - Unable to write USIM file %s", path);
free(path);
LOG_FUNC_RETURN (RETURNerror);
}
free(path);
LOG_FUNC_RETURN (RETURNok);
}
/****************************************************************************
** **
** Name: usim_api_authenticate() **
** **
** Description: Performs mutual authentication of the USIM to the network,**
** checking whether authentication token AUTN can be accep- **
** ted. If so, returns an authentication response RES and **
** the ciphering and integrity keys. **
** In case of synch failure, returns a re-synchronization **
** token AUTS. **
** **
** 3GPP TS 31.102, section 7.1.1.1 **
** **
** Authentication and key generating function algorithms are **
** specified in 3GPP TS 35.206. **
** **
** Inputs: rand_pP: Random challenge number **
** autn_pP: Authentication token **
** AUTN = (SQN xor AK) || AMF || MAC **
** 48 16 64 bits **
** Others: Security key **
** **
** Outputs: auts_pP: Re-synchronization token **
** res_pP: Authentication response **
** ck_pP: Ciphering key **
** ik_pP Integrity key **
** **
** Return: RETURNerror, RETURNok **
** Others: None **
** **
***************************************************************************/
int usim_api_authenticate(const OctetString* rand_pP, const OctetString* autn_pP,
OctetString* auts_pP, OctetString* res_pP,
OctetString* ck_pP, OctetString* ik_pP)
{
LOG_FUNC_IN;
int rc;
int i;
LOG_TRACE(DEBUG, "USIM-API - rand :%s",dump_octet_string(rand_pP));
LOG_TRACE(DEBUG, "USIM-API - autn :%s",dump_octet_string(autn_pP));
/* Compute the authentication response RES = f2K (RAND) */
/* Compute the cipher key CK = f3K (RAND) */
/* Compute the integrity key IK = f4K (RAND) */
/* Compute the anonymity key AK = f5K (RAND) */
#define USIM_API_AK_SIZE 6
u8 ak[USIM_API_AK_SIZE];
f2345(_usim_api_k, rand_pP->value,
res_pP->value, ck_pP->value, ik_pP->value, ak);
LOG_TRACE(DEBUG, "USIM-API - res(f2) :%s",dump_octet_string(res_pP));
LOG_TRACE(DEBUG, "USIM-API - ck(f3) :%s",dump_octet_string(ck_pP));
LOG_TRACE(DEBUG, "USIM-API - ik(f4) :%s",dump_octet_string(ik_pP));
LOG_TRACE(DEBUG, "USIM-API - ak(f5) : %02X%02X%02X%02X%02X%02X",
ak[0],ak[1],ak[2],ak[3],ak[4],ak[5]);
/* Retrieve the sequence number SQN = (SQN ⊕ AK) ⊕ AK */
#define USIM_API_SQN_SIZE USIM_API_AK_SIZE
u8 sqn[USIM_API_SQN_SIZE];
for (i = 0; i < USIM_API_SQN_SIZE; i++) {
sqn[i] = autn_pP->value[i] ^ ak[i];
}
LOG_TRACE(DEBUG, "USIM-API - Retrieved SQN %02X%02X%02X%02X%02X%02X",
sqn[0],sqn[1],sqn[2],sqn[3],sqn[4],sqn[5]);
/* Compute XMAC = f1K (SQN || RAND || AMF) */
#define USIM_API_XMAC_SIZE 8
u8 xmac[USIM_API_XMAC_SIZE];
f1(_usim_api_k, rand_pP->value, sqn, &autn_pP->value[USIM_API_SQN_SIZE], xmac);
LOG_TRACE(DEBUG,
"USIM-API - Computed XMAC %02X%02X%02X%02X%02X%02X%02X%02X",
xmac[0],xmac[1],xmac[2],xmac[3],
xmac[4],xmac[5],xmac[6],xmac[7]);
/* Compare the XMAC with the MAC included in AUTN */
#define USIM_API_AMF_SIZE 2
if ( memcmp(xmac, &autn_pP->value[USIM_API_SQN_SIZE + USIM_API_AMF_SIZE],
USIM_API_XMAC_SIZE) != 0 ) {
LOG_TRACE(INFO,
"USIM-API - Comparing the XMAC with the MAC included in AUTN Failed");
//LOG_FUNC_RETURN (RETURNerror);
} else {
LOG_TRACE(INFO,
"USIM-API - Comparing the XMAC with the MAC included in AUTN Succeeded");
}
/* Verify that the received sequence number SQN is in the correct range */
rc = _usim_api_check_sqn(*(uint32_t*)(sqn), sqn[USIM_API_SQN_SIZE - 1]);
if (rc != RETURNok) {
/* Synchronisation failure; compute the AUTS parameter */
/* Concealed value of the counter SQNms in the USIM:
* Conc(SQNMS) = SQNMS ⊕ f5*K(RAND) */
f5star(_usim_api_k, rand_pP->value, ak);
#define USIM_API_SQNMS_SIZE USIM_API_SQN_SIZE
u8 sqn_ms[USIM_API_SQNMS_SIZE];
memset(sqn_ms, 0, USIM_API_SQNMS_SIZE);
#define USIM_API_SQN_MS_SIZE 3
for (i = 0; i < USIM_API_SQN_MS_SIZE; i++) {
#warning "LG:BUG HERE TODO"
sqn_ms[USIM_API_SQNMS_SIZE - i] =
((uint8_t*)(_usim_api_data.sqn_ms))[USIM_API_SQN_MS_SIZE - i];
}
u8 sqnms[USIM_API_SQNMS_SIZE];
for (i = 0; i < USIM_API_SQNMS_SIZE; i++) {
sqnms[i] = sqn_ms[i] ^ ak[i];
}
LOG_TRACE(DEBUG, "USIM-API - SQNms %02X%02X%02X%02X%02X%02X",
sqnms[0],sqnms[1],sqnms[2],sqnms[3],sqnms[4],sqnms[5]);
/* Synchronisation message authentication code:
* MACS = f1*K(SQNMS || RAND || AMF) */
#define USIM_API_MACS_SIZE USIM_API_XMAC_SIZE
u8 macs[USIM_API_MACS_SIZE];
f1star(_usim_api_k, rand_pP->value, sqn_ms,
&rand_pP->value[USIM_API_SQN_SIZE], macs);
LOG_TRACE(DEBUG, "USIM-API - MACS %02X%02X%02X%02X%02X%02X%02X%02X",
macs[0],macs[1],macs[2],macs[3],
macs[4],macs[5],macs[6],macs[7]);
/* Synchronisation authentication token:
* AUTS = Conc(SQNMS) || MACS */
memcpy(&auts_pP->value[0], sqnms, USIM_API_SQNMS_SIZE);
memcpy(&auts_pP->value[USIM_API_SQNMS_SIZE], macs, USIM_API_MACS_SIZE);
}
LOG_FUNC_RETURN (RETURNok);
}
/****************************************************************************/
/********************* L O C A L F U N C T I O N S *********************/
/****************************************************************************/
/****************************************************************************
** **
** Name: _usim_api_hex_char_to_hex_value() **
** **
** Description: Converts an hexadecimal ASCII coded digit into its value. **
** **
** Inputs: c: A char holding the ASCII coded value **
** Others: None **
** **
** Outputs: None **
** Return: Converted value **
** Others: None **
** **
***************************************************************************/
static uint8_t _usim_api_hex_char_to_hex_value (char c)
{
if (c >= 'A') {
/* Remove case bit */
c &= ~('a' ^ 'A');
return (c - 'A' + 10);
} else {
return (c - '0');
}
}
/****************************************************************************
** **
** Name: _usim_api_hex_string_to_hex_value() **
** **
** Description: Converts an hexadecimal ASCII coded string into its value.**
** **
** Inputs: hex_value: A pointer to the location to store the **
** conversion result **
** size: The size of hex_value in bytes **
** Others: None **
** **
** Outputs: hex_value: Converted value **
** Return: None **
** Others: None **
** **
***************************************************************************/
static void _usim_api_hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int size)
{
int i;
for (i=0; i < size; i++) {
hex_value[i] = (_usim_api_hex_char_to_hex_value(hex_string[2 * i]) << 4) | _usim_api_hex_char_to_hex_value(hex_string[2 * i + 1]);
}
}
/****************************************************************************
** **
** Name: _usim_api_check_sqn() **
** **
** Description: Verifies the freshness of sequence numbers to determine **
** whether the specified sequence number is in the correct **
** range and acceptabled by the USIM. **
** **
** 3GPP TS 33.102, Annex C.2 **
** **
** Inputs: seq: Sequence number value **
** ind: Index value **
** Others: None **
** **
** Outputs: None **
** Return: RETURNerror, RETURNok **
** Others: None **
** **
***************************************************************************/
static int _usim_api_check_sqn(uint32_t seq, uint8_t ind)
{
/* TODO */
return (RETURNok);
}
+355
View File
@@ -0,0 +1,355 @@
/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenAirInterface is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>.
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
*******************************************************************************/
/*****************************************************************************
Source usim_api.h
Version 0.1
Date 2012/10/09
Product NAS stack
Subsystem Application Programming Interface
Author Frederic Maurel
Description Implements the API used by the NAS layer to read/write
data to/from the USIM application
*****************************************************************************/
#ifndef __USIM_API_H__
#define __USIM_API_H__
#include "commonDef.h"
#include "networkDef.h"
#include "OctetString.h"
/****************************************************************************/
/********************* G L O B A L C O N S T A N T S *******************/
/****************************************************************************/
/****************************************************************************/
/************************ G L O B A L T Y P E S ************************/
/****************************************************************************/
/*
* USIM TLV parameter structure
* ----------------------------
*/
#define USIM_TLV_T(SIZE) struct {uint8_t type; uint8_t length; Byte_t value[SIZE];}
/*
* Non Access Stratum Configuration
* --------------------------------
* TODO: To be encoded as BER-TLV
*/
typedef struct {
/* Determines the NAS signalling priority included in NAS
* messages */
#define USIM_NAS_SIGNALLING_PRIORITY_TAG 0x80U
USIM_TLV_T(1) NAS_SignallingPriority;
/* Indicates whether the "NMO I, Network Mode of Operation I"
* indication is applied by the UE */
#define USIM_NMO_I_BEHAVIOUR_TAG 0x81U
USIM_TLV_T(1) NMO_I_Behaviour;
/* Indicates whether attach with IMSI is performed when moving
* to a non-equivalent PLMN */
#define USIM_ATTACH_WITH_IMSI_TAG 0x82U
USIM_TLV_T(1) AttachWithImsi;
/* Minimum value in minutes for the timer T controlling the
* periodic search for higher prioritized PLMNs */
#define USIM_MINIMUM_PERIODIC_SEARCH_TIMER_TAG 0x83U
USIM_TLV_T(1) MinimumPeriodicSearchTimer;
/* Indicates whether the extended access barring is applicable
* for the UE */
#define USIM_EXTENDED_ACCESS_BARRING_TAG 0x84U
USIM_TLV_T(1) ExtendedAccessBarring;
/* Indicates whether the timer T3245 and the related
* functionality is used by the UE */
#define USIM_TIMER_T3245_BEHAVIOUR_TAG 0x85U
USIM_TLV_T(1) Timer_T3245_Behaviour;
} usim_nasconfig_t;
/*
* Ciphering and Integrity Keys
* ----------------------------
*/
typedef struct {
/* Key set identifier */
#define USIM_KSI_MIN 0b000
#define USIM_KSI_MAX 0b110
#define USIM_KSI_NOT_AVAILABLE 0b111
Byte_t ksi;
/* Cyphering key */
#define USIM_CK_SIZE 16
Byte_t ck[USIM_CK_SIZE];
/* Integrity key */
#define USIM_IK_SIZE 16
Byte_t ik[USIM_IK_SIZE];
} usim_keys_t;
/*
* EPS NAS Security Context
* ------------------------
* TODO: To be encoded as BER-TLV
*/
typedef struct {
/* Length of all subsequent data */
#define USIM_EPS_NAS_SECURITY_CONTEXT_TAG 0xA0U
uint8_t length;
/* Key set identifier KSI_ASME */
#define USIM_KSI_ASME_TAG 0x80U
USIM_TLV_T(1) KSIasme;
/* ASME key (K_ASME) */
#define USIM_K_ASME_TAG 0x81U
#define USIM_K_ASME_SIZE 32
USIM_TLV_T(USIM_K_ASME_SIZE) Kasme;
/* Uplink NAS count */
#define USIM_UL_NAS_COUNT_TAG 0x82U
#define USIM_UL_NAS_COUNT_SIZE 4
USIM_TLV_T(USIM_UL_NAS_COUNT_SIZE) ulNAScount;
/* Downlink NAS count */
#define USIM_DL_NAS_COUNT_TAG 0x83U
#define USIM_DL_NAS_COUNT_SIZE 4
USIM_TLV_T(USIM_DL_NAS_COUNT_SIZE) dlNAScount;
/* Identifiers of selected NAS integrity and encryption
* algorithms */
#define USIM_INT_ENC_ALGORITHMS_TAG 0x84U
#define USIM_INT_EIA0 0x00
#define USIM_INT_EIA1 0x01
#define USIM_INT_EIA2 0x02
#define USIM_INT_EIA3 0x03
#define USIM_INT_EIA4 0x04
#define USIM_INT_EIA5 0x05
#define USIM_INT_EIA6 0x06
#define USIM_INT_EIA7 0x07
#define USIM_ENC_EEA0 0x00
#define USIM_ENC_EEA1 0x10
#define USIM_ENC_EEA2 0x20
#define USIM_ENC_EEA3 0x30
#define USIM_ENC_EEA4 0x40
#define USIM_ENC_EEA5 0x50
#define USIM_ENC_EEA6 0x60
#define USIM_ENC_EEA7 0x70
USIM_TLV_T(1) algorithmID;
} usim_securityctx_t;
/*
* Subcriber's Number structure
* ----------------------------
*/
typedef struct {
Byte_t length; /* Length of BCD number/SSC contents */
msisdn_t number; /* Mobile subscriber dialing number */
Byte_t conf1_record_id; /* Configuration1 Record Identifier */
Byte_t ext1_record_id; /* Extension1 Record Identifier */
} usim_msisdn_t;
/*
* PLMN Network Name structure
* ---------------------------
*/
typedef struct {
/* PLMN Full Name */
#define USIM_PNN_FULLNAME_TAG 0x43U
#define USIM_PNN_FULLNAME_SIZE NET_FORMAT_LONG_SIZE
USIM_TLV_T(USIM_PNN_FULLNAME_SIZE) fullname;
/* PLMN Short Name */
#define USIM_PNN_SHORTNAME_TAG 0x45U
#define USIM_PNN_SHORTNAME_SIZE NET_FORMAT_SHORT_SIZE
USIM_TLV_T(USIM_PNN_SHORTNAME_SIZE) shortname;
} usim_pnn_t;
/*
* Operator PLMN List structure
* ----------------------------
*/
typedef struct {
/* Tracking Area Identity range */
plmn_t plmn;
tac_t start;
tac_t end;
/* PLMN Network Name Record Identifier */
uint8_t record_id;
} usim_opl_t;
/*
* PLMN with Access Technology structure
* -------------------------------------
*/
typedef struct {
plmn_t plmn;
#define USIM_ACT_GSM 0x8000
#define USIM_ACT_COMPACT 0x4000
#define USIM_ACT_CDMA_HRPD 0x2000
#define USIM_ACT_CDMA_1xRTT 0x1000
#define USIM_ACT_UTRAN 0x0080
#define USIM_ACT_EUTRAN 0x0040
uint16_t AcT;
} usim_plmn_act_t;
/*
* Location information structure
* ------------------------------
*/
typedef struct {
uint32_t tmsi; /* Temporary Mobile Subscriber Identity */
lai_t lai; /* Location Area Identity */
Byte_t reserved; /* Reserved for future use */
#define USIM_LOCI_UPDATED 0x00
#define USIM_LOCI_NOT_UPDATED 0x01
#define USIM_LOCI_PLMN_NOT_ALLOWED 0x02
#define USIM_LOCI_LA_NOT_ALLOWED 0x03
Byte_t status; /* Location update status */
} usim_loci_t;
/*
* Packet Switched location information structure
* ----------------------------------------------
*/
typedef struct {
uint32_t p_tmsi; /* Packet Temporary Mobile Subscriber Identity */
Byte_t signature[3]; /* P-TMSI signature value */
RAI_t rai; /* Routing Area Identity */
#define USIM_PSLOCI_UPDATED 0x00
#define USIM_PSLOCI_NOT_UPDATED 0x01
#define USIM_PSLOCI_PLMN_NOT_ALLOWED 0x02
#define USIM_PSLOCI_LA_NOT_ALLOWED 0x03
Byte_t status; /* Routing Area update status */
} usim_psloci_t;
/*
* EPS location information structure
* ----------------------------------
*/
typedef struct {
GUTI_t guti; /* Globally Unique Temporary UE Identity */
tai_t tai; /* Last visited registered Tracking Area Id */
#define USIM_EPSLOCI_UPDATED 0x00
#define USIM_EPSLOCI_NOT_UPDATED 0x01
#define USIM_EPSLOCI_ROAMING_NOT_ALLOWED 0x02
Byte_t status; /* EPS update status */
} usim_epsloci_t;
/*
* Administrative Data
* -------------------
* Defines information concerning the mode of operation according to the
* type of USIM, such as normal (to be used by PLMN subscribers for 3G
* operations), type approval (to allow specific use of the ME during
* type approval procedures of e.g. the radio equipment), cell testing
* (to allow testing of a cell before commercial use of this cell),
* manufacturer specific (to allow the ME manufacturer to perform specific
* proprietary auto-test in its ME during e.g. maintenance phases).
* It also provides an indication about how some ME features shall work
* during normal operation as well as information about the length of the
* MNC, which is part of the International Mobile Subscriber Identity (IMSI).
*/
typedef struct {
#define USIM_NORMAL_MODE 0x00U
#define USIM_TYPE_APPROVAL_MODE 0x80U
#define USIM_NORMAL_SPECIFIC_MODE 0x01U
#define USIM_TYPE_APPROVAL_SPECIFIC_MODE 0x81U
#define USIM_MAINTENANCE_MODE 0x02U
#define USIM_CELL_TEST_MODE 0x04U
Byte_t UE_Operation_Mode; /* Mode of operation for the UE */
uint16_t Additional_Info; /* Additional information depending on
* the UE operation mode */
Byte_t MNC_Length; /* Number of digits used for extracting
* the MNC from the IMSI */
} usim_ad_t;
/*
*---------------------------------------------------------------------------
* Structure of the data handled by the USIM application
*---------------------------------------------------------------------------
*/
typedef struct {
/*
* Mandatory USIM configuration parameters
* ---------------------------------------
*/
imsi_t imsi; /* International Mobile Subscriber Identity */
usim_keys_t keys; /* Ciphering and Integrity Keys */
Byte_t hpplmn; /* Higher Priority PLMN search period */
#define USIM_FPLMN_MAX 4
plmn_t fplmn[USIM_FPLMN_MAX]; /* List of Forbidden PLMNs */
usim_loci_t loci; /* Location Information */
usim_psloci_t psloci; /* PS Location Information */
usim_ad_t ad; /* Administrative Data */
/*
* Optional USIM configuration parameters
* --------------------------------------
*/
/* EPS NAS security context */
usim_securityctx_t securityctx;
/* Subcriber's Number */
usim_msisdn_t msisdn;
/* PLMN Network Name */
#define USIM_PNN_MAX 8
usim_pnn_t pnn[USIM_PNN_MAX];
/* Operator PLMN List */
#define USIM_OPL_MAX USIM_PNN_MAX
usim_opl_t opl[USIM_OPL_MAX];
/* List of Equivalent HPLMNs */
#define USIM_EHPLMN_MAX 2
plmn_t ehplmn[USIM_EHPLMN_MAX];
/* Home PLMN Selector with Access Technology */
usim_plmn_act_t hplmn;
/* User controlled PLMN Selector with Access Technology */
#define USIM_PLMN_MAX 8
usim_plmn_act_t plmn[USIM_PLMN_MAX];
/* Operator controlled PLMN Selector with Access Technology */
#define USIM_OPLMN_MAX 8
usim_plmn_act_t oplmn[USIM_OPLMN_MAX];
/* EPS Location Information */
usim_epsloci_t epsloci;
/* Non-Access Stratum configuration */
usim_nasconfig_t nasconfig;
} usim_data_t;
/****************************************************************************/
/******************** G L O B A L V A R I A B L E S ********************/
/****************************************************************************/
/****************************************************************************/
/****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/
int usim_api_read(usim_data_t* data);
int usim_api_write(const usim_data_t* data);
int usim_api_authenticate(const OctetString* rand, const OctetString* autn,
OctetString* auts, OctetString* res,
OctetString* ck, OctetString* ik);
#endif /* __USIM_API_H__*/