Change over unix line-endings to dos line endings.

pull/1469/head
Dean Camera 15 years ago
parent 842e219bf3
commit 27eb17cb93

@ -401,7 +401,7 @@ static inline void Bluetooth_Signal_ConnectionReq(const BT_Signal_Header_t* cons
ChannelData->PSM = ConnectionRequest.PSM; ChannelData->PSM = ConnectionRequest.PSM;
ChannelData->LocalMTU = MAXIMUM_CHANNEL_MTU; ChannelData->LocalMTU = MAXIMUM_CHANNEL_MTU;
ChannelData->State = Channel_Config_WaitConfig; ChannelData->State = Channel_Config_WaitConfig;
ChannelStatus = BT_CONNECTION_SUCCESSFUL; ChannelStatus = BT_CONNECTION_SUCCESSFUL;
} }
else else

@ -58,7 +58,7 @@
/* Enable C linkage for C++ Compilers: */ /* Enable C linkage for C++ Compilers: */
#if defined(__cplusplus) #if defined(__cplusplus)
extern "C" { extern "C" {
#endif #endif
/* Preprocessor Checks: */ /* Preprocessor Checks: */
#if !defined(__INCLUDE_FROM_PRINTER_DRIVER) #if !defined(__INCLUDE_FROM_PRINTER_DRIVER)

@ -1,165 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007 Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below. License, supplemented by the additional permissions listed below.
0. Additional Definitions. 0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License. General Public License.
"The Library" refers to a covered work governed by this License, "The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below. other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library. by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library. of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked with which the Combined Work was made is also called the "Linked
Version". Version".
The "Minimal Corresponding Source" for a Combined Work means the The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version. based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work. Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL. 1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL. without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions. 2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified facility is invoked), then you may convey a copy of the modified
version: version:
a) under this License, provided that you make a good faith effort to a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy. this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files. 3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following: (ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are Library is used in it and that the Library and its use are
covered by this License. covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license b) Accompany the object code with a copy of the GNU GPL and this license
document. document.
4. Combined Works. 4. Combined Works.
You may convey a Combined Work under terms of your choice that, You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of engineering for debugging such modifications, if you also do each of
the following: the following:
a) Give prominent notice with each copy of the Combined Work that a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are the Library is used in it and that the Library and its use are
covered by this License. covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license b) Accompany the Combined Work with a copy of the GNU GPL and this license
document. document.
c) For a Combined Work that displays copyright notices during c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document. copies of the GNU GPL and this license document.
d) Do one of the following: d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this 0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying manner specified by section 6 of the GNU GPL for conveying
Corresponding Source. Corresponding Source.
1) Use a suitable shared library mechanism for linking with the 1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked of the Library that is interface-compatible with the Linked
Version. Version.
e) Provide Installation Information, but only if you would otherwise e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.) for conveying Corresponding Source.)
5. Combined Libraries. 5. Combined Libraries.
You may place library facilities that are a work based on the You may place library facilities that are a work based on the
Library side by side in a single library together with other library Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your License, and convey such a combined library under terms of your
choice, if you do both of the following: choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities, on the Library, uncombined with any other library facilities,
conveyed under the terms of this License. conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work. accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License. 6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version" of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and applies to it, you have the option of following the terms and
conditions either of that published version or of any later version conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation. General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the permanent authorization for you to choose that version for the
Library. Library.

@ -1,674 +1,674 @@
GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007 Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
Preamble Preamble
The GNU General Public License is a free, copyleft license for The GNU General Public License is a free, copyleft license for
software and other kinds of works. software and other kinds of works.
The licenses for most software and other practical works are designed The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast, 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 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 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 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 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 any other work released this way by its authors. You can apply it to
your programs, too. your programs, too.
When we speak of free software, we are referring to freedom, not When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for 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 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 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. free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others. you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether 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 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 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 or can get the source code. And you must show them these terms so they
know their rights. know their rights.
Developers that use the GNU GPL protect your rights with two steps: Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License (1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it. giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to changed, so that their problems will not be attributed erroneously to
authors of previous versions. authors of previous versions.
Some devices are designed to deny users access to install or run Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users. of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents. Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to 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 avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free. patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and The precise terms and conditions for copying, distribution and
modification follow. modification follow.
TERMS AND CONDITIONS TERMS AND CONDITIONS
0. Definitions. 0. Definitions.
"This License" refers to version 3 of the GNU General Public License. "This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks. works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this "The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations. "recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work 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 in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work. earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based A "covered work" means either the unmodified Program or a work based
on the Program. on the Program.
To "propagate" a work means to do anything with it that, without To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying, computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the distribution (with or without modification), making available to the
public, and in some countries other activities as well. public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying. a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices" An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2) feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey 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 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 the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion. menu, a prominent item in the list meets this criterion.
1. Source Code. 1. Source Code.
The "source code" for a work means the preferred form of the work The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source for making modifications to it. "Object code" means any non-source
form of a work. form of a work.
A "Standard Interface" means an interface that either is an official A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that interfaces specified for a particular programming language, one that
is widely used among developers working in that language. is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other 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 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 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 Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component "Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system (kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to (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. 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 "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require, linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those such as by intimate data communication or control flow between those
subprograms and other parts of the work. subprograms and other parts of the work.
The Corresponding Source need not include anything that users The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding can regenerate automatically from other parts of the Corresponding
Source. Source.
The Corresponding Source for a work in source code form is that The Corresponding Source for a work in source code form is that
same work. same work.
2. Basic Permissions. 2. Basic Permissions.
All rights granted under this License are granted for the term of All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law. rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you. your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10 the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary. makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law. 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or 11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such similar laws prohibiting or restricting circumvention of such
measures. measures.
When you convey a covered work, you waive any legal power to forbid When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or 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 modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of users, your or third parties' legal rights to forbid circumvention of
technological measures. technological measures.
4. Conveying Verbatim Copies. 4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice; appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code; 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 keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program. recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey, 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. and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions. 5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to 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 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: terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified a) The work must carry prominent notices stating that you modified
it, and giving a relevant date. it, and giving a relevant date.
b) The work must carry prominent notices stating that it is b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to 7. This requirement modifies the requirement in section 4 to
"keep intact all notices". "keep intact all notices".
c) You must license the entire work, as a whole, under this c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7 License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts, additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it. invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your interfaces that do not display Appropriate Legal Notices, your
work need not make them do so. work need not make them do so.
A compilation of a covered work with other separate and independent A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work, 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, 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 in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not "aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other in an aggregate does not cause this License to apply to the other
parts of the aggregate. parts of the aggregate.
6. Conveying Non-Source Forms. 6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License, machine-readable Corresponding Source under the terms of this License,
in one of these ways: in one of these ways:
a) Convey the object code in, or embodied in, a physical product a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the (including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium Corresponding Source fixed on a durable physical medium
customarily used for software interchange. customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a (including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge. Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord only if you received the object code with such an offer, in accord
with subsection 6b. with subsection 6b.
d) Convey the object code by offering access from a designated d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party) may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements. available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no Source of the work are being offered to the general public at no
charge under subsection 6d. charge under subsection 6d.
A separable portion of the object code, whose source code is excluded A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be from the Corresponding Source as a System Library, need not be
included in conveying the object code work. included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family, tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product, into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status 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 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 actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product. the only significant mode of use of the product.
"Installation Information" for a User Product means any methods, "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because code is in no case prevented or interfered with solely because
modification has been made. modification has been made.
If you convey an object code work under this section in, or with, or 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 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 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 User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has modified object code on the User Product (for example, the work has
been installed in ROM). been installed in ROM).
The requirement to provide Installation Information does not include a The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for 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 the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and adversely affects the operation of the network or violates the rules and
protocols for communication across the network. protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided, Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in documented (and with an implementation available to the public in
source code form), and must require no special password or key for source code form), and must require no special password or key for
unpacking, reading or copying. unpacking, reading or copying.
7. Additional Terms. 7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions. License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions. this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option 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 remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work, additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission. for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms: that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or authors of the material; or
e) Declining to grant rights under trademark law for use of some e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on any liability that these contractual assumptions directly impose on
those licensors and authors. those licensors and authors.
All other non-permissive additional terms are considered "further All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you 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 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 governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does of that license document, provided that the further restriction does
not survive such relicensing or conveying. not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you 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 must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating additional terms that apply to those files, or a notice indicating
where to find the applicable terms. where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions; form of a separately written license, or stated as exceptions;
the above requirements apply either way. the above requirements apply either way.
8. Termination. 8. Termination.
You may not propagate or modify a covered work except as expressly You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third this License (including any patent licenses granted under the third
paragraph of section 11). paragraph of section 11).
However, if you cease all violation of this License, then your However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a) license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation. prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice. your receipt of the notice.
Termination of your rights under this section does not terminate the Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same reinstated, you do not qualify to receive new licenses for the same
material under section 10. material under section 10.
9. Acceptance Not Required for Having Copies. 9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or 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 run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However, to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so. covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients. 10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License. for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could 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 give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts. the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that (including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it. sale, or importing the Program or any portion of it.
11. Patents. 11. Patents.
A "contributor" is a copyright holder who authorizes use under this 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 License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version". work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version, by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of patent sublicenses in a manner consistent with the requirements of
this License. this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version. propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to (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 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 party means to make such an agreement or commitment not to enforce a
patent against the party. patent against the party.
If you convey a covered work, knowingly relying on a patent license, If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone 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 to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means, publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the 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 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 in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid. country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered you grant is automatically extended to all recipients of the covered
work and works based on it. work and works based on it.
A patent license is "discriminatory" if it does not include within A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is 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 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 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 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 in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying 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 the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement, contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007. or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law. otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom. 12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may 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 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 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 the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program. License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License. 13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed 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 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 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, License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License, but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the section 13, concerning interaction through a network will apply to the
combination as such. combination as such.
14. Revised Versions of this License. 14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of 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 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 be similar in spirit to the present version, but may differ in detail to
address new problems or concerns. address new problems or concerns.
Each version is given a distinguishing version number. If the Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published GNU General Public License, you may choose any version ever published
by the Free Software Foundation. by the Free Software Foundation.
If the Program specifies that a proxy can decide which future If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you public statement of acceptance of a version permanently authorizes you
to choose that version for the Program. to choose that version for the Program.
Later license versions may give you additional or different Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a author or copyright holder as a result of your choosing to follow a
later version. later version.
15. Disclaimer of Warranty. 15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 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 IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION. ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability. 16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 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 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 THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 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 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), 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 EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES. SUCH DAMAGES.
17. Interpretation of Sections 15 and 16. 17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms, above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee. copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest 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 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. 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 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 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 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. 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.> <one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author> Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. 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. Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode: notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author> <program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details. under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands 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". 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, 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. 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 For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>. <http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with 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 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 Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>. <http://www.gnu.org/philosophy/why-not-lgpl.html>.

@ -38,7 +38,7 @@
/* Includes: */ /* Includes: */
#include <avr/io.h> #include <avr/io.h>
#include "Descriptors.h" #include "Descriptors.h"
#include <LUFA/Common/Common.h> #include <LUFA/Common/Common.h>

@ -42,7 +42,7 @@
#include <LUFA/Drivers/USB/USB.h> #include <LUFA/Drivers/USB/USB.h>
#include <LUFA/Drivers/USB/Class/MassStorage.h> #include <LUFA/Drivers/USB/Class/MassStorage.h>
#include "../Descriptors.h" #include "../Descriptors.h"
#include "DataflashManager.h" #include "DataflashManager.h"

@ -1,38 +1,38 @@
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
#include <avr/io.h> #include <avr/io.h>
#include <avr/sfr_defs.h> #include <avr/sfr_defs.h>
#include "clock.h" #include "clock.h"
//Counted time //Counted time
volatile clock_time_t clock_datetime = 0; volatile clock_time_t clock_datetime = 0;
//Overflow interrupt //Overflow interrupt
ISR(TIMER1_COMPA_vect) ISR(TIMER1_COMPA_vect)
{ {
clock_datetime += 1; clock_datetime += 1;
} }
//Initialise the clock //Initialise the clock
void clock_init() void clock_init()
{ {
OCR1A = ((F_CPU / 1024) / 100); OCR1A = ((F_CPU / 1024) / 100);
TCCR1B = ((1 << WGM12) | (1 << CS12) | (1 << CS10)); TCCR1B = ((1 << WGM12) | (1 << CS12) | (1 << CS10));
TIMSK1 = (1 << OCIE1A); TIMSK1 = (1 << OCIE1A);
} }
//Return time //Return time
clock_time_t clock_time() clock_time_t clock_time()
{ {
clock_time_t time; clock_time_t time;
ATOMIC_BLOCK(ATOMIC_FORCEON) ATOMIC_BLOCK(ATOMIC_FORCEON)
{ {
time = clock_datetime; time = clock_datetime;
} }
return time; return time;
} }

@ -1,6 +1,6 @@
#ifndef __CLOCK_ARCH_H__ #ifndef __CLOCK_ARCH_H__
#define __CLOCK_ARCH_H__ #define __CLOCK_ARCH_H__
#include <stdint.h> #include <stdint.h>
#include <util/atomic.h> #include <util/atomic.h>

@ -1,127 +1,127 @@
/** /**
* \addtogroup timer * \addtogroup timer
* @{ * @{
*/ */
/** /**
* \file * \file
* Timer library implementation. * Timer library implementation.
* \author * \author
* Adam Dunkels <adam@sics.se> * Adam Dunkels <adam@sics.se>
*/ */
/* /*
* Copyright (c) 2004, Swedish Institute of Computer Science. * Copyright (c) 2004, Swedish Institute of Computer Science.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Institute nor the names of its contributors * 3. Neither the name of the Institute nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* This file is part of the uIP TCP/IP stack * This file is part of the uIP TCP/IP stack
* *
* Author: Adam Dunkels <adam@sics.se> * Author: Adam Dunkels <adam@sics.se>
* *
* $Id: timer.c,v 1.2 2006/06/12 08:00:30 adam Exp $ * $Id: timer.c,v 1.2 2006/06/12 08:00:30 adam Exp $
*/ */
#include "clock.h" #include "clock.h"
#include "timer.h" #include "timer.h"
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/** /**
* Set a timer. * Set a timer.
* *
* This function is used to set a timer for a time sometime in the * This function is used to set a timer for a time sometime in the
* future. The function timer_expired() will evaluate to true after * future. The function timer_expired() will evaluate to true after
* the timer has expired. * the timer has expired.
* *
* \param t A pointer to the timer * \param t A pointer to the timer
* \param interval The interval before the timer expires. * \param interval The interval before the timer expires.
* *
*/ */
void void
timer_set(struct timer *t, clock_time_t interval) timer_set(struct timer *t, clock_time_t interval)
{ {
t->interval = interval; t->interval = interval;
t->start = clock_time(); t->start = clock_time();
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/** /**
* Reset the timer with the same interval. * Reset the timer with the same interval.
* *
* This function resets the timer with the same interval that was * This function resets the timer with the same interval that was
* given to the timer_set() function. The start point of the interval * given to the timer_set() function. The start point of the interval
* is the exact time that the timer last expired. Therefore, this * is the exact time that the timer last expired. Therefore, this
* function will cause the timer to be stable over time, unlike the * function will cause the timer to be stable over time, unlike the
* timer_rester() function. * timer_rester() function.
* *
* \param t A pointer to the timer. * \param t A pointer to the timer.
* *
* \sa timer_restart() * \sa timer_restart()
*/ */
void void
timer_reset(struct timer *t) timer_reset(struct timer *t)
{ {
t->start += t->interval; t->start += t->interval;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/** /**
* Restart the timer from the current point in time * Restart the timer from the current point in time
* *
* This function restarts a timer with the same interval that was * This function restarts a timer with the same interval that was
* given to the timer_set() function. The timer will start at the * given to the timer_set() function. The timer will start at the
* current time. * current time.
* *
* \note A periodic timer will drift if this function is used to reset * \note A periodic timer will drift if this function is used to reset
* it. For preioric timers, use the timer_reset() function instead. * it. For preioric timers, use the timer_reset() function instead.
* *
* \param t A pointer to the timer. * \param t A pointer to the timer.
* *
* \sa timer_reset() * \sa timer_reset()
*/ */
void void
timer_restart(struct timer *t) timer_restart(struct timer *t)
{ {
t->start = clock_time(); t->start = clock_time();
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/** /**
* Check if a timer has expired. * Check if a timer has expired.
* *
* This function tests if a timer has expired and returns true or * This function tests if a timer has expired and returns true or
* false depending on its status. * false depending on its status.
* *
* \param t A pointer to the timer * \param t A pointer to the timer
* *
* \return Non-zero if the timer has expired, zero otherwise. * \return Non-zero if the timer has expired, zero otherwise.
* *
*/ */
int int
timer_expired(struct timer *t) timer_expired(struct timer *t)
{ {
return (clock_time_t)(clock_time() - t->start) >= (clock_time_t)t->interval; return (clock_time_t)(clock_time() - t->start) >= (clock_time_t)t->interval;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/** @} */ /** @} */

@ -1,86 +1,86 @@
/** /**
* \defgroup timer Timer library * \defgroup timer Timer library
* *
* The timer library provides functions for setting, resetting and * The timer library provides functions for setting, resetting and
* restarting timers, and for checking if a timer has expired. An * restarting timers, and for checking if a timer has expired. An
* application must "manually" check if its timers have expired; this * application must "manually" check if its timers have expired; this
* is not done automatically. * is not done automatically.
* *
* A timer is declared as a \c struct \c timer and all access to the * A timer is declared as a \c struct \c timer and all access to the
* timer is made by a pointer to the declared timer. * timer is made by a pointer to the declared timer.
* *
* \note The timer library uses the \ref clock "Clock library" to * \note The timer library uses the \ref clock "Clock library" to
* measure time. Intervals should be specified in the format used by * measure time. Intervals should be specified in the format used by
* the clock library. * the clock library.
* *
* @{ * @{
*/ */
/** /**
* \file * \file
* Timer library header file. * Timer library header file.
* \author * \author
* Adam Dunkels <adam@sics.se> * Adam Dunkels <adam@sics.se>
*/ */
/* /*
* Copyright (c) 2004, Swedish Institute of Computer Science. * Copyright (c) 2004, Swedish Institute of Computer Science.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Institute nor the names of its contributors * 3. Neither the name of the Institute nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* This file is part of the uIP TCP/IP stack * This file is part of the uIP TCP/IP stack
* *
* Author: Adam Dunkels <adam@sics.se> * Author: Adam Dunkels <adam@sics.se>
* *
* $Id: timer.h,v 1.3 2006/06/11 21:46:39 adam Exp $ * $Id: timer.h,v 1.3 2006/06/11 21:46:39 adam Exp $
*/ */
#ifndef __TIMER_H__ #ifndef __TIMER_H__
#define __TIMER_H__ #define __TIMER_H__
#include "clock.h" #include "clock.h"
/** /**
* A timer. * A timer.
* *
* This structure is used for declaring a timer. The timer must be set * This structure is used for declaring a timer. The timer must be set
* with timer_set() before it can be used. * with timer_set() before it can be used.
* *
* \hideinitializer * \hideinitializer
*/ */
struct timer { struct timer {
clock_time_t start; clock_time_t start;
clock_time_t interval; clock_time_t interval;
}; };
void timer_set(struct timer *t, clock_time_t interval); void timer_set(struct timer *t, clock_time_t interval);
void timer_reset(struct timer *t); void timer_reset(struct timer *t);
void timer_restart(struct timer *t); void timer_restart(struct timer *t);
int timer_expired(struct timer *t); int timer_expired(struct timer *t);
#endif /* __TIMER_H__ */ #endif /* __TIMER_H__ */
/** @} */ /** @} */

@ -1,141 +1,141 @@
/* /*
* Copyright (c) 2004, Swedish Institute of Computer Science. * Copyright (c) 2004, Swedish Institute of Computer Science.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Institute nor the names of its contributors * 3. Neither the name of the Institute nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* This file is part of the Contiki operating system. * This file is part of the Contiki operating system.
* *
* Author: Adam Dunkels <adam@sics.se> * Author: Adam Dunkels <adam@sics.se>
* *
* $Id: uip-split.c,v 1.2 2008/10/14 13:39:12 julienabeille Exp $ * $Id: uip-split.c,v 1.2 2008/10/14 13:39:12 julienabeille Exp $
*/ */
#include "uip-split.h" #include "uip-split.h"
#define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN]) #define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
void void
uip_split_output(void) uip_split_output(void)
{ {
#if UIP_TCP #if UIP_TCP
u16_t tcplen, len1, len2; u16_t tcplen, len1, len2;
/* We only try to split maximum sized TCP segments. */ /* We only try to split maximum sized TCP segments. */
if(BUF->proto == UIP_PROTO_TCP && uip_len == UIP_BUFSIZE) { if(BUF->proto == UIP_PROTO_TCP && uip_len == UIP_BUFSIZE) {
tcplen = uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN; tcplen = uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN;
/* Split the segment in two. If the original packet length was /* Split the segment in two. If the original packet length was
odd, we make the second packet one byte larger. */ odd, we make the second packet one byte larger. */
len1 = len2 = tcplen / 2; len1 = len2 = tcplen / 2;
if(len1 + len2 < tcplen) { if(len1 + len2 < tcplen) {
++len2; ++len2;
} }
/* Create the first packet. This is done by altering the length /* Create the first packet. This is done by altering the length
field of the IP header and updating the checksums. */ field of the IP header and updating the checksums. */
uip_len = len1 + UIP_TCPIP_HLEN + UIP_LLH_LEN; uip_len = len1 + UIP_TCPIP_HLEN + UIP_LLH_LEN;
#if UIP_CONF_IPV6 #if UIP_CONF_IPV6
/* For IPv6, the IP length field does not include the IPv6 IP header /* For IPv6, the IP length field does not include the IPv6 IP header
length. */ length. */
BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8); BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);
BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff); BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff);
#else /* UIP_CONF_IPV6 */ #else /* UIP_CONF_IPV6 */
BUF->len[0] = (uip_len - UIP_LLH_LEN) >> 8; BUF->len[0] = (uip_len - UIP_LLH_LEN) >> 8;
BUF->len[1] = (uip_len - UIP_LLH_LEN) & 0xff; BUF->len[1] = (uip_len - UIP_LLH_LEN) & 0xff;
#endif /* UIP_CONF_IPV6 */ #endif /* UIP_CONF_IPV6 */
/* Recalculate the TCP checksum. */ /* Recalculate the TCP checksum. */
BUF->tcpchksum = 0; BUF->tcpchksum = 0;
BUF->tcpchksum = ~(uip_tcpchksum()); BUF->tcpchksum = ~(uip_tcpchksum());
#if !UIP_CONF_IPV6 #if !UIP_CONF_IPV6
/* Recalculate the IP checksum. */ /* Recalculate the IP checksum. */
BUF->ipchksum = 0; BUF->ipchksum = 0;
BUF->ipchksum = ~(uip_ipchksum()); BUF->ipchksum = ~(uip_ipchksum());
#endif /* UIP_CONF_IPV6 */ #endif /* UIP_CONF_IPV6 */
/* Transmit the first packet. */ /* Transmit the first packet. */
#if UIP_CONF_IPV6 #if UIP_CONF_IPV6
tcpip_ipv6_output(); tcpip_ipv6_output();
#else #else
RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, uip_buf, uip_len); RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, uip_buf, uip_len);
#endif /* UIP_CONF_IPV6 */ #endif /* UIP_CONF_IPV6 */
/* Now, create the second packet. To do this, it is not enough to /* Now, create the second packet. To do this, it is not enough to
just alter the length field, but we must also update the TCP just alter the length field, but we must also update the TCP
sequence number and point the uip_appdata to a new place in sequence number and point the uip_appdata to a new place in
memory. This place is detemined by the length of the first memory. This place is detemined by the length of the first
packet (len1). */ packet (len1). */
uip_len = len2 + UIP_TCPIP_HLEN + UIP_LLH_LEN; uip_len = len2 + UIP_TCPIP_HLEN + UIP_LLH_LEN;
#if UIP_CONF_IPV6 #if UIP_CONF_IPV6
/* For IPv6, the IP length field does not include the IPv6 IP header /* For IPv6, the IP length field does not include the IPv6 IP header
length. */ length. */
BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8); BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);
BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff); BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff);
#else /* UIP_CONF_IPV6 */ #else /* UIP_CONF_IPV6 */
BUF->len[0] = (uip_len - UIP_LLH_LEN) >> 8; BUF->len[0] = (uip_len - UIP_LLH_LEN) >> 8;
BUF->len[1] = (uip_len - UIP_LLH_LEN) & 0xff; BUF->len[1] = (uip_len - UIP_LLH_LEN) & 0xff;
#endif /* UIP_CONF_IPV6 */ #endif /* UIP_CONF_IPV6 */
memcpy(uip_appdata, (u8_t *)uip_appdata + len1, len2); memcpy(uip_appdata, (u8_t *)uip_appdata + len1, len2);
uip_add32(BUF->seqno, len1); uip_add32(BUF->seqno, len1);
BUF->seqno[0] = uip_acc32[0]; BUF->seqno[0] = uip_acc32[0];
BUF->seqno[1] = uip_acc32[1]; BUF->seqno[1] = uip_acc32[1];
BUF->seqno[2] = uip_acc32[2]; BUF->seqno[2] = uip_acc32[2];
BUF->seqno[3] = uip_acc32[3]; BUF->seqno[3] = uip_acc32[3];
/* Recalculate the TCP checksum. */ /* Recalculate the TCP checksum. */
BUF->tcpchksum = 0; BUF->tcpchksum = 0;
BUF->tcpchksum = ~(uip_tcpchksum()); BUF->tcpchksum = ~(uip_tcpchksum());
#if !UIP_CONF_IPV6 #if !UIP_CONF_IPV6
/* Recalculate the IP checksum. */ /* Recalculate the IP checksum. */
BUF->ipchksum = 0; BUF->ipchksum = 0;
BUF->ipchksum = ~(uip_ipchksum()); BUF->ipchksum = ~(uip_ipchksum());
#endif /* UIP_CONF_IPV6 */ #endif /* UIP_CONF_IPV6 */
/* Transmit the second packet. */ /* Transmit the second packet. */
#if UIP_CONF_IPV6 #if UIP_CONF_IPV6
tcpip_ipv6_output(); tcpip_ipv6_output();
#else #else
RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, uip_buf, uip_len); RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, uip_buf, uip_len);
#endif /* UIP_CONF_IPV6 */ #endif /* UIP_CONF_IPV6 */
return; return;
} }
#endif /* UIP_TCP */ #endif /* UIP_TCP */
/* uip_fw_output();*/ /* uip_fw_output();*/
#if UIP_CONF_IPV6 #if UIP_CONF_IPV6
tcpip_ipv6_output(); tcpip_ipv6_output();
#else #else
RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, uip_buf, uip_len); RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, uip_buf, uip_len);
#endif /* UIP_CONF_IPV6 */ #endif /* UIP_CONF_IPV6 */
} }
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/

@ -1,103 +1,103 @@
/* /*
* Copyright (c) 2004, Swedish Institute of Computer Science. * Copyright (c) 2004, Swedish Institute of Computer Science.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Institute nor the names of its contributors * 3. Neither the name of the Institute nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* This file is part of the Contiki operating system. * This file is part of the Contiki operating system.
* *
* Author: Adam Dunkels <adam@sics.se> * Author: Adam Dunkels <adam@sics.se>
* *
* $Id: uip-split.h,v 1.1 2006/06/17 22:41:19 adamdunkels Exp $ * $Id: uip-split.h,v 1.1 2006/06/17 22:41:19 adamdunkels Exp $
*/ */
/** /**
* \addtogroup uip * \addtogroup uip
* @{ * @{
*/ */
/** /**
* \defgroup uipsplit uIP TCP throughput booster hack * \defgroup uipsplit uIP TCP throughput booster hack
* @{ * @{
* *
* The basic uIP TCP implementation only allows each TCP connection to * The basic uIP TCP implementation only allows each TCP connection to
* have a single TCP segment in flight at any given time. Because of * have a single TCP segment in flight at any given time. Because of
* the delayed ACK algorithm employed by most TCP receivers, uIP's * the delayed ACK algorithm employed by most TCP receivers, uIP's
* limit on the amount of in-flight TCP segments seriously reduces the * limit on the amount of in-flight TCP segments seriously reduces the
* maximum achievable throughput for sending data from uIP. * maximum achievable throughput for sending data from uIP.
* *
* The uip-split module is a hack which tries to remedy this * The uip-split module is a hack which tries to remedy this
* situation. By splitting maximum sized outgoing TCP segments into * situation. By splitting maximum sized outgoing TCP segments into
* two, the delayed ACK algorithm is not invoked at TCP * two, the delayed ACK algorithm is not invoked at TCP
* receivers. This improves the throughput when sending data from uIP * receivers. This improves the throughput when sending data from uIP
* by orders of magnitude. * by orders of magnitude.
* *
* The uip-split module uses the uip-fw module (uIP IP packet * The uip-split module uses the uip-fw module (uIP IP packet
* forwarding) for sending packets. Therefore, the uip-fw module must * forwarding) for sending packets. Therefore, the uip-fw module must
* be set up with the appropriate network interfaces for this module * be set up with the appropriate network interfaces for this module
* to work. * to work.
*/ */
/** /**
* \file * \file
* Module for splitting outbound TCP segments in two to avoid the * Module for splitting outbound TCP segments in two to avoid the
* delayed ACK throughput degradation. * delayed ACK throughput degradation.
* \author * \author
* Adam Dunkels <adam@sics.se> * Adam Dunkels <adam@sics.se>
* *
*/ */
#ifndef __UIP_SPLIT_H__ #ifndef __UIP_SPLIT_H__
#define __UIP_SPLIT_H__ #define __UIP_SPLIT_H__
#include <string.h> #include <string.h>
#include <uip.h> #include <uip.h>
#include "../../USBHostMode.h" #include "../../USBHostMode.h"
#include <LUFA/Drivers/USB/Class/RNDIS.h> #include <LUFA/Drivers/USB/Class/RNDIS.h>
/** /**
* Handle outgoing packets. * Handle outgoing packets.
* *
* This function inspects an outgoing packet in the uip_buf buffer and * This function inspects an outgoing packet in the uip_buf buffer and
* sends it out using the uip_fw_output() function. If the packet is a * sends it out using the uip_fw_output() function. If the packet is a
* full-sized TCP segment it will be split into two segments and * full-sized TCP segment it will be split into two segments and
* transmitted separately. This function should be called instead of * transmitted separately. This function should be called instead of
* the actual device driver output function, or the uip_fw_output() * the actual device driver output function, or the uip_fw_output()
* function. * function.
* *
* The headers of the outgoing packet is assumed to be in the uip_buf * The headers of the outgoing packet is assumed to be in the uip_buf
* buffer and the payload is assumed to be wherever uip_appdata * buffer and the payload is assumed to be wherever uip_appdata
* points. The length of the outgoing packet is assumed to be in the * points. The length of the outgoing packet is assumed to be in the
* uip_len variable. * uip_len variable.
* *
*/ */
void uip_split_output(void); void uip_split_output(void);
void uip_add32(u8_t *op32, u16_t op16); void uip_add32(u8_t *op32, u16_t op16);
#endif /* __UIP_SPLIT_H__ */ #endif /* __UIP_SPLIT_H__ */
/** @} */ /** @} */
/** @} */ /** @} */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,431 +1,431 @@
/** /**
* \addtogroup uip * \addtogroup uip
* @{ * @{
*/ */
/** /**
* \defgroup uiparp uIP Address Resolution Protocol * \defgroup uiparp uIP Address Resolution Protocol
* @{ * @{
* *
* The Address Resolution Protocol ARP is used for mapping between IP * The Address Resolution Protocol ARP is used for mapping between IP
* addresses and link level addresses such as the Ethernet MAC * addresses and link level addresses such as the Ethernet MAC
* addresses. ARP uses broadcast queries to ask for the link level * addresses. ARP uses broadcast queries to ask for the link level
* address of a known IP address and the host which is configured with * address of a known IP address and the host which is configured with
* the IP address for which the query was meant, will respond with its * the IP address for which the query was meant, will respond with its
* link level address. * link level address.
* *
* \note This ARP implementation only supports Ethernet. * \note This ARP implementation only supports Ethernet.
*/ */
/** /**
* \file * \file
* Implementation of the ARP Address Resolution Protocol. * Implementation of the ARP Address Resolution Protocol.
* \author Adam Dunkels <adam@dunkels.com> * \author Adam Dunkels <adam@dunkels.com>
* *
*/ */
/* /*
* Copyright (c) 2001-2003, Adam Dunkels. * Copyright (c) 2001-2003, Adam Dunkels.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote * 3. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior * products derived from this software without specific prior
* written permission. * written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
* This file is part of the uIP TCP/IP stack. * This file is part of the uIP TCP/IP stack.
* *
* $Id: uip_arp.c,v 1.5 2008/02/07 01:35:00 adamdunkels Exp $ * $Id: uip_arp.c,v 1.5 2008/02/07 01:35:00 adamdunkels Exp $
* *
*/ */
#include "uip_arp.h" #include "uip_arp.h"
#include <string.h> #include <string.h>
struct arp_hdr { struct arp_hdr {
struct uip_eth_hdr ethhdr; struct uip_eth_hdr ethhdr;
u16_t hwtype; u16_t hwtype;
u16_t protocol; u16_t protocol;
u8_t hwlen; u8_t hwlen;
u8_t protolen; u8_t protolen;
u16_t opcode; u16_t opcode;
struct uip_eth_addr shwaddr; struct uip_eth_addr shwaddr;
uip_ipaddr_t sipaddr; uip_ipaddr_t sipaddr;
struct uip_eth_addr dhwaddr; struct uip_eth_addr dhwaddr;
uip_ipaddr_t dipaddr; uip_ipaddr_t dipaddr;
}; };
struct ethip_hdr { struct ethip_hdr {
struct uip_eth_hdr ethhdr; struct uip_eth_hdr ethhdr;
/* IP header. */ /* IP header. */
u8_t vhl, u8_t vhl,
tos, tos,
len[2], len[2],
ipid[2], ipid[2],
ipoffset[2], ipoffset[2],
ttl, ttl,
proto; proto;
u16_t ipchksum; u16_t ipchksum;
uip_ipaddr_t srcipaddr, destipaddr; uip_ipaddr_t srcipaddr, destipaddr;
}; };
#define ARP_REQUEST 1 #define ARP_REQUEST 1
#define ARP_REPLY 2 #define ARP_REPLY 2
#define ARP_HWTYPE_ETH 1 #define ARP_HWTYPE_ETH 1
struct arp_entry { struct arp_entry {
uip_ipaddr_t ipaddr; uip_ipaddr_t ipaddr;
struct uip_eth_addr ethaddr; struct uip_eth_addr ethaddr;
u8_t time; u8_t time;
}; };
static const struct uip_eth_addr broadcast_ethaddr = static const struct uip_eth_addr broadcast_ethaddr =
{{0xff,0xff,0xff,0xff,0xff,0xff}}; {{0xff,0xff,0xff,0xff,0xff,0xff}};
static const u16_t broadcast_ipaddr[2] = {0xffff,0xffff}; static const u16_t broadcast_ipaddr[2] = {0xffff,0xffff};
static struct arp_entry arp_table[UIP_ARPTAB_SIZE]; static struct arp_entry arp_table[UIP_ARPTAB_SIZE];
static uip_ipaddr_t ipaddr; static uip_ipaddr_t ipaddr;
static u8_t i, c; static u8_t i, c;
static u8_t arptime; static u8_t arptime;
static u8_t tmpage; static u8_t tmpage;
#define BUF ((struct arp_hdr *)&uip_buf[0]) #define BUF ((struct arp_hdr *)&uip_buf[0])
#define IPBUF ((struct ethip_hdr *)&uip_buf[0]) #define IPBUF ((struct ethip_hdr *)&uip_buf[0])
#define DEBUG 0 #define DEBUG 0
#if DEBUG #if DEBUG
#include <stdio.h> #include <stdio.h>
#define PRINTF(...) printf(__VA_ARGS__) #define PRINTF(...) printf(__VA_ARGS__)
#else #else
#define PRINTF(...) #define PRINTF(...)
#endif #endif
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
/** /**
* Initialize the ARP module. * Initialize the ARP module.
* *
*/ */
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
void void
uip_arp_init(void) uip_arp_init(void)
{ {
for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
memset(&arp_table[i].ipaddr, 0, 4); memset(&arp_table[i].ipaddr, 0, 4);
} }
} }
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
/** /**
* Periodic ARP processing function. * Periodic ARP processing function.
* *
* This function performs periodic timer processing in the ARP module * This function performs periodic timer processing in the ARP module
* and should be called at regular intervals. The recommended interval * and should be called at regular intervals. The recommended interval
* is 10 seconds between the calls. * is 10 seconds between the calls.
* *
*/ */
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
void void
uip_arp_timer(void) uip_arp_timer(void)
{ {
struct arp_entry *tabptr = NULL; struct arp_entry *tabptr = NULL;
++arptime; ++arptime;
for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
tabptr = &arp_table[i]; tabptr = &arp_table[i];
if(uip_ipaddr_cmp(&tabptr->ipaddr, &uip_all_zeroes_addr) && if(uip_ipaddr_cmp(&tabptr->ipaddr, &uip_all_zeroes_addr) &&
arptime - tabptr->time >= UIP_ARP_MAXAGE) { arptime - tabptr->time >= UIP_ARP_MAXAGE) {
memset(&tabptr->ipaddr, 0, 4); memset(&tabptr->ipaddr, 0, 4);
} }
} }
} }
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
static void static void
uip_arp_update(uip_ipaddr_t *ipaddr, struct uip_eth_addr *ethaddr) uip_arp_update(uip_ipaddr_t *ipaddr, struct uip_eth_addr *ethaddr)
{ {
register struct arp_entry *tabptr = NULL; register struct arp_entry *tabptr = NULL;
/* Walk through the ARP mapping table and try to find an entry to /* Walk through the ARP mapping table and try to find an entry to
update. If none is found, the IP -> MAC address mapping is update. If none is found, the IP -> MAC address mapping is
inserted in the ARP table. */ inserted in the ARP table. */
for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
tabptr = &arp_table[i]; tabptr = &arp_table[i];
/* Only check those entries that are actually in use. */ /* Only check those entries that are actually in use. */
if(!uip_ipaddr_cmp(&tabptr->ipaddr, &uip_all_zeroes_addr)) { if(!uip_ipaddr_cmp(&tabptr->ipaddr, &uip_all_zeroes_addr)) {
/* Check if the source IP address of the incoming packet matches /* Check if the source IP address of the incoming packet matches
the IP address in this ARP table entry. */ the IP address in this ARP table entry. */
if(uip_ipaddr_cmp(ipaddr, &tabptr->ipaddr)) { if(uip_ipaddr_cmp(ipaddr, &tabptr->ipaddr)) {
/* An old entry found, update this and return. */ /* An old entry found, update this and return. */
memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6); memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);
tabptr->time = arptime; tabptr->time = arptime;
return; return;
} }
} }
} }
/* If we get here, no existing ARP table entry was found, so we /* If we get here, no existing ARP table entry was found, so we
create one. */ create one. */
/* First, we try to find an unused entry in the ARP table. */ /* First, we try to find an unused entry in the ARP table. */
for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
tabptr = &arp_table[i]; tabptr = &arp_table[i];
if(uip_ipaddr_cmp(&tabptr->ipaddr, &uip_all_zeroes_addr)) { if(uip_ipaddr_cmp(&tabptr->ipaddr, &uip_all_zeroes_addr)) {
break; break;
} }
} }
/* If no unused entry is found, we try to find the oldest entry and /* If no unused entry is found, we try to find the oldest entry and
throw it away. */ throw it away. */
if(i == UIP_ARPTAB_SIZE) { if(i == UIP_ARPTAB_SIZE) {
tmpage = 0; tmpage = 0;
c = 0; c = 0;
for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
tabptr = &arp_table[i]; tabptr = &arp_table[i];
if(arptime - tabptr->time > tmpage) { if(arptime - tabptr->time > tmpage) {
tmpage = arptime - tabptr->time; tmpage = arptime - tabptr->time;
c = i; c = i;
} }
} }
i = c; i = c;
tabptr = &arp_table[i]; tabptr = &arp_table[i];
} }
/* Now, i is the ARP table entry which we will fill with the new /* Now, i is the ARP table entry which we will fill with the new
information. */ information. */
uip_ipaddr_copy(&tabptr->ipaddr, ipaddr); uip_ipaddr_copy(&tabptr->ipaddr, ipaddr);
memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6); memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);
tabptr->time = arptime; tabptr->time = arptime;
} }
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
/** /**
* ARP processing for incoming IP packets * ARP processing for incoming IP packets
* *
* This function should be called by the device driver when an IP * This function should be called by the device driver when an IP
* packet has been received. The function will check if the address is * packet has been received. The function will check if the address is
* in the ARP cache, and if so the ARP cache entry will be * in the ARP cache, and if so the ARP cache entry will be
* refreshed. If no ARP cache entry was found, a new one is created. * refreshed. If no ARP cache entry was found, a new one is created.
* *
* This function expects an IP packet with a prepended Ethernet header * This function expects an IP packet with a prepended Ethernet header
* in the uip_buf[] buffer, and the length of the packet in the global * in the uip_buf[] buffer, and the length of the packet in the global
* variable uip_len. * variable uip_len.
*/ */
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
#if 0 #if 0
void void
uip_arp_ipin(void) uip_arp_ipin(void)
{ {
uip_len -= sizeof(struct uip_eth_hdr); uip_len -= sizeof(struct uip_eth_hdr);
/* Only insert/update an entry if the source IP address of the /* Only insert/update an entry if the source IP address of the
incoming IP packet comes from a host on the local network. */ incoming IP packet comes from a host on the local network. */
if((IPBUF->srcipaddr[0] & uip_netmask[0]) != if((IPBUF->srcipaddr[0] & uip_netmask[0]) !=
(uip_hostaddr[0] & uip_netmask[0])) { (uip_hostaddr[0] & uip_netmask[0])) {
return; return;
} }
if((IPBUF->srcipaddr[1] & uip_netmask[1]) != if((IPBUF->srcipaddr[1] & uip_netmask[1]) !=
(uip_hostaddr[1] & uip_netmask[1])) { (uip_hostaddr[1] & uip_netmask[1])) {
return; return;
} }
uip_arp_update(IPBUF->srcipaddr, &(IPBUF->ethhdr.src)); uip_arp_update(IPBUF->srcipaddr, &(IPBUF->ethhdr.src));
return; return;
} }
#endif /* 0 */ #endif /* 0 */
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
/** /**
* ARP processing for incoming ARP packets. * ARP processing for incoming ARP packets.
* *
* This function should be called by the device driver when an ARP * This function should be called by the device driver when an ARP
* packet has been received. The function will act differently * packet has been received. The function will act differently
* depending on the ARP packet type: if it is a reply for a request * depending on the ARP packet type: if it is a reply for a request
* that we previously sent out, the ARP cache will be filled in with * that we previously sent out, the ARP cache will be filled in with
* the values from the ARP reply. If the incoming ARP packet is an ARP * the values from the ARP reply. If the incoming ARP packet is an ARP
* request for our IP address, an ARP reply packet is created and put * request for our IP address, an ARP reply packet is created and put
* into the uip_buf[] buffer. * into the uip_buf[] buffer.
* *
* When the function returns, the value of the global variable uip_len * When the function returns, the value of the global variable uip_len
* indicates whether the device driver should send out a packet or * indicates whether the device driver should send out a packet or
* not. If uip_len is zero, no packet should be sent. If uip_len is * not. If uip_len is zero, no packet should be sent. If uip_len is
* non-zero, it contains the length of the outbound packet that is * non-zero, it contains the length of the outbound packet that is
* present in the uip_buf[] buffer. * present in the uip_buf[] buffer.
* *
* This function expects an ARP packet with a prepended Ethernet * This function expects an ARP packet with a prepended Ethernet
* header in the uip_buf[] buffer, and the length of the packet in the * header in the uip_buf[] buffer, and the length of the packet in the
* global variable uip_len. * global variable uip_len.
*/ */
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
void void
uip_arp_arpin(void) uip_arp_arpin(void)
{ {
if(uip_len < sizeof(struct arp_hdr)) { if(uip_len < sizeof(struct arp_hdr)) {
uip_len = 0; uip_len = 0;
return; return;
} }
uip_len = 0; uip_len = 0;
switch(BUF->opcode) { switch(BUF->opcode) {
case HTONS(ARP_REQUEST): case HTONS(ARP_REQUEST):
/* ARP request. If it asked for our address, we send out a /* ARP request. If it asked for our address, we send out a
reply. */ reply. */
/* if(BUF->dipaddr[0] == uip_hostaddr[0] && /* if(BUF->dipaddr[0] == uip_hostaddr[0] &&
BUF->dipaddr[1] == uip_hostaddr[1]) {*/ BUF->dipaddr[1] == uip_hostaddr[1]) {*/
PRINTF("uip_arp_arpin: request for %d.%d.%d.%d (we are %d.%d.%d.%d)\n", PRINTF("uip_arp_arpin: request for %d.%d.%d.%d (we are %d.%d.%d.%d)\n",
BUF->dipaddr.u8[0], BUF->dipaddr.u8[1], BUF->dipaddr.u8[0], BUF->dipaddr.u8[1],
BUF->dipaddr.u8[2], BUF->dipaddr.u8[3], BUF->dipaddr.u8[2], BUF->dipaddr.u8[3],
uip_hostaddr.u8[0], uip_hostaddr.u8[1], uip_hostaddr.u8[0], uip_hostaddr.u8[1],
uip_hostaddr.u8[2], uip_hostaddr.u8[3]); uip_hostaddr.u8[2], uip_hostaddr.u8[3]);
if(uip_ipaddr_cmp(&BUF->dipaddr, &uip_hostaddr)) { if(uip_ipaddr_cmp(&BUF->dipaddr, &uip_hostaddr)) {
/* First, we register the one who made the request in our ARP /* First, we register the one who made the request in our ARP
table, since it is likely that we will do more communication table, since it is likely that we will do more communication
with this host in the future. */ with this host in the future. */
uip_arp_update(&BUF->sipaddr, &BUF->shwaddr); uip_arp_update(&BUF->sipaddr, &BUF->shwaddr);
BUF->opcode = HTONS(ARP_REPLY); BUF->opcode = HTONS(ARP_REPLY);
memcpy(BUF->dhwaddr.addr, BUF->shwaddr.addr, 6); memcpy(BUF->dhwaddr.addr, BUF->shwaddr.addr, 6);
memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6); memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6);
memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6); memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6);
memcpy(BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, 6); memcpy(BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, 6);
uip_ipaddr_copy(&BUF->dipaddr, &BUF->sipaddr); uip_ipaddr_copy(&BUF->dipaddr, &BUF->sipaddr);
uip_ipaddr_copy(&BUF->sipaddr, &uip_hostaddr); uip_ipaddr_copy(&BUF->sipaddr, &uip_hostaddr);
BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP); BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP);
uip_len = sizeof(struct arp_hdr); uip_len = sizeof(struct arp_hdr);
} }
break; break;
case HTONS(ARP_REPLY): case HTONS(ARP_REPLY):
/* ARP reply. We insert or update the ARP table if it was meant /* ARP reply. We insert or update the ARP table if it was meant
for us. */ for us. */
if(uip_ipaddr_cmp(&BUF->dipaddr, &uip_hostaddr)) { if(uip_ipaddr_cmp(&BUF->dipaddr, &uip_hostaddr)) {
uip_arp_update(&BUF->sipaddr, &BUF->shwaddr); uip_arp_update(&BUF->sipaddr, &BUF->shwaddr);
} }
break; break;
} }
return; return;
} }
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
/** /**
* Prepend Ethernet header to an outbound IP packet and see if we need * Prepend Ethernet header to an outbound IP packet and see if we need
* to send out an ARP request. * to send out an ARP request.
* *
* This function should be called before sending out an IP packet. The * This function should be called before sending out an IP packet. The
* function checks the destination IP address of the IP packet to see * function checks the destination IP address of the IP packet to see
* what Ethernet MAC address that should be used as a destination MAC * what Ethernet MAC address that should be used as a destination MAC
* address on the Ethernet. * address on the Ethernet.
* *
* If the destination IP address is in the local network (determined * If the destination IP address is in the local network (determined
* by logical ANDing of netmask and our IP address), the function * by logical ANDing of netmask and our IP address), the function
* checks the ARP cache to see if an entry for the destination IP * checks the ARP cache to see if an entry for the destination IP
* address is found. If so, an Ethernet header is prepended and the * address is found. If so, an Ethernet header is prepended and the
* function returns. If no ARP cache entry is found for the * function returns. If no ARP cache entry is found for the
* destination IP address, the packet in the uip_buf[] is replaced by * destination IP address, the packet in the uip_buf[] is replaced by
* an ARP request packet for the IP address. The IP packet is dropped * an ARP request packet for the IP address. The IP packet is dropped
* and it is assumed that they higher level protocols (e.g., TCP) * and it is assumed that they higher level protocols (e.g., TCP)
* eventually will retransmit the dropped packet. * eventually will retransmit the dropped packet.
* *
* If the destination IP address is not on the local network, the IP * If the destination IP address is not on the local network, the IP
* address of the default router is used instead. * address of the default router is used instead.
* *
* When the function returns, a packet is present in the uip_buf[] * When the function returns, a packet is present in the uip_buf[]
* buffer, and the length of the packet is in the global variable * buffer, and the length of the packet is in the global variable
* uip_len. * uip_len.
*/ */
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
void void
uip_arp_out(void) uip_arp_out(void)
{ {
struct arp_entry *tabptr = NULL; struct arp_entry *tabptr = NULL;
/* Find the destination IP address in the ARP table and construct /* Find the destination IP address in the ARP table and construct
the Ethernet header. If the destination IP addres isn't on the the Ethernet header. If the destination IP addres isn't on the
local network, we use the default router's IP address instead. local network, we use the default router's IP address instead.
If not ARP table entry is found, we overwrite the original IP If not ARP table entry is found, we overwrite the original IP
packet with an ARP request for the IP address. */ packet with an ARP request for the IP address. */
/* First check if destination is a local broadcast. */ /* First check if destination is a local broadcast. */
if(uip_ipaddr_cmp(&IPBUF->destipaddr, &uip_broadcast_addr)) { if(uip_ipaddr_cmp(&IPBUF->destipaddr, &uip_broadcast_addr)) {
memcpy(IPBUF->ethhdr.dest.addr, broadcast_ethaddr.addr, 6); memcpy(IPBUF->ethhdr.dest.addr, broadcast_ethaddr.addr, 6);
} else { } else {
/* Check if the destination address is on the local network. */ /* Check if the destination address is on the local network. */
if(!uip_ipaddr_maskcmp(&IPBUF->destipaddr, &uip_hostaddr, &uip_netmask)) { if(!uip_ipaddr_maskcmp(&IPBUF->destipaddr, &uip_hostaddr, &uip_netmask)) {
/* Destination address was not on the local network, so we need to /* Destination address was not on the local network, so we need to
use the default router's IP address instead of the destination use the default router's IP address instead of the destination
address when determining the MAC address. */ address when determining the MAC address. */
uip_ipaddr_copy(&ipaddr, &uip_draddr); uip_ipaddr_copy(&ipaddr, &uip_draddr);
} else { } else {
/* Else, we use the destination IP address. */ /* Else, we use the destination IP address. */
uip_ipaddr_copy(&ipaddr, &IPBUF->destipaddr); uip_ipaddr_copy(&ipaddr, &IPBUF->destipaddr);
} }
for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
tabptr = &arp_table[i]; tabptr = &arp_table[i];
if(uip_ipaddr_cmp(&ipaddr, &tabptr->ipaddr)) { if(uip_ipaddr_cmp(&ipaddr, &tabptr->ipaddr)) {
break; break;
} }
} }
if(i == UIP_ARPTAB_SIZE) { if(i == UIP_ARPTAB_SIZE) {
/* The destination address was not in our ARP table, so we /* The destination address was not in our ARP table, so we
overwrite the IP packet with an ARP request. */ overwrite the IP packet with an ARP request. */
memset(BUF->ethhdr.dest.addr, 0xff, 6); memset(BUF->ethhdr.dest.addr, 0xff, 6);
memset(BUF->dhwaddr.addr, 0x00, 6); memset(BUF->dhwaddr.addr, 0x00, 6);
memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6); memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6);
memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6); memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6);
uip_ipaddr_copy(&BUF->dipaddr, &ipaddr); uip_ipaddr_copy(&BUF->dipaddr, &ipaddr);
uip_ipaddr_copy(&BUF->sipaddr, &uip_hostaddr); uip_ipaddr_copy(&BUF->sipaddr, &uip_hostaddr);
BUF->opcode = HTONS(ARP_REQUEST); /* ARP request. */ BUF->opcode = HTONS(ARP_REQUEST); /* ARP request. */
BUF->hwtype = HTONS(ARP_HWTYPE_ETH); BUF->hwtype = HTONS(ARP_HWTYPE_ETH);
BUF->protocol = HTONS(UIP_ETHTYPE_IP); BUF->protocol = HTONS(UIP_ETHTYPE_IP);
BUF->hwlen = 6; BUF->hwlen = 6;
BUF->protolen = 4; BUF->protolen = 4;
BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP); BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP);
uip_appdata = &uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN]; uip_appdata = &uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN];
uip_len = sizeof(struct arp_hdr); uip_len = sizeof(struct arp_hdr);
return; return;
} }
/* Build an ethernet header. */ /* Build an ethernet header. */
memcpy(IPBUF->ethhdr.dest.addr, tabptr->ethaddr.addr, 6); memcpy(IPBUF->ethhdr.dest.addr, tabptr->ethaddr.addr, 6);
} }
memcpy(IPBUF->ethhdr.src.addr, uip_ethaddr.addr, 6); memcpy(IPBUF->ethhdr.src.addr, uip_ethaddr.addr, 6);
IPBUF->ethhdr.type = HTONS(UIP_ETHTYPE_IP); IPBUF->ethhdr.type = HTONS(UIP_ETHTYPE_IP);
uip_len += sizeof(struct uip_eth_hdr); uip_len += sizeof(struct uip_eth_hdr);
} }
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
/** @} */ /** @} */
/** @} */ /** @} */

@ -1,145 +1,145 @@
/** /**
* \addtogroup uip * \addtogroup uip
* @{ * @{
*/ */
/** /**
* \addtogroup uiparp * \addtogroup uiparp
* @{ * @{
*/ */
/** /**
* \file * \file
* Macros and definitions for the ARP module. * Macros and definitions for the ARP module.
* \author Adam Dunkels <adam@dunkels.com> * \author Adam Dunkels <adam@dunkels.com>
*/ */
/* /*
* Copyright (c) 2001-2003, Adam Dunkels. * Copyright (c) 2001-2003, Adam Dunkels.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote * 3. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior * products derived from this software without specific prior
* written permission. * written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
* This file is part of the uIP TCP/IP stack. * This file is part of the uIP TCP/IP stack.
* *
* $Id: uip_arp.h,v 1.2 2006/08/26 23:58:45 oliverschmidt Exp $ * $Id: uip_arp.h,v 1.2 2006/08/26 23:58:45 oliverschmidt Exp $
* *
*/ */
#ifndef __UIP_ARP_H__ #ifndef __UIP_ARP_H__
#define __UIP_ARP_H__ #define __UIP_ARP_H__
#include "uip.h" #include "uip.h"
extern struct uip_eth_addr uip_ethaddr; extern struct uip_eth_addr uip_ethaddr;
/** /**
* The Ethernet header. * The Ethernet header.
*/ */
struct uip_eth_hdr { struct uip_eth_hdr {
struct uip_eth_addr dest; struct uip_eth_addr dest;
struct uip_eth_addr src; struct uip_eth_addr src;
u16_t type; u16_t type;
}; };
#define UIP_ETHTYPE_ARP 0x0806 #define UIP_ETHTYPE_ARP 0x0806
#define UIP_ETHTYPE_IP 0x0800 #define UIP_ETHTYPE_IP 0x0800
#define UIP_ETHTYPE_IPV6 0x86dd #define UIP_ETHTYPE_IPV6 0x86dd
/* The uip_arp_init() function must be called before any of the other /* The uip_arp_init() function must be called before any of the other
ARP functions. */ ARP functions. */
void uip_arp_init(void); void uip_arp_init(void);
/* The uip_arp_ipin() function should be called whenever an IP packet /* The uip_arp_ipin() function should be called whenever an IP packet
arrives from the Ethernet. This function refreshes the ARP table or arrives from the Ethernet. This function refreshes the ARP table or
inserts a new mapping if none exists. The function assumes that an inserts a new mapping if none exists. The function assumes that an
IP packet with an Ethernet header is present in the uip_buf buffer IP packet with an Ethernet header is present in the uip_buf buffer
and that the length of the packet is in the uip_len variable. */ and that the length of the packet is in the uip_len variable. */
/*void uip_arp_ipin(void);*/ /*void uip_arp_ipin(void);*/
#define uip_arp_ipin() #define uip_arp_ipin()
/* The uip_arp_arpin() should be called when an ARP packet is received /* The uip_arp_arpin() should be called when an ARP packet is received
by the Ethernet driver. This function also assumes that the by the Ethernet driver. This function also assumes that the
Ethernet frame is present in the uip_buf buffer. When the Ethernet frame is present in the uip_buf buffer. When the
uip_arp_arpin() function returns, the contents of the uip_buf uip_arp_arpin() function returns, the contents of the uip_buf
buffer should be sent out on the Ethernet if the uip_len variable buffer should be sent out on the Ethernet if the uip_len variable
is > 0. */ is > 0. */
void uip_arp_arpin(void); void uip_arp_arpin(void);
/* The uip_arp_out() function should be called when an IP packet /* The uip_arp_out() function should be called when an IP packet
should be sent out on the Ethernet. This function creates an should be sent out on the Ethernet. This function creates an
Ethernet header before the IP header in the uip_buf buffer. The Ethernet header before the IP header in the uip_buf buffer. The
Ethernet header will have the correct Ethernet MAC destination Ethernet header will have the correct Ethernet MAC destination
address filled in if an ARP table entry for the destination IP address filled in if an ARP table entry for the destination IP
address (or the IP address of the default router) is present. If no address (or the IP address of the default router) is present. If no
such table entry is found, the IP packet is overwritten with an ARP such table entry is found, the IP packet is overwritten with an ARP
request and we rely on TCP to retransmit the packet that was request and we rely on TCP to retransmit the packet that was
overwritten. In any case, the uip_len variable holds the length of overwritten. In any case, the uip_len variable holds the length of
the Ethernet frame that should be transmitted. */ the Ethernet frame that should be transmitted. */
void uip_arp_out(void); void uip_arp_out(void);
/* The uip_arp_timer() function should be called every ten seconds. It /* The uip_arp_timer() function should be called every ten seconds. It
is responsible for flushing old entries in the ARP table. */ is responsible for flushing old entries in the ARP table. */
void uip_arp_timer(void); void uip_arp_timer(void);
/** @} */ /** @} */
/** /**
* \addtogroup uipconffunc * \addtogroup uipconffunc
* @{ * @{
*/ */
/** /**
* Specifiy the Ethernet MAC address. * Specifiy the Ethernet MAC address.
* *
* The ARP code needs to know the MAC address of the Ethernet card in * The ARP code needs to know the MAC address of the Ethernet card in
* order to be able to respond to ARP queries and to generate working * order to be able to respond to ARP queries and to generate working
* Ethernet headers. * Ethernet headers.
* *
* \note This macro only specifies the Ethernet MAC address to the ARP * \note This macro only specifies the Ethernet MAC address to the ARP
* code. It cannot be used to change the MAC address of the Ethernet * code. It cannot be used to change the MAC address of the Ethernet
* card. * card.
* *
* \param eaddr A pointer to a struct uip_eth_addr containing the * \param eaddr A pointer to a struct uip_eth_addr containing the
* Ethernet MAC address of the Ethernet card. * Ethernet MAC address of the Ethernet card.
* *
* \hideinitializer * \hideinitializer
*/ */
#define uip_setethaddr(eaddr) do {uip_ethaddr.addr[0] = eaddr.addr[0]; \ #define uip_setethaddr(eaddr) do {uip_ethaddr.addr[0] = eaddr.addr[0]; \
uip_ethaddr.addr[1] = eaddr.addr[1];\ uip_ethaddr.addr[1] = eaddr.addr[1];\
uip_ethaddr.addr[2] = eaddr.addr[2];\ uip_ethaddr.addr[2] = eaddr.addr[2];\
uip_ethaddr.addr[3] = eaddr.addr[3];\ uip_ethaddr.addr[3] = eaddr.addr[3];\
uip_ethaddr.addr[4] = eaddr.addr[4];\ uip_ethaddr.addr[4] = eaddr.addr[4];\
uip_ethaddr.addr[5] = eaddr.addr[5];} while(0) uip_ethaddr.addr[5] = eaddr.addr[5];} while(0)
/** @} */ /** @} */
#endif /* __UIP_ARP_H__ */ #endif /* __UIP_ARP_H__ */
/** @} */ /** @} */

@ -1,737 +1,737 @@
/** /**
* \addtogroup uip * \addtogroup uip
* @{ * @{
*/ */
/** /**
* \defgroup uipopt Configuration options for uIP * \defgroup uipopt Configuration options for uIP
* @{ * @{
* *
* uIP is configured using the per-project configuration file * uIP is configured using the per-project configuration file
* "uipopt.h". This file contains all compile-time options for uIP and * "uipopt.h". This file contains all compile-time options for uIP and
* should be tweaked to match each specific project. The uIP * should be tweaked to match each specific project. The uIP
* distribution contains a documented example "uipopt.h" that can be * distribution contains a documented example "uipopt.h" that can be
* copied and modified for each project. * copied and modified for each project.
*/ */
/** /**
* \file * \file
* Configuration options for uIP. * Configuration options for uIP.
* \author Adam Dunkels <adam@dunkels.com> * \author Adam Dunkels <adam@dunkels.com>
* *
* This file is used for tweaking various configuration options for * This file is used for tweaking various configuration options for
* uIP. You should make a copy of this file into one of your project's * uIP. You should make a copy of this file into one of your project's
* directories instead of editing this example "uipopt.h" file that * directories instead of editing this example "uipopt.h" file that
* comes with the uIP distribution. * comes with the uIP distribution.
*/ */
/* /*
* Copyright (c) 2001-2003, Adam Dunkels. * Copyright (c) 2001-2003, Adam Dunkels.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote * 3. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior * products derived from this software without specific prior
* written permission. * written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
* This file is part of the uIP TCP/IP stack. * This file is part of the uIP TCP/IP stack.
* *
* $Id: uipopt.h,v 1.11 2009/04/10 00:37:48 adamdunkels Exp $ * $Id: uipopt.h,v 1.11 2009/04/10 00:37:48 adamdunkels Exp $
* *
*/ */
#ifndef __UIPOPT_H__ #ifndef __UIPOPT_H__
#define __UIPOPT_H__ #define __UIPOPT_H__
#ifndef UIP_LITTLE_ENDIAN #ifndef UIP_LITTLE_ENDIAN
#define UIP_LITTLE_ENDIAN 3412 #define UIP_LITTLE_ENDIAN 3412
#endif /* UIP_LITTLE_ENDIAN */ #endif /* UIP_LITTLE_ENDIAN */
#ifndef UIP_BIG_ENDIAN #ifndef UIP_BIG_ENDIAN
#define UIP_BIG_ENDIAN 1234 #define UIP_BIG_ENDIAN 1234
#endif /* UIP_BIG_ENDIAN */ #endif /* UIP_BIG_ENDIAN */
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
/** /**
* \defgroup uipoptstaticconf Static configuration options * \defgroup uipoptstaticconf Static configuration options
* @{ * @{
* *
* These configuration options can be used for setting the IP address * These configuration options can be used for setting the IP address
* settings statically, but only if UIP_FIXEDADDR is set to 1. The * settings statically, but only if UIP_FIXEDADDR is set to 1. The
* configuration options for a specific node includes IP address, * configuration options for a specific node includes IP address,
* netmask and default router as well as the Ethernet address. The * netmask and default router as well as the Ethernet address. The
* netmask, default router and Ethernet address are applicable only * netmask, default router and Ethernet address are applicable only
* if uIP should be run over Ethernet. * if uIP should be run over Ethernet.
* *
* This options are meaningful only for the IPv4 code. * This options are meaningful only for the IPv4 code.
* *
* All of these should be changed to suit your project. * All of these should be changed to suit your project.
*/ */
/** /**
* Determines if uIP should use a fixed IP address or not. * Determines if uIP should use a fixed IP address or not.
* *
* If uIP should use a fixed IP address, the settings are set in the * If uIP should use a fixed IP address, the settings are set in the
* uipopt.h file. If not, the macros uip_sethostaddr(), * uipopt.h file. If not, the macros uip_sethostaddr(),
* uip_setdraddr() and uip_setnetmask() should be used instead. * uip_setdraddr() and uip_setnetmask() should be used instead.
* *
* \hideinitializer * \hideinitializer
*/ */
#define UIP_FIXEDADDR 0 #define UIP_FIXEDADDR 0
/** /**
* Ping IP address assignment. * Ping IP address assignment.
* *
* uIP uses a "ping" packets for setting its own IP address if this * uIP uses a "ping" packets for setting its own IP address if this
* option is set. If so, uIP will start with an empty IP address and * option is set. If so, uIP will start with an empty IP address and
* the destination IP address of the first incoming "ping" (ICMP echo) * the destination IP address of the first incoming "ping" (ICMP echo)
* packet will be used for setting the hosts IP address. * packet will be used for setting the hosts IP address.
* *
* \note This works only if UIP_FIXEDADDR is 0. * \note This works only if UIP_FIXEDADDR is 0.
* *
* \hideinitializer * \hideinitializer
*/ */
#ifdef UIP_CONF_PINGADDRCONF #ifdef UIP_CONF_PINGADDRCONF
#define UIP_PINGADDRCONF UIP_CONF_PINGADDRCONF #define UIP_PINGADDRCONF UIP_CONF_PINGADDRCONF
#else /* UIP_CONF_PINGADDRCONF */ #else /* UIP_CONF_PINGADDRCONF */
#define UIP_PINGADDRCONF 0 #define UIP_PINGADDRCONF 0
#endif /* UIP_CONF_PINGADDRCONF */ #endif /* UIP_CONF_PINGADDRCONF */
/** /**
* Specifies if the uIP ARP module should be compiled with a fixed * Specifies if the uIP ARP module should be compiled with a fixed
* Ethernet MAC address or not. * Ethernet MAC address or not.
* *
* If this configuration option is 0, the macro uip_setethaddr() can * If this configuration option is 0, the macro uip_setethaddr() can
* be used to specify the Ethernet address at run-time. * be used to specify the Ethernet address at run-time.
* *
* \hideinitializer * \hideinitializer
*/ */
#define UIP_FIXEDETHADDR 0 #define UIP_FIXEDETHADDR 0
/** @} */ /** @} */
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
/** /**
* \defgroup uipoptip IP configuration options * \defgroup uipoptip IP configuration options
* @{ * @{
* *
*/ */
/** /**
* The IP TTL (time to live) of IP packets sent by uIP. * The IP TTL (time to live) of IP packets sent by uIP.
* *
* This should normally not be changed. * This should normally not be changed.
*/ */
#define UIP_TTL 64 #define UIP_TTL 64
/** /**
* The maximum time an IP fragment should wait in the reassembly * The maximum time an IP fragment should wait in the reassembly
* buffer before it is dropped. * buffer before it is dropped.
* *
*/ */
#define UIP_REASS_MAXAGE 60 /*60s*/ #define UIP_REASS_MAXAGE 60 /*60s*/
/** /**
* Turn on support for IP packet reassembly. * Turn on support for IP packet reassembly.
* *
* uIP supports reassembly of fragmented IP packets. This features * uIP supports reassembly of fragmented IP packets. This features
* requires an additional amount of RAM to hold the reassembly buffer * requires an additional amount of RAM to hold the reassembly buffer
* and the reassembly code size is approximately 700 bytes. The * and the reassembly code size is approximately 700 bytes. The
* reassembly buffer is of the same size as the uip_buf buffer * reassembly buffer is of the same size as the uip_buf buffer
* (configured by UIP_BUFSIZE). * (configured by UIP_BUFSIZE).
* *
* \note IP packet reassembly is not heavily tested. * \note IP packet reassembly is not heavily tested.
* *
* \hideinitializer * \hideinitializer
*/ */
#ifdef UIP_CONF_REASSEMBLY #ifdef UIP_CONF_REASSEMBLY
#define UIP_REASSEMBLY UIP_CONF_REASSEMBLY #define UIP_REASSEMBLY UIP_CONF_REASSEMBLY
#else /* UIP_CONF_REASSEMBLY */ #else /* UIP_CONF_REASSEMBLY */
#define UIP_REASSEMBLY 0 #define UIP_REASSEMBLY 0
#endif /* UIP_CONF_REASSEMBLY */ #endif /* UIP_CONF_REASSEMBLY */
/** @} */ /** @} */
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
/** /**
* \defgroup uipoptipv6 IPv6 configuration options * \defgroup uipoptipv6 IPv6 configuration options
* @{ * @{
* *
*/ */
/** The maximum transmission unit at the IP Layer*/ /** The maximum transmission unit at the IP Layer*/
#define UIP_LINK_MTU 1280 #define UIP_LINK_MTU 1280
#ifndef UIP_CONF_IPV6 #ifndef UIP_CONF_IPV6
/** Do we use IPv6 or not (default: no) */ /** Do we use IPv6 or not (default: no) */
#define UIP_CONF_IPV6 0 #define UIP_CONF_IPV6 0
#endif #endif
#ifndef UIP_CONF_IPV6_QUEUE_PKT #ifndef UIP_CONF_IPV6_QUEUE_PKT
/** Do we do per %neighbor queuing during address resolution (default: no) */ /** Do we do per %neighbor queuing during address resolution (default: no) */
#define UIP_CONF_IPV6_QUEUE_PKT 0 #define UIP_CONF_IPV6_QUEUE_PKT 0
#endif #endif
#ifndef UIP_CONF_IPV6_CHECKS #ifndef UIP_CONF_IPV6_CHECKS
/** Do we do IPv6 consistency checks (highly recommended, default: yes) */ /** Do we do IPv6 consistency checks (highly recommended, default: yes) */
#define UIP_CONF_IPV6_CHECKS 1 #define UIP_CONF_IPV6_CHECKS 1
#endif #endif
#ifndef UIP_CONF_IPV6_REASSEMBLY #ifndef UIP_CONF_IPV6_REASSEMBLY
/** Do we do IPv6 fragmentation (default: no) */ /** Do we do IPv6 fragmentation (default: no) */
#define UIP_CONF_IPV6_REASSEMBLY 0 #define UIP_CONF_IPV6_REASSEMBLY 0
#endif #endif
#ifndef UIP_CONF_NETIF_MAX_ADDRESSES #ifndef UIP_CONF_NETIF_MAX_ADDRESSES
/** Default number of IPv6 addresses associated to the node's interface */ /** Default number of IPv6 addresses associated to the node's interface */
#define UIP_CONF_NETIF_MAX_ADDRESSES 3 #define UIP_CONF_NETIF_MAX_ADDRESSES 3
#endif #endif
#ifndef UIP_CONF_ND6_MAX_PREFIXES #ifndef UIP_CONF_ND6_MAX_PREFIXES
/** Default number of IPv6 prefixes associated to the node's interface */ /** Default number of IPv6 prefixes associated to the node's interface */
#define UIP_CONF_ND6_MAX_PREFIXES 3 #define UIP_CONF_ND6_MAX_PREFIXES 3
#endif #endif
#ifndef UIP_CONF_ND6_MAX_NEIGHBORS #ifndef UIP_CONF_ND6_MAX_NEIGHBORS
/** Default number of neighbors that can be stored in the %neighbor cache */ /** Default number of neighbors that can be stored in the %neighbor cache */
#define UIP_CONF_ND6_MAX_NEIGHBORS 4 #define UIP_CONF_ND6_MAX_NEIGHBORS 4
#endif #endif
#ifndef UIP_CONF_ND6_MAX_DEFROUTERS #ifndef UIP_CONF_ND6_MAX_DEFROUTERS
/** Minimum number of default routers */ /** Minimum number of default routers */
#define UIP_CONF_ND6_MAX_DEFROUTERS 2 #define UIP_CONF_ND6_MAX_DEFROUTERS 2
#endif #endif
/** @} */ /** @} */
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
/** /**
* \defgroup uipoptudp UDP configuration options * \defgroup uipoptudp UDP configuration options
* @{ * @{
* *
* \note The UDP support in uIP is still not entirely complete; there * \note The UDP support in uIP is still not entirely complete; there
* is no support for sending or receiving broadcast or multicast * is no support for sending or receiving broadcast or multicast
* packets, but it works well enough to support a number of vital * packets, but it works well enough to support a number of vital
* applications such as DNS queries, though * applications such as DNS queries, though
*/ */
/** /**
* Toggles whether UDP support should be compiled in or not. * Toggles whether UDP support should be compiled in or not.
* *
* \hideinitializer * \hideinitializer
*/ */
#ifdef UIP_CONF_UDP #ifdef UIP_CONF_UDP
#define UIP_UDP UIP_CONF_UDP #define UIP_UDP UIP_CONF_UDP
#else /* UIP_CONF_UDP */ #else /* UIP_CONF_UDP */
#define UIP_UDP 1 #define UIP_UDP 1
#endif /* UIP_CONF_UDP */ #endif /* UIP_CONF_UDP */
/** /**
* Toggles if UDP checksums should be used or not. * Toggles if UDP checksums should be used or not.
* *
* \note Support for UDP checksums is currently not included in uIP, * \note Support for UDP checksums is currently not included in uIP,
* so this option has no function. * so this option has no function.
* *
* \hideinitializer * \hideinitializer
*/ */
#ifdef UIP_CONF_UDP_CHECKSUMS #ifdef UIP_CONF_UDP_CHECKSUMS
#define UIP_UDP_CHECKSUMS UIP_CONF_UDP_CHECKSUMS #define UIP_UDP_CHECKSUMS UIP_CONF_UDP_CHECKSUMS
#else #else
#define UIP_UDP_CHECKSUMS 0 #define UIP_UDP_CHECKSUMS 0
#endif #endif
/** /**
* The maximum amount of concurrent UDP connections. * The maximum amount of concurrent UDP connections.
* *
* \hideinitializer * \hideinitializer
*/ */
#ifdef UIP_CONF_UDP_CONNS #ifdef UIP_CONF_UDP_CONNS
#define UIP_UDP_CONNS UIP_CONF_UDP_CONNS #define UIP_UDP_CONNS UIP_CONF_UDP_CONNS
#else /* UIP_CONF_UDP_CONNS */ #else /* UIP_CONF_UDP_CONNS */
#define UIP_UDP_CONNS 10 #define UIP_UDP_CONNS 10
#endif /* UIP_CONF_UDP_CONNS */ #endif /* UIP_CONF_UDP_CONNS */
/** /**
* The name of the function that should be called when UDP datagrams arrive. * The name of the function that should be called when UDP datagrams arrive.
* *
* \hideinitializer * \hideinitializer
*/ */
/** @} */ /** @} */
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
/** /**
* \defgroup uipopttcp TCP configuration options * \defgroup uipopttcp TCP configuration options
* @{ * @{
*/ */
/** /**
* Toggles whether UDP support should be compiled in or not. * Toggles whether UDP support should be compiled in or not.
* *
* \hideinitializer * \hideinitializer
*/ */
#ifdef UIP_CONF_TCP #ifdef UIP_CONF_TCP
#define UIP_TCP UIP_CONF_TCP #define UIP_TCP UIP_CONF_TCP
#else /* UIP_CONF_UDP */ #else /* UIP_CONF_UDP */
#define UIP_TCP 1 #define UIP_TCP 1
#endif /* UIP_CONF_UDP */ #endif /* UIP_CONF_UDP */
/** /**
* Determines if support for opening connections from uIP should be * Determines if support for opening connections from uIP should be
* compiled in. * compiled in.
* *
* If the applications that are running on top of uIP for this project * If the applications that are running on top of uIP for this project
* do not need to open outgoing TCP connections, this configuration * do not need to open outgoing TCP connections, this configuration
* option can be turned off to reduce the code size of uIP. * option can be turned off to reduce the code size of uIP.
* *
* \hideinitializer * \hideinitializer
*/ */
#ifndef UIP_CONF_ACTIVE_OPEN #ifndef UIP_CONF_ACTIVE_OPEN
#define UIP_ACTIVE_OPEN 1 #define UIP_ACTIVE_OPEN 1
#else /* UIP_CONF_ACTIVE_OPEN */ #else /* UIP_CONF_ACTIVE_OPEN */
#define UIP_ACTIVE_OPEN UIP_CONF_ACTIVE_OPEN #define UIP_ACTIVE_OPEN UIP_CONF_ACTIVE_OPEN
#endif /* UIP_CONF_ACTIVE_OPEN */ #endif /* UIP_CONF_ACTIVE_OPEN */
/** /**
* The maximum number of simultaneously open TCP connections. * The maximum number of simultaneously open TCP connections.
* *
* Since the TCP connections are statically allocated, turning this * Since the TCP connections are statically allocated, turning this
* configuration knob down results in less RAM used. Each TCP * configuration knob down results in less RAM used. Each TCP
* connection requires approximately 30 bytes of memory. * connection requires approximately 30 bytes of memory.
* *
* \hideinitializer * \hideinitializer
*/ */
#ifndef UIP_CONF_MAX_CONNECTIONS #ifndef UIP_CONF_MAX_CONNECTIONS
#define UIP_CONNS 10 #define UIP_CONNS 10
#else /* UIP_CONF_MAX_CONNECTIONS */ #else /* UIP_CONF_MAX_CONNECTIONS */
#define UIP_CONNS UIP_CONF_MAX_CONNECTIONS #define UIP_CONNS UIP_CONF_MAX_CONNECTIONS
#endif /* UIP_CONF_MAX_CONNECTIONS */ #endif /* UIP_CONF_MAX_CONNECTIONS */
/** /**
* The maximum number of simultaneously listening TCP ports. * The maximum number of simultaneously listening TCP ports.
* *
* Each listening TCP port requires 2 bytes of memory. * Each listening TCP port requires 2 bytes of memory.
* *
* \hideinitializer * \hideinitializer
*/ */
#ifndef UIP_CONF_MAX_LISTENPORTS #ifndef UIP_CONF_MAX_LISTENPORTS
#define UIP_LISTENPORTS 20 #define UIP_LISTENPORTS 20
#else /* UIP_CONF_MAX_LISTENPORTS */ #else /* UIP_CONF_MAX_LISTENPORTS */
#define UIP_LISTENPORTS UIP_CONF_MAX_LISTENPORTS #define UIP_LISTENPORTS UIP_CONF_MAX_LISTENPORTS
#endif /* UIP_CONF_MAX_LISTENPORTS */ #endif /* UIP_CONF_MAX_LISTENPORTS */
/** /**
* Determines if support for TCP urgent data notification should be * Determines if support for TCP urgent data notification should be
* compiled in. * compiled in.
* *
* Urgent data (out-of-band data) is a rarely used TCP feature that * Urgent data (out-of-band data) is a rarely used TCP feature that
* very seldom would be required. * very seldom would be required.
* *
* \hideinitializer * \hideinitializer
*/ */
#if !defined(UIP_URGDATA) #if !defined(UIP_URGDATA)
#define UIP_URGDATA 0 #define UIP_URGDATA 0
#endif #endif
/** /**
* The initial retransmission timeout counted in timer pulses. * The initial retransmission timeout counted in timer pulses.
* *
* This should not be changed. * This should not be changed.
*/ */
#if !defined(UIP_RTO) #if !defined(UIP_RTO)
#define UIP_RTO 3 #define UIP_RTO 3
#endif #endif
/** /**
* The maximum number of times a segment should be retransmitted * The maximum number of times a segment should be retransmitted
* before the connection should be aborted. * before the connection should be aborted.
* *
* This should not be changed. * This should not be changed.
*/ */
#if !defined(UIP_MAXRTX) #if !defined(UIP_MAXRTX)
#define UIP_MAXRTX 8 #define UIP_MAXRTX 8
#endif #endif
/** /**
* The maximum number of times a SYN segment should be retransmitted * The maximum number of times a SYN segment should be retransmitted
* before a connection request should be deemed to have been * before a connection request should be deemed to have been
* unsuccessful. * unsuccessful.
* *
* This should not need to be changed. * This should not need to be changed.
*/ */
#if !defined(UIP_MAXSYNRTX) #if !defined(UIP_MAXSYNRTX)
#define UIP_MAXSYNRTX 5 #define UIP_MAXSYNRTX 5
#endif #endif
/** /**
* The TCP maximum segment size. * The TCP maximum segment size.
* *
* This is should not be to set to more than * This is should not be to set to more than
* UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN. * UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN.
*/ */
#ifdef UIP_CONF_TCP_MSS #ifdef UIP_CONF_TCP_MSS
#define UIP_TCP_MSS UIP_CONF_TCP_MSS #define UIP_TCP_MSS UIP_CONF_TCP_MSS
#else #else
#define UIP_TCP_MSS (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN) #define UIP_TCP_MSS (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN)
#endif #endif
/** /**
* The size of the advertised receiver's window. * The size of the advertised receiver's window.
* *
* Should be set low (i.e., to the size of the uip_buf buffer) if the * Should be set low (i.e., to the size of the uip_buf buffer) if the
* application is slow to process incoming data, or high (32768 bytes) * application is slow to process incoming data, or high (32768 bytes)
* if the application processes data quickly. * if the application processes data quickly.
* *
* \hideinitializer * \hideinitializer
*/ */
#ifndef UIP_CONF_RECEIVE_WINDOW #ifndef UIP_CONF_RECEIVE_WINDOW
#define UIP_RECEIVE_WINDOW UIP_TCP_MSS #define UIP_RECEIVE_WINDOW UIP_TCP_MSS
#else #else
#define UIP_RECEIVE_WINDOW UIP_CONF_RECEIVE_WINDOW #define UIP_RECEIVE_WINDOW UIP_CONF_RECEIVE_WINDOW
#endif #endif
/** /**
* How long a connection should stay in the TIME_WAIT state. * How long a connection should stay in the TIME_WAIT state.
* *
* This configuration option has no real implication, and it should be * This configuration option has no real implication, and it should be
* left untouched. * left untouched.
*/ */
#define UIP_TIME_WAIT_TIMEOUT 120 #define UIP_TIME_WAIT_TIMEOUT 120
/** @} */ /** @} */
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
/** /**
* \defgroup uipoptarp ARP configuration options * \defgroup uipoptarp ARP configuration options
* @{ * @{
*/ */
/** /**
* The size of the ARP table. * The size of the ARP table.
* *
* This option should be set to a larger value if this uIP node will * This option should be set to a larger value if this uIP node will
* have many connections from the local network. * have many connections from the local network.
* *
* \hideinitializer * \hideinitializer
*/ */
#ifdef UIP_CONF_ARPTAB_SIZE #ifdef UIP_CONF_ARPTAB_SIZE
#define UIP_ARPTAB_SIZE UIP_CONF_ARPTAB_SIZE #define UIP_ARPTAB_SIZE UIP_CONF_ARPTAB_SIZE
#else #else
#define UIP_ARPTAB_SIZE 8 #define UIP_ARPTAB_SIZE 8
#endif #endif
/** /**
* The maximum age of ARP table entries measured in 10ths of seconds. * The maximum age of ARP table entries measured in 10ths of seconds.
* *
* An UIP_ARP_MAXAGE of 120 corresponds to 20 minutes (BSD * An UIP_ARP_MAXAGE of 120 corresponds to 20 minutes (BSD
* default). * default).
*/ */
#define UIP_ARP_MAXAGE 120 #define UIP_ARP_MAXAGE 120
/** @} */ /** @} */
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
/** /**
* \defgroup uipoptmac layer 2 options (for ipv6) * \defgroup uipoptmac layer 2 options (for ipv6)
* @{ * @{
*/ */
#define UIP_DEFAULT_PREFIX_LEN 64 #define UIP_DEFAULT_PREFIX_LEN 64
/** @} */ /** @} */
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
/** /**
* \defgroup uipoptsics 6lowpan options (for ipv6) * \defgroup uipoptsics 6lowpan options (for ipv6)
* @{ * @{
*/ */
/** /**
* Timeout for packet reassembly at the 6lowpan layer * Timeout for packet reassembly at the 6lowpan layer
* (should be < 60s) * (should be < 60s)
*/ */
#ifdef SICSLOWPAN_CONF_MAXAGE #ifdef SICSLOWPAN_CONF_MAXAGE
#define SICSLOWPAN_REASS_MAXAGE SICSLOWPAN_CONF_MAXAGE #define SICSLOWPAN_REASS_MAXAGE SICSLOWPAN_CONF_MAXAGE
#else #else
#define SICSLOWPAN_REASS_MAXAGE 20 #define SICSLOWPAN_REASS_MAXAGE 20
#endif #endif
/** /**
* Do we compress the IP header or not (default: no) * Do we compress the IP header or not (default: no)
*/ */
#ifndef SICSLOWPAN_CONF_COMPRESSION #ifndef SICSLOWPAN_CONF_COMPRESSION
#define SICSLOWPAN_CONF_COMPRESSION 0 #define SICSLOWPAN_CONF_COMPRESSION 0
#endif #endif
/** /**
* If we use IPHC compression, how many address contexts do we support * If we use IPHC compression, how many address contexts do we support
*/ */
#ifndef SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS #ifndef SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS
#define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS 1 #define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS 1
#endif #endif
/** /**
* Do we support 6lowpan fragmentation * Do we support 6lowpan fragmentation
*/ */
#ifndef SICSLOWPAN_CONF_FRAG #ifndef SICSLOWPAN_CONF_FRAG
#define SICSLOWPAN_CONF_FRAG 0 #define SICSLOWPAN_CONF_FRAG 0
#endif #endif
/** @} */ /** @} */
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
/** /**
* \defgroup uipoptgeneral General configuration options * \defgroup uipoptgeneral General configuration options
* @{ * @{
*/ */
/** /**
* The size of the uIP packet buffer. * The size of the uIP packet buffer.
* *
* The uIP packet buffer should not be smaller than 60 bytes, and does * The uIP packet buffer should not be smaller than 60 bytes, and does
* not need to be larger than 1514 bytes. Lower size results in lower * not need to be larger than 1514 bytes. Lower size results in lower
* TCP throughput, larger size results in higher TCP throughput. * TCP throughput, larger size results in higher TCP throughput.
* *
* \hideinitializer * \hideinitializer
*/ */
#ifndef UIP_CONF_BUFFER_SIZE #ifndef UIP_CONF_BUFFER_SIZE
#define UIP_BUFSIZE UIP_LINK_MTU + UIP_LLH_LEN #define UIP_BUFSIZE UIP_LINK_MTU + UIP_LLH_LEN
#else /* UIP_CONF_BUFFER_SIZE */ #else /* UIP_CONF_BUFFER_SIZE */
#define UIP_BUFSIZE UIP_CONF_BUFFER_SIZE #define UIP_BUFSIZE UIP_CONF_BUFFER_SIZE
#endif /* UIP_CONF_BUFFER_SIZE */ #endif /* UIP_CONF_BUFFER_SIZE */
/** /**
* Determines if statistics support should be compiled in. * Determines if statistics support should be compiled in.
* *
* The statistics is useful for debugging and to show the user. * The statistics is useful for debugging and to show the user.
* *
* \hideinitializer * \hideinitializer
*/ */
#ifndef UIP_CONF_STATISTICS #ifndef UIP_CONF_STATISTICS
#define UIP_STATISTICS 0 #define UIP_STATISTICS 0
#else /* UIP_CONF_STATISTICS */ #else /* UIP_CONF_STATISTICS */
#define UIP_STATISTICS UIP_CONF_STATISTICS #define UIP_STATISTICS UIP_CONF_STATISTICS
#endif /* UIP_CONF_STATISTICS */ #endif /* UIP_CONF_STATISTICS */
/** /**
* Determines if logging of certain events should be compiled in. * Determines if logging of certain events should be compiled in.
* *
* This is useful mostly for debugging. The function uip_log() * This is useful mostly for debugging. The function uip_log()
* must be implemented to suit the architecture of the project, if * must be implemented to suit the architecture of the project, if
* logging is turned on. * logging is turned on.
* *
* \hideinitializer * \hideinitializer
*/ */
#ifndef UIP_CONF_LOGGING #ifndef UIP_CONF_LOGGING
#define UIP_LOGGING 0 #define UIP_LOGGING 0
#else /* UIP_CONF_LOGGING */ #else /* UIP_CONF_LOGGING */
#define UIP_LOGGING UIP_CONF_LOGGING #define UIP_LOGGING UIP_CONF_LOGGING
#endif /* UIP_CONF_LOGGING */ #endif /* UIP_CONF_LOGGING */
/** /**
* Broadcast support. * Broadcast support.
* *
* This flag configures IP broadcast support. This is useful only * This flag configures IP broadcast support. This is useful only
* together with UDP. * together with UDP.
* *
* \hideinitializer * \hideinitializer
* *
*/ */
#ifndef UIP_CONF_BROADCAST #ifndef UIP_CONF_BROADCAST
#define UIP_BROADCAST 0 #define UIP_BROADCAST 0
#else /* UIP_CONF_BROADCAST */ #else /* UIP_CONF_BROADCAST */
#define UIP_BROADCAST UIP_CONF_BROADCAST #define UIP_BROADCAST UIP_CONF_BROADCAST
#endif /* UIP_CONF_BROADCAST */ #endif /* UIP_CONF_BROADCAST */
/** /**
* Print out a uIP log message. * Print out a uIP log message.
* *
* This function must be implemented by the module that uses uIP, and * This function must be implemented by the module that uses uIP, and
* is called by uIP whenever a log message is generated. * is called by uIP whenever a log message is generated.
*/ */
void uip_log(char *msg); void uip_log(char *msg);
/** /**
* The link level header length. * The link level header length.
* *
* This is the offset into the uip_buf where the IP header can be * This is the offset into the uip_buf where the IP header can be
* found. For Ethernet, this should be set to 14. For SLIP, this * found. For Ethernet, this should be set to 14. For SLIP, this
* should be set to 0. * should be set to 0.
* *
* \note we probably won't use this constant for other link layers than * \note we probably won't use this constant for other link layers than
* ethernet as they have variable header length (this is due to variable * ethernet as they have variable header length (this is due to variable
* number and type of address fields and to optional security features) * number and type of address fields and to optional security features)
* E.g.: 802.15.4 -> 2 + (1/2*4/8) + 0/5/6/10/14 * E.g.: 802.15.4 -> 2 + (1/2*4/8) + 0/5/6/10/14
* 802.11 -> 4 + (6*3/4) + 2 * 802.11 -> 4 + (6*3/4) + 2
* \hideinitializer * \hideinitializer
*/ */
#ifdef UIP_CONF_LLH_LEN #ifdef UIP_CONF_LLH_LEN
#define UIP_LLH_LEN UIP_CONF_LLH_LEN #define UIP_LLH_LEN UIP_CONF_LLH_LEN
#else /* UIP_LLH_LEN */ #else /* UIP_LLH_LEN */
#define UIP_LLH_LEN 14 #define UIP_LLH_LEN 14
#endif /* UIP_CONF_LLH_LEN */ #endif /* UIP_CONF_LLH_LEN */
/** @} */ /** @} */
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
/** /**
* \defgroup uipoptcpu CPU architecture configuration * \defgroup uipoptcpu CPU architecture configuration
* @{ * @{
* *
* The CPU architecture configuration is where the endianess of the * The CPU architecture configuration is where the endianess of the
* CPU on which uIP is to be run is specified. Most CPUs today are * CPU on which uIP is to be run is specified. Most CPUs today are
* little endian, and the most notable exception are the Motorolas * little endian, and the most notable exception are the Motorolas
* which are big endian. The BYTE_ORDER macro should be changed to * which are big endian. The BYTE_ORDER macro should be changed to
* reflect the CPU architecture on which uIP is to be run. * reflect the CPU architecture on which uIP is to be run.
*/ */
/** /**
* The byte order of the CPU architecture on which uIP is to be run. * The byte order of the CPU architecture on which uIP is to be run.
* *
* This option can be either UIP_BIG_ENDIAN (Motorola byte order) or * This option can be either UIP_BIG_ENDIAN (Motorola byte order) or
* UIP_LITTLE_ENDIAN (Intel byte order). * UIP_LITTLE_ENDIAN (Intel byte order).
* *
* \hideinitializer * \hideinitializer
*/ */
#ifdef UIP_CONF_BYTE_ORDER #ifdef UIP_CONF_BYTE_ORDER
#define UIP_BYTE_ORDER UIP_CONF_BYTE_ORDER #define UIP_BYTE_ORDER UIP_CONF_BYTE_ORDER
#else /* UIP_CONF_BYTE_ORDER */ #else /* UIP_CONF_BYTE_ORDER */
#define UIP_BYTE_ORDER UIP_LITTLE_ENDIAN #define UIP_BYTE_ORDER UIP_LITTLE_ENDIAN
#endif /* UIP_CONF_BYTE_ORDER */ #endif /* UIP_CONF_BYTE_ORDER */
/** @} */ /** @} */
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
#include <ff.h> #include <ff.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "timer.h" #include "timer.h"
typedef uint8_t u8_t; typedef uint8_t u8_t;
typedef uint16_t u16_t; typedef uint16_t u16_t;
typedef uint32_t u32_t; typedef uint32_t u32_t;
typedef uint32_t uip_stats_t; typedef uint32_t uip_stats_t;
/** /**
* \defgroup uipoptapp Application specific configurations * \defgroup uipoptapp Application specific configurations
* @{ * @{
* *
* An uIP application is implemented using a single application * An uIP application is implemented using a single application
* function that is called by uIP whenever a TCP/IP event occurs. The * function that is called by uIP whenever a TCP/IP event occurs. The
* name of this function must be registered with uIP at compile time * name of this function must be registered with uIP at compile time
* using the UIP_APPCALL definition. * using the UIP_APPCALL definition.
* *
* uIP applications can store the application state within the * uIP applications can store the application state within the
* uip_conn structure by specifying the type of the application * uip_conn structure by specifying the type of the application
* structure by typedef:ing the type uip_tcp_appstate_t and uip_udp_appstate_t. * structure by typedef:ing the type uip_tcp_appstate_t and uip_udp_appstate_t.
* *
* The file containing the definitions must be included in the * The file containing the definitions must be included in the
* uipopt.h file. * uipopt.h file.
* *
* The following example illustrates how this can look. * The following example illustrates how this can look.
\code \code
void httpd_appcall(void); void httpd_appcall(void);
#define UIP_APPCALL httpd_appcall #define UIP_APPCALL httpd_appcall
struct httpd_state { struct httpd_state {
u8_t state; u8_t state;
u16_t count; u16_t count;
char *dataptr; char *dataptr;
char *script; char *script;
}; };
typedef struct httpd_state uip_tcp_appstate_t typedef struct httpd_state uip_tcp_appstate_t
\endcode \endcode
*/ */
#define UIP_UDP_APPCALL uIPManagement_UDPCallback #define UIP_UDP_APPCALL uIPManagement_UDPCallback
void UIP_UDP_APPCALL(void); void UIP_UDP_APPCALL(void);
/** /**
* \var #define UIP_APPCALL * \var #define UIP_APPCALL
* *
* The name of the application function that uIP should call in * The name of the application function that uIP should call in
* response to TCP/IP events. * response to TCP/IP events.
* *
*/ */
#define UIP_APPCALL uIPManagement_TCPCallback #define UIP_APPCALL uIPManagement_TCPCallback
void UIP_APPCALL(void); void UIP_APPCALL(void);
/** /**
* \var typedef uip_tcp_appstate_t * \var typedef uip_tcp_appstate_t
* *
* The type of the application state that is to be stored in the * The type of the application state that is to be stored in the
* uip_conn structure. This usually is typedef:ed to a struct holding * uip_conn structure. This usually is typedef:ed to a struct holding
* application state information. * application state information.
*/ */
typedef union typedef union
{ {
struct struct
{ {
uint8_t CurrentState; uint8_t CurrentState;
uint8_t NextState; uint8_t NextState;
char FileName[MAX_URI_LENGTH]; char FileName[MAX_URI_LENGTH];
FIL FileHandle; FIL FileHandle;
bool FileOpen; bool FileOpen;
uint32_t ACKedFilePos; uint32_t ACKedFilePos;
uint16_t SentChunkSize; uint16_t SentChunkSize;
} HTTPServer; } HTTPServer;
struct struct
{ {
uint8_t CurrentState; uint8_t CurrentState;
uint8_t NextState; uint8_t NextState;
uint8_t IssuedCommand; uint8_t IssuedCommand;
} TELNETServer; } TELNETServer;
} uip_tcp_appstate_t; } uip_tcp_appstate_t;
/** /**
* \var typedef uip_udp_appstate_t * \var typedef uip_udp_appstate_t
* *
* The type of the application state that is to be stored in the * The type of the application state that is to be stored in the
* uip_conn structure. This usually is typedef:ed to a struct holding * uip_conn structure. This usually is typedef:ed to a struct holding
* application state information. * application state information.
*/ */
typedef union typedef union
{ {
struct struct
{ {
uint8_t CurrentState; uint8_t CurrentState;
struct timer Timeout; struct timer Timeout;
struct struct
{ {
uint8_t AllocatedIP[4]; uint8_t AllocatedIP[4];
uint8_t Netmask[4]; uint8_t Netmask[4];
uint8_t GatewayIP[4]; uint8_t GatewayIP[4];
uint8_t ServerIP[4]; uint8_t ServerIP[4];
} DHCPOffer_Data; } DHCPOffer_Data;
} DHCPClient; } DHCPClient;
} uip_udp_appstate_t; } uip_udp_appstate_t;
/** @} */ /** @} */
#endif /* __UIPOPT_H__ */ #endif /* __UIPOPT_H__ */
/** @} */ /** @} */
/** @} */ /** @} */

Loading…
Cancel
Save