Sync: merge r215141 through r215188 from ^/head.

This commit is contained in:
Dimitry Andric 2010-11-12 17:20:18 +00:00
commit 5fbbc222c8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/projects/binutils-2.17/; revision=215189
98 changed files with 3591 additions and 1406 deletions

View File

@ -14,6 +14,10 @@
# The file is partitioned: OLD_FILES first, then OLD_LIBS and OLD_DIRS last. # The file is partitioned: OLD_FILES first, then OLD_LIBS and OLD_DIRS last.
# #
# 20101112: vgonel(9) has gone to private API a while ago
OLD_FILES+=usr/share/man/man9/vgonel.9.gz
# 20101112: removed gasp.info
OLD_FILES+=usr/share/info/gasp.info.gz
# 20101109: headers moved to machine/ to x86/ # 20101109: headers moved to machine/ to x86/
.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "i386" .if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "i386"
OLD_FILES+=usr/include/machine/mptable.h OLD_FILES+=usr/include/machine/mptable.h

View File

@ -22,6 +22,13 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.x IS SLOW:
machines to maximize performance. (To disable malloc debugging, run machines to maximize performance. (To disable malloc debugging, run
ln -s aj /etc/malloc.conf.) ln -s aj /etc/malloc.conf.)
20101111:
The TCP stack has received a significant update to add support for
modularised congestion control and generally improve the clarity of
congestion control decisions. Bump __FreeBSD_version to 900025. User
space tools that rely on the size of struct tcpcb in tcp_var.h (e.g.
sockstat) need to be recompiled.
20101002: 20101002:
The man(1) utility has been replaced by a new version that no longer The man(1) utility has been replaced by a new version that no longer
uses /etc/manpath.config. Please consult man.conf(5) for how to uses /etc/manpath.config. Please consult man.conf(5) for how to

View File

@ -1,114 +0,0 @@
.\"-
.\" Copyright (c) 1991, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
.\" This code is derived from software contributed to Berkeley by
.\" Kenneth Almquist.
.\" Copyright 1989 by Kenneth Almquist
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\" 4. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" @(#)echo.1 8.2 (Berkeley) 5/4/95
.\" $FreeBSD$
.\"
.Dd May 4, 1995
.Dt ECHO 1
.Os
.Sh NAME
.Nm echo
.Nd produce message in a shell script
.Sh SYNOPSIS
.Nm
.Op Fl n | Fl e
.Ar args...
.Sh DESCRIPTION
The
.Nm
utility prints its arguments on the standard output, separated by spaces.
Unless the
.Fl n
option is present, a newline is output following the arguments.
The
.Fl e
option causes
.Nm
to treat the escape sequences specially, as described in the following
paragraph.
The
.Fl e
option is the default, and is provided solely for compatibility with
other systems.
Only one of the options
.Fl n
and
.Fl e
may be given.
.Pp
If any of the following sequences of characters is encountered during
output, the sequence is not output.
Instead, the specified action is
performed:
.Bl -tag -width indent
.It Li \eb
A backspace character is output.
.It Li \ec
Subsequent output is suppressed.
This is normally used at the end of the
last argument to suppress the trailing newline that
.Nm
would otherwise output.
.It Li \ef
Output a form feed.
.It Li \en
Output a newline character.
.It Li \er
Output a carriage return.
.It Li \et
Output a (horizontal) tab character.
.It Li \ev
Output a vertical tab.
.It Li \e0 Ns Ar digits
Output the character whose value is given by zero to three digits.
If there are zero digits, a
.Dv NUL
character is output.
.It Li \e\e
Output a backslash.
.El
.Sh HINTS
Remember that backslash is special to the shell and needs to be escaped.
To output a message to standard error, say
.Pp
.D1 echo message >&2
.Sh BUGS
The octal character escape mechanism
.Pq Li \e0 Ns Ar digits
differs from the
C language mechanism.
.Pp
There is no way to force
.Nm
to treat its arguments literally, rather than interpreting them as
options and escape sequences.

View File

@ -32,7 +32,7 @@
.\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95 .\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95
.\" $FreeBSD$ .\" $FreeBSD$
.\" .\"
.Dd October 31, 2010 .Dd November 12, 2010
.Dt SH 1 .Dt SH 1
.Os .Os
.Sh NAME .Sh NAME
@ -65,20 +65,13 @@ The
utility is the standard command interpreter for the system. utility is the standard command interpreter for the system.
The current version of The current version of
.Nm .Nm
is in the process of being changed to is close to the
conform with the .St -p1003.1
.St -p1003.2
specification for the shell. specification for the shell.
This version has many features which make It only supports features
it appear
similar in some respects to the Korn shell, but it is not a Korn
shell clone like
.Nm pdksh .
Only features
designated by designated by
.Tn POSIX , .Tn POSIX ,
plus a few Berkeley extensions, are being plus a few Berkeley extensions.
incorporated into this shell.
This man page is not intended to be a tutorial nor a complete This man page is not intended to be a tutorial nor a complete
specification of the shell. specification of the shell.
.Ss Overview .Ss Overview

View File

@ -80,10 +80,12 @@ n or # - change number of processes to display\n", stdout);
#ifdef ORDER #ifdef ORDER
if (displaymode == DISP_CPU) if (displaymode == DISP_CPU)
fputs("\ fputs("\
o - specify sort order (pri, size, res, cpu, time, threads)\n", stdout); o - specify sort order (pri, size, res, cpu, time, threads, jid)\n",
stdout);
else else
fputs("\ fputs("\
o - specify sort order (vcsw, ivcsw, read, write, fault, total)\n", stdout); o - specify sort order (vcsw, ivcsw, read, write, fault, total, jid)\n",
stdout);
#endif #endif
fputs("\ fputs("\
r - renice a process\n\ r - renice a process\n\

View File

@ -1,3 +1,114 @@
commit e45929260cd902036efd40c5610a8d0a50d5712b
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Sat Oct 23 17:25:52 2010 +0300
Build: Fix mydist rule when .git doesn't exist.
commit 6e1326fcdf6b6209949be57cfe3ad4b781b65168
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Sat Oct 23 14:15:35 2010 +0300
Add NEWS for 5.0.0.
commit b667a3ef6338a2c1db7b7706b1f6c99ea392221c
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Sat Oct 23 14:02:53 2010 +0300
Bump version to 5.0.0 and liblzma version-info to 5:0:0.
commit 8c947e9291691629714dafb4536c718b6cc24fbd
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Sat Oct 23 12:30:54 2010 +0300
liblzma: Make lzma_code() check the reserved members in lzma_stream.
If any of the reserved members in lzma_stream are non-zero
or non-NULL, LZMA_OPTIONS_ERROR is returned. It is possible
that a new feature in the future is indicated by just setting
a reserved member to some other value, so the old liblzma
version need to catch it as an unsupported feature.
commit e61d85e082743ebd2dd0ff28fc0a82482ede0538
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Sat Oct 23 12:26:33 2010 +0300
Windows: Use MinGW's stdio functions.
The non-standard ones from msvcrt.dll appear to work
most of the time with XZ Utils, but there are some
corner cases where things may go very wrong. So it's
good to use the better replacements provided by
MinGW(-w64) runtime.
commit 23e23f1dc029146714c9a98313ab3ea93d71a2fc
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Sat Oct 23 12:21:32 2010 +0300
liblzma: Use 512 as INDEX_GROUP_SIZE.
This lets compiler use shifting instead of 64-bit division.
commit 613939fc82603b75b59eee840871a05bc8dd08e0
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Sat Oct 23 12:20:11 2010 +0300
liblzma: A few ABI tweaks to reserve space in structures.
commit 68b83f252df3d27480a9f6f03445d16f6506fef1
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Thu Oct 21 23:16:11 2010 +0300
xz: Make sure that message_strm() can never return NULL.
commit d09c5753e33ff96ee57edb6d1e98e34041203695
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Thu Oct 21 23:06:31 2010 +0300
liblzma: Update the comments in the API headers.
Adding support for LZMA_FINISH for Index encoding and
decoding needed tiny additions to the relevant .c files too.
commit 33c1c0e102eb529588503b8beea0903a45488fad
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Tue Oct 19 12:08:30 2010 +0300
Update INSTALL.generic.
commit 0076e03641f201c4b77dddd5a6db5880be19a78c
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Tue Oct 19 11:44:37 2010 +0300
Clean up a few FIXMEs and TODOs.
lzma_chunk_size() was commented out because it is
currently useless.
commit ce34ec4f54ff8b753da236f371ad8dd23c8135c9
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Tue Oct 19 10:21:08 2010 +0300
Update docs.
commit f0fa880d247e73264d2c04fe31fb3412318a0026
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Tue Oct 12 15:13:30 2010 +0300
xz: Avoid raise() also on OpenVMS.
This is similar to DOS/DJGPP that killing the program
with a signal will print a backtrace or a similar message.
commit ac462b1c47c451f5c62e428306314c4bdad8ae7f
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Mon Oct 11 21:26:19 2010 +0300
xz: Avoid SA_RESTART for portability reasons.
SA_RESTART is not as portable as I had hoped. It's missing
at least from OpenVMS, QNX, and DJGPP). Luckily we can do
fine without SA_RESTART.
commit d52b411716a614c202e89ba732492efb9916cd3f commit d52b411716a614c202e89ba732492efb9916cd3f
Author: Lasse Collin <lasse.collin@tukaani.org> Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Sun Oct 10 17:58:58 2010 +0300 Date: Sun Oct 10 17:58:58 2010 +0300

View File

@ -18,15 +18,20 @@ Known bugs
XZ Utils compress some files significantly worse than LZMA Utils. XZ Utils compress some files significantly worse than LZMA Utils.
This is due to faster compression presets used by XZ Utils, and This is due to faster compression presets used by XZ Utils, and
can be worked around by using "xz --extreme". However, the presets can often be worked around by using "xz --extreme". With some files
need some tweaking and maybe this issue can be minimized without --extreme isn't enough though: it's most likely with files that
making the typical case too much slower. compress extremely well, so going from compression ratio of 0.003
to 0.004 means big relative increase in the compressed file size.
xz doesn't quote unprintable characters when it displays file names xz doesn't quote unprintable characters when it displays file names
given on the command line. given on the command line.
tuklib_exit() doesn't block signals => EINTR is possible. tuklib_exit() doesn't block signals => EINTR is possible.
SIGTSTP is not handled. If xz is stopped, the estimated remaining
time and calculated (de)compression speed won't make sense in the
progress indicator (xz --verbose).
Missing features Missing features
---------------- ----------------
@ -41,11 +46,13 @@ Missing features
Buffer-to-buffer coding could use less RAM (especially when Buffer-to-buffer coding could use less RAM (especially when
decompressing LZMA1 or LZMA2). decompressing LZMA1 or LZMA2).
I/O library is not implemented. It will possibly be named libzzf. I/O library is not implemented (similar to gzopen() in zlib).
It will be a separate library that supports uncompressed, .gz,
.bz2, .lzma, and .xz files.
lzma_strerror() to convert lzma_ret to human readable form? lzma_strerror() to convert lzma_ret to human readable form?
This is tricky, because the same error codes are used with This is tricky, because the same error codes are used with
slightly different meanings. slightly different meanings, and this cannot be fixed anymore.
Documentation Documentation

View File

@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: xz-utils\n" "Project-Id-Version: xz-utils\n"
"Report-Msgid-Bugs-To: lasse.collin@tukaani.org\n" "Report-Msgid-Bugs-To: lasse.collin@tukaani.org\n"
"POT-Creation-Date: 2010-09-17 18:33+0200\n" "POT-Creation-Date: 2010-10-23 17:48+0300\n"
"PO-Revision-Date: 2010-09-17 18:54+0200\n" "PO-Revision-Date: 2010-09-17 18:54+0200\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n" "Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: Czech <diskuze@lists.l10n.cz>\n" "Language-Team: Czech <diskuze@lists.l10n.cz>\n"
@ -30,8 +30,7 @@ msgstr "%s: Neznámý typ kontroly integrity"
#: src/xz/args.c:382 #: src/xz/args.c:382
msgid "Only one file can be specified with `--files' or `--files0'." msgid "Only one file can be specified with `--files' or `--files0'."
msgstr "" msgstr "Spolu s přepínači „--files“ nebo „--files0“ může být zadán pouze jeden soubor"
"Spolu s přepínači „--files“ nebo „--files0“ může být zadán pouze jeden soubor"
#: src/xz/args.c:445 #: src/xz/args.c:445
#, c-format #, c-format
@ -52,8 +51,7 @@ msgstr "Použití přednastavení v režimu raw je nevhodné."
#: src/xz/coder.c:131 #: src/xz/coder.c:131
msgid "The exact options of the presets may vary between software versions." msgid "The exact options of the presets may vary between software versions."
msgstr "" msgstr "Přesné volby u přednastavení se mohou lišit mezi různými verzemi softwaru."
"Přesné volby u přednastavení se mohou lišit mezi různými verzemi softwaru."
#: src/xz/coder.c:157 #: src/xz/coder.c:157
msgid "The .lzma format supports only the LZMA1 filter" msgid "The .lzma format supports only the LZMA1 filter"
@ -74,12 +72,8 @@ msgstr "Dekomprimace bude vyžadovat %s MiB paměti."
#: src/xz/coder.c:247 #: src/xz/coder.c:247
#, c-format #, c-format
msgid "" msgid "Adjusted LZMA%c dictionary size from %s MiB to %s MiB to not exceed the memory usage limit of %s MiB"
"Adjusted LZMA%c dictionary size from %s MiB to %s MiB to not exceed the " msgstr "Přizpůsobit velikost slovníku LZMA%c z %s MiB na %s MiB, tak aby nebylo překročeno omezení použitelné paměti %s MiB"
"memory usage limit of %s MiB"
msgstr ""
"Přizpůsobit velikost slovníku LZMA%c z %s MiB na %s MiB, tak aby nebylo "
"překročeno omezení použitelné paměti %s MiB"
#. TRANSLATORS: When compression or decompression finishes, #. TRANSLATORS: When compression or decompression finishes,
#. and xz is going to remove the source file, xz first checks #. and xz is going to remove the source file, xz first checks
@ -159,8 +153,7 @@ msgstr "%s: Selhalo zavření souboru: %s"
#: src/xz/file_io.c:762 src/xz/file_io.c:946 #: src/xz/file_io.c:762 src/xz/file_io.c:946
#, c-format #, c-format
msgid "%s: Seeking failed when trying to create a sparse file: %s" msgid "%s: Seeking failed when trying to create a sparse file: %s"
msgstr "" msgstr "%s: Selhalo nastavení pozice při pokusu o vytvoření záložního souboru: %s"
"%s: Selhalo nastavení pozice při pokusu o vytvoření záložního souboru: %s"
#: src/xz/file_io.c:821 #: src/xz/file_io.c:821
#, c-format #, c-format
@ -319,12 +312,10 @@ msgstr " Zarovnání proudu: %s\n"
#: src/xz/list.c:693 #: src/xz/list.c:693
msgid "" msgid ""
" Streams:\n" " Streams:\n"
" Stream Blocks CompOffset UncompOffset CompSize " " Stream Blocks CompOffset UncompOffset CompSize UncompSize Ratio Check Padding"
"UncompSize Ratio Check Padding"
msgstr "" msgstr ""
" Proudy:\n" " Proudy:\n"
" Proud Bloky KomprPozice NekomprPozice KomprVelikost " " Proud Bloky KomprPozice NekomprPozice KomprVelikost NekomprVelikost Poměr Kontrola Zarovnání"
"NekomprVelikost Poměr Kontrola Zarovnání"
#. TRANSLATORS: The second line is column headings. All #. TRANSLATORS: The second line is column headings. All
#. except Check are right aligned; Check is left aligned. #. except Check are right aligned; Check is left aligned.
@ -332,12 +323,10 @@ msgstr ""
#, c-format #, c-format
msgid "" msgid ""
" Blocks:\n" " Blocks:\n"
" Stream Block CompOffset UncompOffset TotalSize " " Stream Block CompOffset UncompOffset TotalSize UncompSize Ratio Check"
"UncompSize Ratio Check"
msgstr "" msgstr ""
" Bloky:\n" " Bloky:\n"
" Proud Blok KomprPozice NekomprPozice CelkVelikost " " Proud Blok KomprPozice NekomprPozice CelkVelikost NekomprVelikost Poměr Kontrola"
"NekomprVelikost Poměr Kontrola"
#. TRANSLATORS: These are additional column headings #. TRANSLATORS: These are additional column headings
#. for the most verbose listing mode. CheckVal #. for the most verbose listing mode. CheckVal
@ -408,78 +397,69 @@ msgstr "%s: Neočekávaný konec vstupu při čtení názvů souborů"
#: src/xz/main.c:120 #: src/xz/main.c:120
#, c-format #, c-format
msgid "" msgid "%s: Null character found when reading filenames; maybe you meant to use `--files0' instead of `--files'?"
"%s: Null character found when reading filenames; maybe you meant to use `--" msgstr "%s: Byl nalezen nulový znak při čtení názvů souborů; nechtěli jste náhodou použít „--files0“ místo „--files“?"
"files0' instead of `--files'?"
msgstr ""
"%s: Byl nalezen nulový znak při čtení názvů souborů; nechtěli jste náhodou "
"použít „--files0“ místo „--files“?"
#: src/xz/main.c:174 #: src/xz/main.c:174
msgid "Compression and decompression with --robot are not supported yet." msgid "Compression and decompression with --robot are not supported yet."
msgstr "Komprimace a dekomprimace s přepínačem --robot není zatím podporovaná." msgstr "Komprimace a dekomprimace s přepínačem --robot není zatím podporovaná."
#: src/xz/main.c:231 #: src/xz/main.c:231
msgid "" msgid "Cannot read data from standard input when reading filenames from standard input"
"Cannot read data from standard input when reading filenames from standard " msgstr "Ze standardního vstupu nelze číst data, když se ze standardního vstupu načítají názvy souborů"
"input"
msgstr ""
"Ze standardního vstupu nelze číst data, když se ze standardního vstupu "
"načítají názvy souborů"
#: src/xz/message.c:800 src/xz/message.c:844 #: src/xz/message.c:792 src/xz/message.c:842
msgid "Internal error (bug)" msgid "Internal error (bug)"
msgstr "Interní chyba" msgstr "Interní chyba"
#: src/xz/message.c:807 #: src/xz/message.c:799
msgid "Cannot establish signal handlers" msgid "Cannot establish signal handlers"
msgstr "Nelze ustanovit ovladač signálu" msgstr "Nelze ustanovit ovladač signálu"
#: src/xz/message.c:816 #: src/xz/message.c:808
msgid "No integrity check; not verifying file integrity" msgid "No integrity check; not verifying file integrity"
msgstr "Žádná kontrola integrity; integrita souboru se nebude ověřovat" msgstr "Žádná kontrola integrity; integrita souboru se nebude ověřovat"
#: src/xz/message.c:819 #: src/xz/message.c:811
msgid "Unsupported type of integrity check; not verifying file integrity" msgid "Unsupported type of integrity check; not verifying file integrity"
msgstr "" msgstr "Nepodporovaný typ kontroly integrity; integrita souboru se nebude ověřovat"
"Nepodporovaný typ kontroly integrity; integrita souboru se nebude ověřovat"
#: src/xz/message.c:826 #: src/xz/message.c:818
msgid "Memory usage limit reached" msgid "Memory usage limit reached"
msgstr "Dosaženo omezení použitelné paměti" msgstr "Dosaženo omezení použitelné paměti"
#: src/xz/message.c:829 #: src/xz/message.c:821
msgid "File format not recognized" msgid "File format not recognized"
msgstr "Formát souboru nebyl rozpoznán" msgstr "Formát souboru nebyl rozpoznán"
#: src/xz/message.c:832 #: src/xz/message.c:824
msgid "Unsupported options" msgid "Unsupported options"
msgstr "Nepodporovaná volba" msgstr "Nepodporovaná volba"
#: src/xz/message.c:835 #: src/xz/message.c:827
msgid "Compressed data is corrupt" msgid "Compressed data is corrupt"
msgstr "Komprimovaná data jsou poškozená" msgstr "Komprimovaná data jsou poškozená"
#: src/xz/message.c:838 #: src/xz/message.c:830
msgid "Unexpected end of input" msgid "Unexpected end of input"
msgstr "Neočekávaný konec vstupu" msgstr "Neočekávaný konec vstupu"
#: src/xz/message.c:886 #: src/xz/message.c:881
#, c-format #, c-format
msgid "%s MiB of memory is required. The limit is %s." msgid "%s MiB of memory is required. The limit is %s."
msgstr "Je vyžadováno %s MiB paměti. Limit je %s." msgstr "Je vyžadováno %s MiB paměti. Limit je %s."
#: src/xz/message.c:1053 #: src/xz/message.c:1048
#, c-format #, c-format
msgid "%s: Filter chain: %s\n" msgid "%s: Filter chain: %s\n"
msgstr "%s: Omezující filtr: %s\n" msgstr "%s: Omezující filtr: %s\n"
#: src/xz/message.c:1063 #: src/xz/message.c:1058
#, c-format #, c-format
msgid "Try `%s --help' for more information." msgid "Try `%s --help' for more information."
msgstr "Zkuste „%s --help“ pro více informací" msgstr "Zkuste „%s --help“ pro více informací"
#: src/xz/message.c:1089 #: src/xz/message.c:1084
#, c-format #, c-format
msgid "" msgid ""
"Usage: %s [OPTION]... [FILE]...\n" "Usage: %s [OPTION]... [FILE]...\n"
@ -490,18 +470,15 @@ msgstr ""
"Komprimuje nebo dekomprimuje SOUBORy ve formátu xz.\n" "Komprimuje nebo dekomprimuje SOUBORy ve formátu xz.\n"
"\n" "\n"
#: src/xz/message.c:1096 #: src/xz/message.c:1091
msgid "" msgid "Mandatory arguments to long options are mandatory for short options too.\n"
"Mandatory arguments to long options are mandatory for short options too.\n" msgstr "Povinné argumenty pro dlouhé přepínače jsou povinné rovněž pro krátké přepínače.\n"
msgstr ""
"Povinné argumenty pro dlouhé přepínače jsou povinné rovněž pro krátké "
"přepínače.\n"
#: src/xz/message.c:1100 #: src/xz/message.c:1095
msgid " Operation mode:\n" msgid " Operation mode:\n"
msgstr "Operační režim:\n" msgstr "Operační režim:\n"
#: src/xz/message.c:1103 #: src/xz/message.c:1098
msgid "" msgid ""
" -z, --compress force compression\n" " -z, --compress force compression\n"
" -d, --decompress force decompression\n" " -d, --decompress force decompression\n"
@ -513,7 +490,7 @@ msgstr ""
" -t, --test testovat integritu komprimovaného souboru\n" " -t, --test testovat integritu komprimovaného souboru\n"
" -l, --list vypsat informace o souborech .xz" " -l, --list vypsat informace o souborech .xz"
#: src/xz/message.c:1109 #: src/xz/message.c:1104
msgid "" msgid ""
"\n" "\n"
" Operation modifiers:\n" " Operation modifiers:\n"
@ -521,39 +498,33 @@ msgstr ""
"\n" "\n"
"Modifikátory operací:\n" "Modifikátory operací:\n"
#: src/xz/message.c:1112 #: src/xz/message.c:1107
msgid "" msgid ""
" -k, --keep keep (don't delete) input files\n" " -k, --keep keep (don't delete) input files\n"
" -f, --force force overwrite of output file and (de)compress links\n" " -f, --force force overwrite of output file and (de)compress links\n"
" -c, --stdout write to standard output and don't delete input files" " -c, --stdout write to standard output and don't delete input files"
msgstr "" msgstr ""
" -k, --keep zachovat (nemazat) vstupní soubory\n" " -k, --keep zachovat (nemazat) vstupní soubory\n"
" -f, --force vynutit přepis výstupního souboru a de/komprimovat " " -f, --force vynutit přepis výstupního souboru a de/komprimovat odkazy\n"
"odkazy\n" " -c, --stdout zapisovat na standardní výstup a nemazat vstupní soubory"
" -c, --stdout zapisovat na standardní výstup a nemazat vstupní "
"soubory"
#: src/xz/message.c:1118 #: src/xz/message.c:1113
msgid "" msgid ""
" --no-sparse do not create sparse files when decompressing\n" " --no-sparse do not create sparse files when decompressing\n"
" -S, --suffix=.SUF use the suffix `.SUF' on compressed files\n" " -S, --suffix=.SUF use the suffix `.SUF' on compressed files\n"
" --files[=FILE] read filenames to process from FILE; if FILE is\n" " --files[=FILE] read filenames to process from FILE; if FILE is\n"
" omitted, filenames are read from the standard input;\n" " omitted, filenames are read from the standard input;\n"
" filenames must be terminated with the newline " " filenames must be terminated with the newline character\n"
"character\n"
" --files0[=FILE] like --files but use the null character as terminator" " --files0[=FILE] like --files but use the null character as terminator"
msgstr "" msgstr ""
" --no-sparse nevytvářet při dekomprimaci záložní soubory\n" " --no-sparse nevytvářet při dekomprimaci záložní soubory\n"
" -S, --suffix=.PRIP použít u komprimovaných souborů příponu „.PRIP“\n" " -S, --suffix=.PRIP použít u komprimovaných souborů příponu „.PRIP“\n"
" --files[=SOUBOR] číst názvy souborů, které se mají zpracovat, ze " " --files[=SOUBOR] číst názvy souborů, které se mají zpracovat, ze SOUBORu;\n"
"SOUBORu;\n" " pokud není SOUBOR zadán, čte se ze standardního vstupu;\n"
" pokud není SOUBOR zadán, čte se ze standardního "
"vstupu;\n"
" názvy souborů musí být zakončeny znakem nového řádku\n" " názvy souborů musí být zakončeny znakem nového řádku\n"
" --files0[=SOUBOR] stejné jako --files, ale použít k zakončování nulový " " --files0[=SOUBOR] stejné jako --files, ale použít k zakončování nulový znak"
"znak"
#: src/xz/message.c:1126 #: src/xz/message.c:1121
msgid "" msgid ""
"\n" "\n"
" Basic file format and compression options:\n" " Basic file format and compression options:\n"
@ -561,7 +532,7 @@ msgstr ""
"\n" "\n"
"Základní přepínače pro formát souboru a komprimaci:\n" "Základní přepínače pro formát souboru a komprimaci:\n"
#: src/xz/message.c:1128 #: src/xz/message.c:1123
msgid "" msgid ""
" -F, --format=FMT file format to encode or decode; possible values are\n" " -F, --format=FMT file format to encode or decode; possible values are\n"
" `auto' (default), `xz', `lzma', and `raw'\n" " `auto' (default), `xz', `lzma', and `raw'\n"
@ -570,76 +541,62 @@ msgid ""
msgstr "" msgstr ""
" -F, --format=FORMÁT formát souboru k zakódování nebo dekódování; možné\n" " -F, --format=FORMÁT formát souboru k zakódování nebo dekódování; možné\n"
" hodnoty jsou „auto“ (výchozí), „xz“, „lzma“ a „raw“\n" " hodnoty jsou „auto“ (výchozí), „xz“, „lzma“ a „raw“\n"
" -C, --check=KONTROLA typ kontroly integrity: „none“ (používejte s " " -C, --check=KONTROLA typ kontroly integrity: „none“ (používejte s rozmyslem),\n"
"rozmyslem),\n"
" „crc32“, „crc64“ (výchozí) nebo „sha256“" " „crc32“, „crc64“ (výchozí) nebo „sha256“"
#: src/xz/message.c:1135 #: src/xz/message.c:1130
msgid "" msgid ""
" -0 ... -9 compression preset; default is 6; take compressor " " -0 ... -9 compression preset; default is 6; take compressor *and*\n"
"*and*\n" " decompressor memory usage into account before using 7-9!"
" decompressor memory usage into account before using "
"7-9!"
msgstr "" msgstr ""
" -0 .. -9 přednastavení komprimace; výchozí je 6; než " " -0 .. -9 přednastavení komprimace; výchozí je 6; než použijete\n"
"použijete\n" " hodnoty 7 9, vezměte do úvahy množství použité paměti"
" hodnoty 7 9, vezměte do úvahy množství použité "
"paměti"
#: src/xz/message.c:1139 #: src/xz/message.c:1134
msgid "" msgid ""
" -e, --extreme try to improve compression ratio by using more CPU " " -e, --extreme try to improve compression ratio by using more CPU time;\n"
"time;\n"
" does not affect decompressor memory requirements" " does not affect decompressor memory requirements"
msgstr "" msgstr ""
" -e, --extreme zkusit zlepšit poměr komprimace využitím více času\n" " -e, --extreme zkusit zlepšit poměr komprimace využitím více času\n"
" procesoru; nemá vliv na paměťové nároky dekomprimace" " procesoru; nemá vliv na paměťové nároky dekomprimace"
#: src/xz/message.c:1144 #: src/xz/message.c:1139
#, no-c-format #, no-c-format
msgid "" msgid ""
" --memlimit-compress=LIMIT\n" " --memlimit-compress=LIMIT\n"
" --memlimit-decompress=LIMIT\n" " --memlimit-decompress=LIMIT\n"
" -M, --memlimit=LIMIT\n" " -M, --memlimit=LIMIT\n"
" set memory usage limit for compression, " " set memory usage limit for compression, decompression,\n"
"decompression,\n"
" or both; LIMIT is in bytes, % of RAM, or 0 for defaults" " or both; LIMIT is in bytes, % of RAM, or 0 for defaults"
msgstr "" msgstr ""
" --memlimit-compress=LIMIT\n" " --memlimit-compress=LIMIT\n"
" --memlimit-decompress=LIMIT\n" " --memlimit-decompress=LIMIT\n"
" -M, --memlimit=LIMIT\n" " -M, --memlimit=LIMIT\n"
" nastaví omezení použitelné paměti pro komprimaci,\n" " nastaví omezení použitelné paměti pro komprimaci,\n"
" dekomprimaci nebo obojí; LIMIT je v bajtech, % z " " dekomprimaci nebo obojí; LIMIT je v bajtech, % z paměti\n"
"paměti\n"
" RAM nebo 0 pro výchozí" " RAM nebo 0 pro výchozí"
#: src/xz/message.c:1151 #: src/xz/message.c:1146
msgid "" msgid ""
" --no-adjust if compression settings exceed the memory usage " " --no-adjust if compression settings exceed the memory usage limit,\n"
"limit,\n" " give an error instead of adjusting the settings downwards"
" give an error instead of adjusting the settings "
"downwards"
msgstr "" msgstr ""
" --no-adjust pokud nastavení komprimace přesáhne omezení " " --no-adjust pokud nastavení komprimace přesáhne omezení použitelné\n"
"použitelné\n"
" paměti, předat chybu namísto snížení nastavení" " paměti, předat chybu namísto snížení nastavení"
#: src/xz/message.c:1157 #: src/xz/message.c:1152
msgid "" msgid ""
"\n" "\n"
" Custom filter chain for compression (alternative for using presets):" " Custom filter chain for compression (alternative for using presets):"
msgstr "" msgstr ""
"\n" "\n"
"Vlastní omezující filtr pro komprimaci (alternativa k použití " "Vlastní omezující filtr pro komprimaci (alternativa k použití přednastavených):"
"přednastavených):"
#: src/xz/message.c:1166 #: src/xz/message.c:1161
msgid "" msgid ""
"\n" "\n"
" --lzma1[=OPTS] LZMA1 or LZMA2; OPTS is a comma-separated list of zero " " --lzma1[=OPTS] LZMA1 or LZMA2; OPTS is a comma-separated list of zero or\n"
"or\n" " --lzma2[=OPTS] more of the following options (valid values; default):\n"
" --lzma2[=OPTS] more of the following options (valid values; "
"default):\n"
" preset=PRE reset options to a preset (0-9[e])\n" " preset=PRE reset options to a preset (0-9[e])\n"
" dict=NUM dictionary size (4KiB - 1536MiB; 8MiB)\n" " dict=NUM dictionary size (4KiB - 1536MiB; 8MiB)\n"
" lc=NUM number of literal context bits (0-4; 3)\n" " lc=NUM number of literal context bits (0-4; 3)\n"
@ -647,33 +604,24 @@ msgid ""
" pb=NUM number of position bits (0-4; 2)\n" " pb=NUM number of position bits (0-4; 2)\n"
" mode=MODE compression mode (fast, normal; normal)\n" " mode=MODE compression mode (fast, normal; normal)\n"
" nice=NUM nice length of a match (2-273; 64)\n" " nice=NUM nice length of a match (2-273; 64)\n"
" mf=NAME match finder (hc3, hc4, bt2, bt3, bt4; " " mf=NAME match finder (hc3, hc4, bt2, bt3, bt4; bt4)\n"
"bt4)\n" " depth=NUM maximum search depth; 0=automatic (default)"
" depth=NUM maximum search depth; 0=automatic "
"(default)"
msgstr "" msgstr ""
"\n" "\n"
" --lzma1[=VOLBY] LZMA1 nebo LZMA2; VOLBY je čárkou oddělovaný seznam " " --lzma1[=VOLBY] LZMA1 nebo LZMA2; VOLBY je čárkou oddělovaný seznam žádné\n"
"žádné\n" " --lzma2[=VOLBY] nebo více následujících voleb (platné hodnoty; výchozí):\n"
" --lzma2[=VOLBY] nebo více následujících voleb (platné hodnoty; " " preset=PŘE změnit volby na PŘEdnastavené (0 9[e])\n"
"výchozí):\n" " dict=POČ velikost slovníku (4 KiB 1536 MiB; 8 MiB)\n"
" preset=PŘE změnit volby na PŘEdnastavené (0 9" " lc=POČ počet kontextových bitů literálu (0 4; 3)\n"
"[e])\n" " lp=POČ počet pozičních bitů literálu (0 4; 0)\n"
" dict=POČ velikost slovníku (4 KiB 1536 MiB; 8 "
"MiB)\n"
" lc=POČ počet kontextových bitů literálu (0 4; "
"3)\n"
" lp=POČ počet pozičních bitů literálu (0 4; "
"0)\n"
" pb=POČ počet pozičních bitů (0 4; 2)\n" " pb=POČ počet pozičních bitů (0 4; 2)\n"
" mode=REŽIM režim komprimace (fast, normal; normal)\n" " mode=REŽIM režim komprimace (fast, normal; normal)\n"
" nice=NUM příznivá délka shody (2 273; 64)\n" " nice=NUM příznivá délka shody (2 273; 64)\n"
" mf=NÁZEV hledání shod (hc3, hc4, bt2, bt3, bt4; " " mf=NÁZEV hledání shod (hc3, hc4, bt2, bt3, bt4; bt4)\n"
"bt4)\n"
" depth=POČ maximální hloubka prohledávání;\n" " depth=POČ maximální hloubka prohledávání;\n"
" 0 = automaticky (výchozí)" " 0 = automaticky (výchozí)"
#: src/xz/message.c:1181 #: src/xz/message.c:1176
msgid "" msgid ""
"\n" "\n"
" --x86[=OPTS] x86 BCJ filter (32-bit and 64-bit)\n" " --x86[=OPTS] x86 BCJ filter (32-bit and 64-bit)\n"
@ -695,7 +643,7 @@ msgstr ""
" Platné volby pro všechny filtry BCJ:\n" " Platné volby pro všechny filtry BCJ:\n"
" start=POČ počáteční posun pro převody (výchozí=0)" " start=POČ počáteční posun pro převody (výchozí=0)"
#: src/xz/message.c:1193 #: src/xz/message.c:1188
msgid "" msgid ""
"\n" "\n"
" --delta[=OPTS] Delta filter; valid OPTS (valid values; default):\n" " --delta[=OPTS] Delta filter; valid OPTS (valid values; default):\n"
@ -704,11 +652,10 @@ msgid ""
msgstr "" msgstr ""
"\n" "\n"
" --delta[=VOLBY] Filtr Delta; platné VOLBY (platné hodnoty; výchozí):\n" " --delta[=VOLBY] Filtr Delta; platné VOLBY (platné hodnoty; výchozí):\n"
" dist=POČ vzdálenost mezi bajty, které jsou " " dist=POČ vzdálenost mezi bajty, které jsou odečítány\n"
"odečítány\n"
" jeden od druhého (1 256; 1)" " jeden od druhého (1 256; 1)"
#: src/xz/message.c:1201 #: src/xz/message.c:1196
msgid "" msgid ""
"\n" "\n"
" Other options:\n" " Other options:\n"
@ -716,79 +663,71 @@ msgstr ""
"\n" "\n"
" Ostatní přepínače:\n" " Ostatní přepínače:\n"
#: src/xz/message.c:1204 #: src/xz/message.c:1199
msgid "" msgid ""
" -q, --quiet suppress warnings; specify twice to suppress errors " " -q, --quiet suppress warnings; specify twice to suppress errors too\n"
"too\n"
" -v, --verbose be verbose; specify twice for even more verbose" " -v, --verbose be verbose; specify twice for even more verbose"
msgstr "" msgstr ""
" -q, --quiet potlačit varování; zadáním dvakrát, potlačíte i " " -q, --quiet potlačit varování; zadáním dvakrát, potlačíte i chyby\n"
"chyby\n"
" -v, --verbose podrobnější zprávy; zadáním dvakrát, budou ještě\n" " -v, --verbose podrobnější zprávy; zadáním dvakrát, budou ještě\n"
" podrobnější" " podrobnější"
#: src/xz/message.c:1209 #: src/xz/message.c:1204
msgid " -Q, --no-warn make warnings not affect the exit status" msgid " -Q, --no-warn make warnings not affect the exit status"
msgstr " -Q, --no-warn způsobí, že varování neovlivní stav ukončení" msgstr " -Q, --no-warn způsobí, že varování neovlivní stav ukončení"
#: src/xz/message.c:1211 #: src/xz/message.c:1206
msgid "" msgid " --robot use machine-parsable messages (useful for scripts)"
" --robot use machine-parsable messages (useful for scripts)"
msgstr "" msgstr ""
" --robot použít strojově analyzovatelné zprávy (užitečné pro\n" " --robot použít strojově analyzovatelné zprávy (užitečné pro\n"
" skripty)" " skripty)"
#: src/xz/message.c:1214 #: src/xz/message.c:1209
msgid "" msgid ""
" --info-memory display the total amount of RAM and the currently " " --info-memory display the total amount of RAM and the currently active\n"
"active\n"
" memory usage limits, and exit" " memory usage limits, and exit"
msgstr "" msgstr ""
" --info-memory zobrazit celkové množství paměti RAM a současné " " --info-memory zobrazit celkové množství paměti RAM a současné aktivní\n"
"aktivní\n"
" omezení použitelné paměti a skončit" " omezení použitelné paměti a skončit"
#: src/xz/message.c:1217 #: src/xz/message.c:1212
msgid "" msgid ""
" -h, --help display the short help (lists only the basic options)\n" " -h, --help display the short help (lists only the basic options)\n"
" -H, --long-help display this long help and exit" " -H, --long-help display this long help and exit"
msgstr "" msgstr ""
" -h, --help zobrazit krátkou nápovědu (vypíše jen základní " " -h, --help zobrazit krátkou nápovědu (vypíše jen základní přepínače)\n"
"přepínače)\n"
" -H, --long-help zobrazit tuto úplnou nápovědu a skončit" " -H, --long-help zobrazit tuto úplnou nápovědu a skončit"
#: src/xz/message.c:1221 #: src/xz/message.c:1216
msgid "" msgid ""
" -h, --help display this short help and exit\n" " -h, --help display this short help and exit\n"
" -H, --long-help display the long help (lists also the advanced options)" " -H, --long-help display the long help (lists also the advanced options)"
msgstr "" msgstr ""
" -h, --help zobrazit tuto zkrácenou nápovědu a skončit\n" " -h, --help zobrazit tuto zkrácenou nápovědu a skončit\n"
" -H, --long-help zobrazit úplnou nápovědu (vypíše i pokročilé " " -H, --long-help zobrazit úplnou nápovědu (vypíše i pokročilé přepínače)"
"přepínače)"
#: src/xz/message.c:1226 #: src/xz/message.c:1221
msgid " -V, --version display the version number and exit" msgid " -V, --version display the version number and exit"
msgstr " -V, --version zobrazit číslo verze a skončit" msgstr " -V, --version zobrazit číslo verze a skončit"
#: src/xz/message.c:1228 #: src/xz/message.c:1223
msgid "" msgid ""
"\n" "\n"
"With no FILE, or when FILE is -, read standard input.\n" "With no FILE, or when FILE is -, read standard input.\n"
msgstr "" msgstr ""
"\n" "\n"
"Pokud SOUBOR není zadán nebo pokud je -, bude se číst ze standardního " "Pokud SOUBOR není zadán nebo pokud je -, bude se číst ze standardního vstupu.\n"
"vstupu.\n"
#. TRANSLATORS: This message indicates the bug reporting address #. TRANSLATORS: This message indicates the bug reporting address
#. for this package. Please add _another line_ saying #. for this package. Please add _another line_ saying
#. "Report translation bugs to <...>\n" with the email or WWW #. "Report translation bugs to <...>\n" with the email or WWW
#. address for translation bugs. Thanks. #. address for translation bugs. Thanks.
#: src/xz/message.c:1234 #: src/xz/message.c:1229
#, c-format #, c-format
msgid "Report bugs to <%s> (in English or Finnish).\n" msgid "Report bugs to <%s> (in English or Finnish).\n"
msgstr "Chyby hlaste na <%s> (v angličtině nebo finštině).\n" msgstr "Chyby hlaste na <%s> (v angličtině nebo finštině).\n"
#: src/xz/message.c:1236 #: src/xz/message.c:1231
#, c-format #, c-format
msgid "%s home page: <%s>\n" msgid "%s home page: <%s>\n"
msgstr "Domovská stránka %s: <%s>\n" msgstr "Domovská stránka %s: <%s>\n"
@ -824,11 +763,8 @@ msgstr "Vybraný vyhledávač shod vyžaduje minimálně nice=%<PRIu32>"
#: src/xz/suffix.c:79 src/xz/suffix.c:164 #: src/xz/suffix.c:79 src/xz/suffix.c:164
#, c-format #, c-format
msgid "" msgid "%s: With --format=raw, --suffix=.SUF is required unless writing to stdout"
"%s: With --format=raw, --suffix=.SUF is required unless writing to stdout" msgstr "%s: S přepínačem --format=raw je vyžadován --sufix=.PRIP, vyjma zápisu do standardního výstupu"
msgstr ""
"%s: S přepínačem --format=raw je vyžadován --sufix=.PRIP, vyjma zápisu do "
"standardního výstupu"
#: src/xz/suffix.c:99 #: src/xz/suffix.c:99
#, c-format #, c-format
@ -857,9 +793,7 @@ msgstr "%s: Neplatná jednotka s předponou"
#: src/xz/util.c:105 #: src/xz/util.c:105
msgid "Valid suffixes are `KiB' (2^10), `MiB' (2^20), and `GiB' (2^30)." msgid "Valid suffixes are `KiB' (2^10), `MiB' (2^20), and `GiB' (2^30)."
msgstr "" msgstr "Platné jednotky s předponami jsou „KiB“ (2^10 B), „MiB“ (2^20 B) a „GiB“ (2^30 B)."
"Platné jednotky s předponami jsou „KiB“ (2^10 B), „MiB“ (2^20 B) a "
"„GiB“ (2^30 B)."
#: src/xz/util.c:122 #: src/xz/util.c:122
#, c-format #, c-format
@ -893,49 +827,37 @@ msgstr "Neznámá chyba"
#~ msgstr "%s MiB (%s bajtů)\n" #~ msgstr "%s MiB (%s bajtů)\n"
#~ msgid "" #~ msgid ""
#~ " -e, --extreme use more CPU time when encoding to increase " #~ " -e, --extreme use more CPU time when encoding to increase compression\n"
#~ "compression\n"
#~ " ratio without increasing memory usage of the decoder" #~ " ratio without increasing memory usage of the decoder"
#~ msgstr "" #~ msgstr ""
#~ " -e, --extreme využít více procesorového času pro kódování, čímž " #~ " -e, --extreme využít více procesorového času pro kódování, čímž se\n"
#~ "se\n" #~ " zvýší kompresní poměr bez zvýšení paměti použité kodérem"
#~ " zvýší kompresní poměr bez zvýšení paměti použité "
#~ "kodérem"
#~ msgid "" #~ msgid ""
#~ " -M, --memory=NUM use roughly NUM bytes of memory at maximum; 0 " #~ " -M, --memory=NUM use roughly NUM bytes of memory at maximum; 0 indicates\n"
#~ "indicates\n"
#~ " the default setting, which is 40 % of total RAM" #~ " the default setting, which is 40 % of total RAM"
#~ msgstr "" #~ msgstr ""
#~ " -M, --memory=POČ použít zhruba POČ bajtů paměti jako maximum; 0 " #~ " -M, --memory=POČ použít zhruba POČ bajtů paměti jako maximum; 0 znamená\n"
#~ "znamená\n" #~ " výchozí nastavení, což je 40% celkového množství paměti"
#~ " výchozí nastavení, což je 40% celkového množství "
#~ "paměti"
#~ msgid "" #~ msgid ""
#~ "\n" #~ "\n"
#~ " --subblock[=OPTS] Subblock filter; valid OPTS (valid values; " #~ " --subblock[=OPTS] Subblock filter; valid OPTS (valid values; default):\n"
#~ "default):\n"
#~ " size=NUM number of bytes of data per subblock\n" #~ " size=NUM number of bytes of data per subblock\n"
#~ " (1 - 256Mi; 4Ki)\n" #~ " (1 - 256Mi; 4Ki)\n"
#~ " rle=NUM run-length encoder chunk size (0-256; " #~ " rle=NUM run-length encoder chunk size (0-256; 0)"
#~ "0)"
#~ msgstr "" #~ msgstr ""
#~ "\n" #~ "\n"
#~ " --subblock[=VOLBY] Subblokový filtr; platné VOLBY (platné hodnoty; " #~ " --subblock[=VOLBY] Subblokový filtr; platné VOLBY (platné hodnoty; výchozí):\n"
#~ "výchozí):\n"
#~ " size=POČ počet bajtů dat na subblok\n" #~ " size=POČ počet bajtů dat na subblok\n"
#~ " (1 - 256 Mi; 4 Ki)\n" #~ " (1 - 256 Mi; 4 Ki)\n"
#~ " rle=POČ velikost dávky pro kodér run-length " #~ " rle=POČ velikost dávky pro kodér run-length (0-256; 0)"
#~ "(0-256; 0)"
#~ msgid "" #~ msgid ""
#~ "On this system and configuration, this program will use a maximum of " #~ "On this system and configuration, this program will use a maximum of roughly\n"
#~ "roughly\n"
#~ "%s MiB RAM and " #~ "%s MiB RAM and "
#~ msgstr "" #~ msgstr ""
#~ "Na tomto systému a s tímto nastavením použije tento program maximum ze " #~ "Na tomto systému a s tímto nastavením použije tento program maximum ze zhruba\n"
#~ "zhruba\n"
#~ "%s MiB RAM a " #~ "%s MiB RAM a "
#~ msgid "" #~ msgid ""

View File

@ -6,10 +6,11 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: XZ Utils 4.999.9beta\n" "Project-Id-Version: XZ Utils 4.999.9beta\n"
"Report-Msgid-Bugs-To: lasse.collin@tukaani.org\n" "Report-Msgid-Bugs-To: lasse.collin@tukaani.org\n"
"POT-Creation-Date: 2010-09-11 17:07+0200\n" "POT-Creation-Date: 2010-10-23 17:48+0300\n"
"PO-Revision-Date: 2010-09-07 20:27+0200\n" "PO-Revision-Date: 2010-09-07 20:27+0200\n"
"Last-Translator: <maan@systemlinux.org>\n" "Last-Translator: <maan@systemlinux.org>\n"
"Language-Team: German\n" "Language-Team: German\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@ -27,8 +28,7 @@ msgstr "%s: Integritäts-Check Typ nicht unterstützt"
#: src/xz/args.c:382 #: src/xz/args.c:382
msgid "Only one file can be specified with `--files' or `--files0'." msgid "Only one file can be specified with `--files' or `--files0'."
msgstr "" msgstr "Nur ein file kann als Argument für --files oder --files0 angegeben werden."
"Nur ein file kann als Argument für --files oder --files0 angegeben werden."
#: src/xz/args.c:445 #: src/xz/args.c:445
#, c-format #, c-format
@ -41,8 +41,7 @@ msgstr "Maximal vier Filter möglich"
#: src/xz/coder.c:108 #: src/xz/coder.c:108
msgid "Memory usage limit is too low for the given filter setup." msgid "Memory usage limit is too low for the given filter setup."
msgstr "" msgstr "Das Speicher Limit ist zu niedrig für die gegebene Filter Konfiguration."
"Das Speicher Limit ist zu niedrig für die gegebene Filter Konfiguration."
#: src/xz/coder.c:129 #: src/xz/coder.c:129
msgid "Using a preset in raw mode is discouraged." msgid "Using a preset in raw mode is discouraged."
@ -50,9 +49,7 @@ msgstr "Verwendung der Voreinstellung im raw Modus wird nicht empfohlen."
#: src/xz/coder.c:131 #: src/xz/coder.c:131
msgid "The exact options of the presets may vary between software versions." msgid "The exact options of the presets may vary between software versions."
msgstr "" msgstr "Die genauen Optionen der Voreinstellung können zwischen Software Versionen variieren."
"Die genauen Optionen der Voreinstellung können zwischen Software Versionen "
"variieren."
#: src/xz/coder.c:157 #: src/xz/coder.c:157
msgid "The .lzma format supports only the LZMA1 filter" msgid "The .lzma format supports only the LZMA1 filter"
@ -73,12 +70,8 @@ msgstr "Dekompression wird %s MiB Speicher brauchen."
#: src/xz/coder.c:247 #: src/xz/coder.c:247
#, c-format #, c-format
msgid "" msgid "Adjusted LZMA%c dictionary size from %s MiB to %s MiB to not exceed the memory usage limit of %s MiB"
"Adjusted LZMA%c dictionary size from %s MiB to %s MiB to not exceed the " msgstr "Passte LZMA%c Wörterbuch Größe von %s MiB to %s MiB an, um nicht das Speicher Nutzungslimit von %s MiB zu übersteigen"
"memory usage limit of %s MiB"
msgstr ""
"Passte LZMA%c Wörterbuch Größe von %s MiB to %s MiB an, um nicht das "
"Speicher Nutzungslimit von %s MiB zu übersteigen"
#. TRANSLATORS: When compression or decompression finishes, #. TRANSLATORS: When compression or decompression finishes,
#. and xz is going to remove the source file, xz first checks #. and xz is going to remove the source file, xz first checks
@ -93,8 +86,7 @@ msgstr ""
#: src/xz/file_io.c:137 #: src/xz/file_io.c:137
#, c-format #, c-format
msgid "%s: File seems to have been moved, not removing" msgid "%s: File seems to have been moved, not removing"
msgstr "" msgstr "%s: Datei scheint umbenannt worden zu sein, daher wird sie nicht gelöscht"
"%s: Datei scheint umbenannt worden zu sein, daher wird sie nicht gelöscht"
#: src/xz/file_io.c:144 src/xz/file_io.c:590 #: src/xz/file_io.c:144 src/xz/file_io.c:590
#, c-format #, c-format
@ -149,8 +141,7 @@ msgstr "%s: Eingabedatei hat mehr als einen hard link, überspringe"
#: src/xz/file_io.c:714 #: src/xz/file_io.c:714
#, c-format #, c-format
msgid "Error restoring the O_APPEND flag to standard output: %s" msgid "Error restoring the O_APPEND flag to standard output: %s"
msgstr "" msgstr "Fehler beim Wiederherstellen des O_APPEND flags bei Standard Output: %s"
"Fehler beim Wiederherstellen des O_APPEND flags bei Standard Output: %s"
#: src/xz/file_io.c:726 #: src/xz/file_io.c:726
#, c-format #, c-format
@ -160,8 +151,7 @@ msgstr "%s: Fehler beim Schießen der Datei: %s"
#: src/xz/file_io.c:762 src/xz/file_io.c:946 #: src/xz/file_io.c:762 src/xz/file_io.c:946
#, c-format #, c-format
msgid "%s: Seeking failed when trying to create a sparse file: %s" msgid "%s: Seeking failed when trying to create a sparse file: %s"
msgstr "" msgstr "%s: Positionierungsfehler beim Versuch eine sparse Datei zu erzeugen: %s"
"%s: Positionierungsfehler beim Versuch eine sparse Datei zu erzeugen: %s"
#: src/xz/file_io.c:821 #: src/xz/file_io.c:821
#, c-format #, c-format
@ -212,7 +202,7 @@ msgstr "Kein"
#. but the Check ID is known (here 2). This and other "Unknown-N" #. but the Check ID is known (here 2). This and other "Unknown-N"
#. strings are used in tables, so the width must not exceed ten #. strings are used in tables, so the width must not exceed ten
#. columns with a fixed-width font. It's OK to omit the dash if #. columns with a fixed-width font. It's OK to omit the dash if
#. you need space for one extra letter. #. you need space for one extra letter, but don't use spaces.
#: src/xz/list.c:69 #: src/xz/list.c:69
msgid "Unknown-2" msgid "Unknown-2"
msgstr "Unbek.2" msgstr "Unbek.2"
@ -320,12 +310,10 @@ msgstr " Strom Auffüllung: %s\n"
#: src/xz/list.c:693 #: src/xz/list.c:693
msgid "" msgid ""
" Streams:\n" " Streams:\n"
" Stream Blocks CompOffset UncompOffset CompSize " " Stream Blocks CompOffset UncompOffset CompSize UncompSize Ratio Check Padding"
"UncompSize Ratio Check Padding"
msgstr "" msgstr ""
" Ströme:\n" " Ströme:\n"
" Strom Blöcke KompOffset UnkompOffset KompGröße " " Strom Blöcke KompOffset UnkompOffset KompGröße UnkompGröße Verh. Check Auffüllung"
"UnkompGröße Verh. Check Auffüllung"
#. TRANSLATORS: The second line is column headings. All #. TRANSLATORS: The second line is column headings. All
#. except Check are right aligned; Check is left aligned. #. except Check are right aligned; Check is left aligned.
@ -333,12 +321,10 @@ msgstr ""
#, c-format #, c-format
msgid "" msgid ""
" Blocks:\n" " Blocks:\n"
" Stream Block CompOffset UncompOffset TotalSize " " Stream Block CompOffset UncompOffset TotalSize UncompSize Ratio Check"
"UncompSize Ratio Check"
msgstr "" msgstr ""
" Blöcke:\n" " Blöcke:\n"
" Strom Block KompOffset UnkompOffset TotalGröße " " Strom Block KompOffset UnkompOffset TotalGröße UnkompGröße Verh. Check"
"UnkompGröße Verh. Check"
#. TRANSLATORS: These are additional column headings #. TRANSLATORS: These are additional column headings
#. for the most verbose listing mode. CheckVal #. for the most verbose listing mode. CheckVal
@ -390,8 +376,7 @@ msgstr " Anzahl Dateien: %s\n"
#: src/xz/list.c:1072 #: src/xz/list.c:1072
msgid "--list works only on .xz files (--format=xz or --format=auto)" msgid "--list works only on .xz files (--format=xz or --format=auto)"
msgstr "" msgstr "--list funktioniert nur mit .xz Dateien (--format=xz oder --format=auto)"
"--list funktioniert nur mit .xz Dateien (--format=xz oder --format=auto)"
#: src/xz/list.c:1078 #: src/xz/list.c:1078
msgid "--list does not support reading from standard input" msgid "--list does not support reading from standard input"
@ -409,79 +394,69 @@ msgstr "%s: Unerwartetes Ende beim Lesen der Dateinamen"
#: src/xz/main.c:120 #: src/xz/main.c:120
#, c-format #, c-format
msgid "" msgid "%s: Null character found when reading filenames; maybe you meant to use `--files0' instead of `--files'?"
"%s: Null character found when reading filenames; maybe you meant to use `--" msgstr "%s: Null Charakter gefunden beim Lesen der Dateinamen; Meinten Sie `--files0' statt `--files'?"
"files0' instead of `--files'?"
msgstr ""
"%s: Null Charakter gefunden beim Lesen der Dateinamen; Meinten Sie `--"
"files0' statt `--files'?"
#: src/xz/main.c:174 #: src/xz/main.c:174
msgid "Compression and decompression with --robot are not supported yet." msgid "Compression and decompression with --robot are not supported yet."
msgstr "Kompression und Dekompression mit --robot ist noch nicht unterstützt." msgstr "Kompression und Dekompression mit --robot ist noch nicht unterstützt."
#: src/xz/main.c:231 #: src/xz/main.c:231
msgid "" msgid "Cannot read data from standard input when reading filenames from standard input"
"Cannot read data from standard input when reading filenames from standard " msgstr "Lesen der Standardeingabe ist nicht möglich, wenn die Dateinamen auch von der Standardeingabe gelesen werden"
"input"
msgstr ""
"Lesen der Standardeingabe ist nicht möglich, wenn die Dateinamen auch von "
"der Standardeingabe gelesen werden"
#: src/xz/message.c:800 src/xz/message.c:844 #: src/xz/message.c:792 src/xz/message.c:842
msgid "Internal error (bug)" msgid "Internal error (bug)"
msgstr "Interner Fehler (Bug)" msgstr "Interner Fehler (Bug)"
#: src/xz/message.c:807 #: src/xz/message.c:799
msgid "Cannot establish signal handlers" msgid "Cannot establish signal handlers"
msgstr "Kann Signal Routine nicht setzen" msgstr "Kann Signal Routine nicht setzen"
#: src/xz/message.c:816 #: src/xz/message.c:808
msgid "No integrity check; not verifying file integrity" msgid "No integrity check; not verifying file integrity"
msgstr "Kein Integritäts-Check; werde Datei-Integrität nicht überprüfen" msgstr "Kein Integritäts-Check; werde Datei-Integrität nicht überprüfen"
#: src/xz/message.c:819 #: src/xz/message.c:811
msgid "Unsupported type of integrity check; not verifying file integrity" msgid "Unsupported type of integrity check; not verifying file integrity"
msgstr "" msgstr "Typ des Integritäts-Checks nicht unterstützt; werde Datei-Integrität nicht überprüfen"
"Typ des Integritäts-Checks nicht unterstützt; werde Datei-Integrität nicht "
"überprüfen"
#: src/xz/message.c:826 #: src/xz/message.c:818
msgid "Memory usage limit reached" msgid "Memory usage limit reached"
msgstr "Speicher-Limit erreicht" msgstr "Speicher-Limit erreicht"
#: src/xz/message.c:829 #: src/xz/message.c:821
msgid "File format not recognized" msgid "File format not recognized"
msgstr "Datei Format nicht erkannt" msgstr "Datei Format nicht erkannt"
#: src/xz/message.c:832 #: src/xz/message.c:824
msgid "Unsupported options" msgid "Unsupported options"
msgstr "Optionen nicht unterstützt" msgstr "Optionen nicht unterstützt"
#: src/xz/message.c:835 #: src/xz/message.c:827
msgid "Compressed data is corrupt" msgid "Compressed data is corrupt"
msgstr "Komprimierte Daten sind korrupt" msgstr "Komprimierte Daten sind korrupt"
#: src/xz/message.c:838 #: src/xz/message.c:830
msgid "Unexpected end of input" msgid "Unexpected end of input"
msgstr "Unerwartetes Eingabe Ende" msgstr "Unerwartetes Eingabe Ende"
#: src/xz/message.c:886 #: src/xz/message.c:881
#, c-format #, c-format
msgid "%s MiB of memory is required. The limit is %s." msgid "%s MiB of memory is required. The limit is %s."
msgstr "%s MiB Speicher wird benötigt. Limit ist %s." msgstr "%s MiB Speicher wird benötigt. Limit ist %s."
#: src/xz/message.c:1053 #: src/xz/message.c:1048
#, c-format #, c-format
msgid "%s: Filter chain: %s\n" msgid "%s: Filter chain: %s\n"
msgstr "%s: Filter Kette: %s\n" msgstr "%s: Filter Kette: %s\n"
#: src/xz/message.c:1063 #: src/xz/message.c:1058
#, c-format #, c-format
msgid "Try `%s --help' for more information." msgid "Try `%s --help' for more information."
msgstr "Versuchen Sie `%s --help' für mehr Informationen." msgstr "Versuchen Sie `%s --help' für mehr Informationen."
#: src/xz/message.c:1089 #: src/xz/message.c:1084
#, c-format #, c-format
msgid "" msgid ""
"Usage: %s [OPTION]... [FILE]...\n" "Usage: %s [OPTION]... [FILE]...\n"
@ -492,18 +467,17 @@ msgstr ""
"Komprimiert oder dekomprimiert .xz DATEI(EN).\n" "Komprimiert oder dekomprimiert .xz DATEI(EN).\n"
"\n" "\n"
#: src/xz/message.c:1096 #: src/xz/message.c:1091
msgid "" msgid "Mandatory arguments to long options are mandatory for short options too.\n"
"Mandatory arguments to long options are mandatory for short options too.\n"
msgstr "" msgstr ""
"Obligatorische Argumente für lange Optionen sind auch für kurze Optionen\n" "Obligatorische Argumente für lange Optionen sind auch für kurze Optionen\n"
"zwingend.\n" "zwingend.\n"
#: src/xz/message.c:1100 #: src/xz/message.c:1095
msgid " Operation mode:\n" msgid " Operation mode:\n"
msgstr " Operationsmodus:\n" msgstr " Operationsmodus:\n"
#: src/xz/message.c:1103 #: src/xz/message.c:1098
msgid "" msgid ""
" -z, --compress force compression\n" " -z, --compress force compression\n"
" -d, --decompress force decompression\n" " -d, --decompress force decompression\n"
@ -515,7 +489,7 @@ msgstr ""
" -t, --test überprüfe Datei Integrität\n" " -t, --test überprüfe Datei Integrität\n"
" -l, --list liste Datei Informationen" " -l, --list liste Datei Informationen"
#: src/xz/message.c:1109 #: src/xz/message.c:1104
msgid "" msgid ""
"\n" "\n"
" Operation modifiers:\n" " Operation modifiers:\n"
@ -523,7 +497,7 @@ msgstr ""
"\n" "\n"
" Operationsmodifikatoren:\n" " Operationsmodifikatoren:\n"
#: src/xz/message.c:1112 #: src/xz/message.c:1107
msgid "" msgid ""
" -k, --keep keep (don't delete) input files\n" " -k, --keep keep (don't delete) input files\n"
" -f, --force force overwrite of output file and (de)compress links\n" " -f, --force force overwrite of output file and (de)compress links\n"
@ -535,14 +509,13 @@ msgstr ""
" -c, --stdout schreibe nach Standard Output und lösche nicht die\n" " -c, --stdout schreibe nach Standard Output und lösche nicht die\n"
" Eingabedateien" " Eingabedateien"
#: src/xz/message.c:1118 #: src/xz/message.c:1113
msgid "" msgid ""
" --no-sparse do not create sparse files when decompressing\n" " --no-sparse do not create sparse files when decompressing\n"
" -S, --suffix=.SUF use the suffix `.SUF' on compressed files\n" " -S, --suffix=.SUF use the suffix `.SUF' on compressed files\n"
" --files[=FILE] read filenames to process from FILE; if FILE is\n" " --files[=FILE] read filenames to process from FILE; if FILE is\n"
" omitted, filenames are read from the standard input;\n" " omitted, filenames are read from the standard input;\n"
" filenames must be terminated with the newline " " filenames must be terminated with the newline character\n"
"character\n"
" --files0[=FILE] like --files but use the null character as terminator" " --files0[=FILE] like --files but use the null character as terminator"
msgstr "" msgstr ""
" --no-sparse erzeuge keine sparse Datei beim Dekomprimieren\n" " --no-sparse erzeuge keine sparse Datei beim Dekomprimieren\n"
@ -551,10 +524,9 @@ msgstr ""
" DATEI nicht angegeben wurde, werden Dateinamen\n" " DATEI nicht angegeben wurde, werden Dateinamen\n"
" von Standard Input gelesen. Dateinamen müssen mit\n" " von Standard Input gelesen. Dateinamen müssen mit\n"
" einem Zeilenumbruch voneinander getrennt werden\n" " einem Zeilenumbruch voneinander getrennt werden\n"
" --files0=[DATEI] wie --files, aber benutze den Null Charakter als " " --files0=[DATEI] wie --files, aber benutze den Null Charakter als Trenner"
"Trenner"
#: src/xz/message.c:1126 #: src/xz/message.c:1121
msgid "" msgid ""
"\n" "\n"
" Basic file format and compression options:\n" " Basic file format and compression options:\n"
@ -562,76 +534,62 @@ msgstr ""
"\n" "\n"
" Grundlegende Optionen für Dateiformat und Kompression:\n" " Grundlegende Optionen für Dateiformat und Kompression:\n"
#: src/xz/message.c:1128 #: src/xz/message.c:1123
msgid "" msgid ""
" -F, --format=FMT file format to encode or decode; possible values are\n" " -F, --format=FMT file format to encode or decode; possible values are\n"
" `auto' (default), `xz', `lzma', and `raw'\n" " `auto' (default), `xz', `lzma', and `raw'\n"
" -C, --check=CHECK integrity check type: `none' (use with caution),\n" " -C, --check=CHECK integrity check type: `none' (use with caution),\n"
" `crc32', `crc64' (default), or `sha256'" " `crc32', `crc64' (default), or `sha256'"
msgstr "" msgstr ""
" -F, --format=FMT Dateiformat zur Kodierung oder Dekodierung; " " -F, --format=FMT Dateiformat zur Kodierung oder Dekodierung; mögliche\n"
"mögliche\n" " Werte sind `auto' (Voreinstellung), `xz', `lzma' und\n"
" Werte sind `auto' (Voreinstellung), `xz', `lzma' "
"und\n"
" `raw'\n" " `raw'\n"
" -C, --check=CHECK Typ des Integritätschecks: `none' (Vorsicht), " " -C, --check=CHECK Typ des Integritätschecks: `none' (Vorsicht), `crc32',\n"
"`crc32',\n"
" `crc64' (Voreinstellung), oder `sha256'" " `crc64' (Voreinstellung), oder `sha256'"
#: src/xz/message.c:1135 #: src/xz/message.c:1130
msgid "" msgid ""
" -0 ... -9 compression preset; default is 6; take compressor " " -0 ... -9 compression preset; default is 6; take compressor *and*\n"
"*and*\n" " decompressor memory usage into account before using 7-9!"
" decompressor memory usage into account before using 7-"
"9!"
msgstr "" msgstr ""
" -0 .. -9 Kompressionseinstellung; Voreinstellung is 6. " " -0 .. -9 Kompressionseinstellung; Voreinstellung is 6. Beachten\n"
"Beachten\n" " Sie den Speicherverbrauch des Komprimieres *und* des\n"
" Sie den Speicherverbrauch des Komprimieres *und* "
"des\n"
" Dekomprimierers, wenn Sie 7-9 benutzen!" " Dekomprimierers, wenn Sie 7-9 benutzen!"
#: src/xz/message.c:1139 #: src/xz/message.c:1134
msgid "" msgid ""
" -e, --extreme try to improve compression ratio by using more CPU " " -e, --extreme try to improve compression ratio by using more CPU time;\n"
"time;\n"
" does not affect decompressor memory requirements" " does not affect decompressor memory requirements"
msgstr "" msgstr ""
" -e, --extreme Versuche durch stärkere CPU Nutzung das " " -e, --extreme Versuche durch stärkere CPU Nutzung das Kompressions-\n"
"Kompressions-\n"
" verhältnis zu verbessern. Das beeinflusst nicht den\n" " verhältnis zu verbessern. Das beeinflusst nicht den\n"
" Speicherbedarf des Dekomprimierers." " Speicherbedarf des Dekomprimierers."
#: src/xz/message.c:1144 #: src/xz/message.c:1139
#, no-c-format #, no-c-format
msgid "" msgid ""
" --memlimit-compress=LIMIT\n" " --memlimit-compress=LIMIT\n"
" --memlimit-decompress=LIMIT\n" " --memlimit-decompress=LIMIT\n"
" -M, --memlimit=LIMIT\n" " -M, --memlimit=LIMIT\n"
" set memory usage limit for compression, " " set memory usage limit for compression, decompression,\n"
"decompression,\n"
" or both; LIMIT is in bytes, % of RAM, or 0 for defaults" " or both; LIMIT is in bytes, % of RAM, or 0 for defaults"
msgstr "" msgstr ""
" --memlimit-compress=LIMIT\n" " --memlimit-compress=LIMIT\n"
" --memlimit-decompress=LIMIT\n" " --memlimit-decompress=LIMIT\n"
" -M, --memlimit=LIMIT Setze Speicher Nutzungslimit für Kompression,\n" " -M, --memlimit=LIMIT Setze Speicher Nutzungslimit für Kompression,\n"
" Dekompression, oder beides; LIMIT ist in bytes, % " " Dekompression, oder beides; LIMIT ist in bytes, % RAM,\n"
"RAM,\n"
" oder 0 für Grundeinstellungen." " oder 0 für Grundeinstellungen."
#: src/xz/message.c:1151 #: src/xz/message.c:1146
msgid "" msgid ""
" --no-adjust if compression settings exceed the memory usage " " --no-adjust if compression settings exceed the memory usage limit,\n"
"limit,\n" " give an error instead of adjusting the settings downwards"
" give an error instead of adjusting the settings "
"downwards"
msgstr "" msgstr ""
" --no-adjust Wenn die Kompressionseinstellungen das Speicher\n" " --no-adjust Wenn die Kompressionseinstellungen das Speicher\n"
" Nutzungslimit übersteigen, erzeuge einen Fehler " " Nutzungslimit übersteigen, erzeuge einen Fehler statt\n"
"statt\n"
" die Einstellungen nach unten anzupassen." " die Einstellungen nach unten anzupassen."
#: src/xz/message.c:1157 #: src/xz/message.c:1152
msgid "" msgid ""
"\n" "\n"
" Custom filter chain for compression (alternative for using presets):" " Custom filter chain for compression (alternative for using presets):"
@ -639,13 +597,11 @@ msgstr ""
"\n" "\n"
" User-definierte Filter Kette für Kompression (alternativ zu Voreinstellung):" " User-definierte Filter Kette für Kompression (alternativ zu Voreinstellung):"
#: src/xz/message.c:1166 #: src/xz/message.c:1161
msgid "" msgid ""
"\n" "\n"
" --lzma1[=OPTS] LZMA1 or LZMA2; OPTS is a comma-separated list of zero " " --lzma1[=OPTS] LZMA1 or LZMA2; OPTS is a comma-separated list of zero or\n"
"or\n" " --lzma2[=OPTS] more of the following options (valid values; default):\n"
" --lzma2[=OPTS] more of the following options (valid values; "
"default):\n"
" preset=PRE reset options to a preset (0-9[e])\n" " preset=PRE reset options to a preset (0-9[e])\n"
" dict=NUM dictionary size (4KiB - 1536MiB; 8MiB)\n" " dict=NUM dictionary size (4KiB - 1536MiB; 8MiB)\n"
" lc=NUM number of literal context bits (0-4; 3)\n" " lc=NUM number of literal context bits (0-4; 3)\n"
@ -653,37 +609,28 @@ msgid ""
" pb=NUM number of position bits (0-4; 2)\n" " pb=NUM number of position bits (0-4; 2)\n"
" mode=MODE compression mode (fast, normal; normal)\n" " mode=MODE compression mode (fast, normal; normal)\n"
" nice=NUM nice length of a match (2-273; 64)\n" " nice=NUM nice length of a match (2-273; 64)\n"
" mf=NAME match finder (hc3, hc4, bt2, bt3, bt4; " " mf=NAME match finder (hc3, hc4, bt2, bt3, bt4; bt4)\n"
"bt4)\n" " depth=NUM maximum search depth; 0=automatic (default)"
" depth=NUM maximum search depth; 0=automatic "
"(default)"
msgstr "" msgstr ""
"\n" "\n"
" --lzma1[=OPTIONEN] LZMA1 oder LZMA2; OPTIONEN ist eine durch Kommata\n" " --lzma1[=OPTIONEN] LZMA1 oder LZMA2; OPTIONEN ist eine durch Kommata\n"
" --lzma2[=OPTIONEN] getrennte Liste bestehend aus den folgenden " " --lzma2[=OPTIONEN] getrennte Liste bestehend aus den folgenden Optionen\n"
"Optionen\n"
" (zulässige Werte; Voreinstellung):\n" " (zulässige Werte; Voreinstellung):\n"
" preset=NUM Setze Optionen zurück zu " " preset=NUM Setze Optionen zurück zu Voreinstellung\n"
"Voreinstellung\n"
" (0-9[e])\n" " (0-9[e])\n"
" dict=NUM Wörterbuch Größe (4 KiB - 1536 MiB; 8 " " dict=NUM Wörterbuch Größe (4 KiB - 1536 MiB; 8 MiB)\n"
"MiB)\n" " lc=NUM Anzahl der Literal Kontext Bits (0-4; 3)\n"
" lc=NUM Anzahl der Literal Kontext Bits (0-4; " " lp=NUM Anzahl der Literal Positionsbits (0-4; 0)\n"
"3)\n"
" lp=NUM Anzahl der Literal Positionsbits (0-4; "
"0)\n"
" pb=NUM Anzahl der Positionsbits (0-4; 2)\n" " pb=NUM Anzahl der Positionsbits (0-4; 2)\n"
" mode=MODUS Kompressionsmodus (fast, normal; " " mode=MODUS Kompressionsmodus (fast, normal; normal)\n"
"normal)\n"
" nice=NUM Nice-Länge eines Treffers (2-273; 64)\n" " nice=NUM Nice-Länge eines Treffers (2-273; 64)\n"
" mf=NAME Algorithmus zum Auffinden von\n" " mf=NAME Algorithmus zum Auffinden von\n"
" Übereinstimmungen (hc3, hc4, bt2, bt3, " " Übereinstimmungen (hc3, hc4, bt2, bt3, bt4;\n"
"bt4;\n"
" bt4)\n" " bt4)\n"
" depth=NUM Maximale Suchtiefe; 0=automatisch\n" " depth=NUM Maximale Suchtiefe; 0=automatisch\n"
" (Voreinstellung)" " (Voreinstellung)"
#: src/xz/message.c:1181 #: src/xz/message.c:1176
msgid "" msgid ""
"\n" "\n"
" --x86[=OPTS] x86 BCJ filter (32-bit and 64-bit)\n" " --x86[=OPTS] x86 BCJ filter (32-bit and 64-bit)\n"
@ -706,7 +653,7 @@ msgstr ""
" start=NUM Start-Offset für Konversion\n" " start=NUM Start-Offset für Konversion\n"
" (Voreinstellung=0)" " (Voreinstellung=0)"
#: src/xz/message.c:1193 #: src/xz/message.c:1188
msgid "" msgid ""
"\n" "\n"
" --delta[=OPTS] Delta filter; valid OPTS (valid values; default):\n" " --delta[=OPTS] Delta filter; valid OPTS (valid values; default):\n"
@ -716,11 +663,10 @@ msgstr ""
"\n" "\n"
" --delta[=OPTIONEN] Delta Filter; zulässige Optionen (gültige Werte;\n" " --delta[=OPTIONEN] Delta Filter; zulässige Optionen (gültige Werte;\n"
" Voreinstellung):\n" " Voreinstellung):\n"
" dist=NUM Abstand zwischen den Bytes, die " " dist=NUM Abstand zwischen den Bytes, die voneinander\n"
"voneinander\n"
" subtrahiert werden (1-256; 1)" " subtrahiert werden (1-256; 1)"
#: src/xz/message.c:1201 #: src/xz/message.c:1196
msgid "" msgid ""
"\n" "\n"
" Other options:\n" " Other options:\n"
@ -728,37 +674,33 @@ msgstr ""
"\n" "\n"
" Andere Optionen:\n" " Andere Optionen:\n"
#: src/xz/message.c:1204 #: src/xz/message.c:1199
msgid "" msgid ""
" -q, --quiet suppress warnings; specify twice to suppress errors " " -q, --quiet suppress warnings; specify twice to suppress errors too\n"
"too\n"
" -v, --verbose be verbose; specify twice for even more verbose" " -v, --verbose be verbose; specify twice for even more verbose"
msgstr "" msgstr ""
" -q, --quiet unterdrücke Warnungen; benutze diese Option zweimal\n" " -q, --quiet unterdrücke Warnungen; benutze diese Option zweimal\n"
" um auch Fehlermeldungen zu unterdrücken\n" " um auch Fehlermeldungen zu unterdrücken\n"
" -v, --verbose sei gesprächig; benutze diese Option zweimal um " " -v, --verbose sei gesprächig; benutze diese Option zweimal um noch\n"
"noch\n"
" gesprächiger zu sein" " gesprächiger zu sein"
#: src/xz/message.c:1209 #: src/xz/message.c:1204
msgid " -Q, --no-warn make warnings not affect the exit status" msgid " -Q, --no-warn make warnings not affect the exit status"
msgstr " -Q, --no-warn Warnungen verändern nicht den exit status" msgstr " -Q, --no-warn Warnungen verändern nicht den exit status"
#: src/xz/message.c:1211 #: src/xz/message.c:1206
msgid "" msgid " --robot use machine-parsable messages (useful for scripts)"
" --robot use machine-parsable messages (useful for scripts)"
msgstr "" msgstr ""
" --robot benutze Maschinen-lesbare Meldungen (nützlich für\n" " --robot benutze Maschinen-lesbare Meldungen (nützlich für\n"
" Skripte)" " Skripte)"
#: src/xz/message.c:1214 #: src/xz/message.c:1209
msgid "" msgid ""
" --info-memory display the total amount of RAM and the currently " " --info-memory display the total amount of RAM and the currently active\n"
"active\n"
" memory usage limits, and exit" " memory usage limits, and exit"
msgstr " --info-memory zeige Speicherlimit an und terminiere" msgstr " --info-memory zeige Speicherlimit an und terminiere"
#: src/xz/message.c:1217 #: src/xz/message.c:1212
msgid "" msgid ""
" -h, --help display the short help (lists only the basic options)\n" " -h, --help display the short help (lists only the basic options)\n"
" -H, --long-help display this long help and exit" " -H, --long-help display this long help and exit"
@ -767,21 +709,20 @@ msgstr ""
" Optionen)\n" " Optionen)\n"
" -H, --long-help zeige diese lange Hilfe an und terminiere" " -H, --long-help zeige diese lange Hilfe an und terminiere"
#: src/xz/message.c:1221 #: src/xz/message.c:1216
msgid "" msgid ""
" -h, --help display this short help and exit\n" " -h, --help display this short help and exit\n"
" -H, --long-help display the long help (lists also the advanced options)" " -H, --long-help display the long help (lists also the advanced options)"
msgstr "" msgstr ""
" -h, --help zeige diese kurze Hilfe an und terminiere\n" " -h, --help zeige diese kurze Hilfe an und terminiere\n"
" -H, --long-help zeige die lange Hilfe an (zeigt auch " " -H, --long-help zeige die lange Hilfe an (zeigt auch fortgeschrittene\n"
"fortgeschrittene\n"
" Optionen an)" " Optionen an)"
#: src/xz/message.c:1226 #: src/xz/message.c:1221
msgid " -V, --version display the version number and exit" msgid " -V, --version display the version number and exit"
msgstr " -V, --version zeige Versionsnummer an und terminiere" msgstr " -V, --version zeige Versionsnummer an und terminiere"
#: src/xz/message.c:1228 #: src/xz/message.c:1223
msgid "" msgid ""
"\n" "\n"
"With no FILE, or when FILE is -, read standard input.\n" "With no FILE, or when FILE is -, read standard input.\n"
@ -794,15 +735,14 @@ msgstr ""
#. for this package. Please add _another line_ saying #. for this package. Please add _another line_ saying
#. "Report translation bugs to <...>\n" with the email or WWW #. "Report translation bugs to <...>\n" with the email or WWW
#. address for translation bugs. Thanks. #. address for translation bugs. Thanks.
#: src/xz/message.c:1234 #: src/xz/message.c:1229
#, c-format #, c-format
msgid "Report bugs to <%s> (in English or Finnish).\n" msgid "Report bugs to <%s> (in English or Finnish).\n"
msgstr "" msgstr ""
"Melde Bugs an <%s> (in englisch oder finnisch).\n" "Melde Bugs an <%s> (in englisch oder finnisch).\n"
"Melde Übersetzungsfehler an <maan@systemlinux.org> (in englisch oder " "Melde Übersetzungsfehler an <maan@systemlinux.org> (in englisch oder deutsch).\n"
"deutsch).\n"
#: src/xz/message.c:1236 #: src/xz/message.c:1231
#, c-format #, c-format
msgid "%s home page: <%s>\n" msgid "%s home page: <%s>\n"
msgstr "%s Homepage: <%s>\n" msgstr "%s Homepage: <%s>\n"
@ -810,9 +750,7 @@ msgstr "%s Homepage: <%s>\n"
#: src/xz/options.c:86 #: src/xz/options.c:86
#, c-format #, c-format
msgid "%s: Options must be `name=value' pairs separated with commas" msgid "%s: Options must be `name=value' pairs separated with commas"
msgstr "" msgstr "%s: Optionen müssen in der Form `Name=Wert` gegeben werden, getrennt durch Kommata"
"%s: Optionen müssen in der Form `Name=Wert` gegeben werden, getrennt durch "
"Kommata"
#: src/xz/options.c:93 #: src/xz/options.c:93
#, c-format #, c-format
@ -836,17 +774,12 @@ msgstr "Die Summe aus lc und lp darf höchstens 4 sein"
#: src/xz/options.c:359 #: src/xz/options.c:359
#, c-format #, c-format
msgid "The selected match finder requires at least nice=%<PRIu32>" msgid "The selected match finder requires at least nice=%<PRIu32>"
msgstr "" msgstr "Der ausgewählte Algorithmus zum Auffinden von Übereinstimmungen braucht mindestens nice=%<PRIu32>"
"Der ausgewählte Algorithmus zum Auffinden von Übereinstimmungen braucht "
"mindestens nice=%<PRIu32>"
#: src/xz/suffix.c:79 src/xz/suffix.c:164 #: src/xz/suffix.c:79 src/xz/suffix.c:164
#, c-format #, c-format
msgid "" msgid "%s: With --format=raw, --suffix=.SUF is required unless writing to stdout"
"%s: With --format=raw, --suffix=.SUF is required unless writing to stdout" msgstr "%s: Mit --format=raw ist --sufix=.SUF notwendig, falls nicht nach stdout geschrieben wird"
msgstr ""
"%s: Mit --format=raw ist --sufix=.SUF notwendig, falls nicht nach stdout "
"geschrieben wird"
#: src/xz/suffix.c:99 #: src/xz/suffix.c:99
#, c-format #, c-format

View File

@ -7,10 +7,11 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: xz-utils\n" "Project-Id-Version: xz-utils\n"
"Report-Msgid-Bugs-To: lasse.collin@tukaani.org\n" "Report-Msgid-Bugs-To: lasse.collin@tukaani.org\n"
"POT-Creation-Date: 2010-09-10 14:50+0300\n" "POT-Creation-Date: 2010-10-23 17:48+0300\n"
"PO-Revision-Date: 2010-09-16 21:32+0200\n" "PO-Revision-Date: 2010-09-16 21:32+0200\n"
"Last-Translator: Milo Casagrande <milo@ubuntu.com>\n" "Last-Translator: Milo Casagrande <milo@ubuntu.com>\n"
"Language-Team: Italian <tp@lists.linux.it>\n" "Language-Team: Italian <tp@lists.linux.it>\n"
"Language: it\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@ -43,9 +44,7 @@ msgstr "Il numero massimo di filtri è quattro"
#: src/xz/coder.c:108 #: src/xz/coder.c:108
msgid "Memory usage limit is too low for the given filter setup." msgid "Memory usage limit is too low for the given filter setup."
msgstr "" msgstr "Il limite dell'uso della memoria è troppo basso per l'impostazione del filtro dato."
"Il limite dell'uso della memoria è troppo basso per l'impostazione del "
"filtro dato."
#: src/xz/coder.c:129 #: src/xz/coder.c:129
msgid "Using a preset in raw mode is discouraged." msgid "Using a preset in raw mode is discouraged."
@ -53,8 +52,7 @@ msgstr "Non è consigliato usare un preset nella modalità raw."
#: src/xz/coder.c:131 #: src/xz/coder.c:131
msgid "The exact options of the presets may vary between software versions." msgid "The exact options of the presets may vary between software versions."
msgstr "" msgstr "Le opzioni esatte per i preset possono variare tra le versioni del software."
"Le opzioni esatte per i preset possono variare tra le versioni del software."
#: src/xz/coder.c:157 #: src/xz/coder.c:157
msgid "The .lzma format supports only the LZMA1 filter" msgid "The .lzma format supports only the LZMA1 filter"
@ -75,12 +73,8 @@ msgstr "L'estrazione necessita di %s MiB di memoria."
#: src/xz/coder.c:247 #: src/xz/coder.c:247
#, c-format #, c-format
msgid "" msgid "Adjusted LZMA%c dictionary size from %s MiB to %s MiB to not exceed the memory usage limit of %s MiB"
"Adjusted LZMA%c dictionary size from %s MiB to %s MiB to not exceed the " msgstr "Regolata la dimensione del dizionario LZMA%c da %s MiB a %s MiB per non superare il limite dell'uso della memoria di %s MiB"
"memory usage limit of %s MiB"
msgstr ""
"Regolata la dimensione del dizionario LZMA%c da %s MiB a %s MiB per non "
"superare il limite dell'uso della memoria di %s MiB"
#. TRANSLATORS: When compression or decompression finishes, #. TRANSLATORS: When compression or decompression finishes,
#. and xz is going to remove the source file, xz first checks #. and xz is going to remove the source file, xz first checks
@ -160,8 +154,7 @@ msgstr "%s: chiusura del file non riuscita: %s"
#: src/xz/file_io.c:762 src/xz/file_io.c:946 #: src/xz/file_io.c:762 src/xz/file_io.c:946
#, c-format #, c-format
msgid "%s: Seeking failed when trying to create a sparse file: %s" msgid "%s: Seeking failed when trying to create a sparse file: %s"
msgstr "" msgstr "%s: posizionamento non riuscito nel tentativo di creare un file sparso: %s"
"%s: posizionamento non riuscito nel tentativo di creare un file sparso: %s"
#: src/xz/file_io.c:821 #: src/xz/file_io.c:821
#, c-format #, c-format
@ -212,7 +205,7 @@ msgstr "Nessuno"
#. but the Check ID is known (here 2). This and other "Unknown-N" #. but the Check ID is known (here 2). This and other "Unknown-N"
#. strings are used in tables, so the width must not exceed ten #. strings are used in tables, so the width must not exceed ten
#. columns with a fixed-width font. It's OK to omit the dash if #. columns with a fixed-width font. It's OK to omit the dash if
#. you need space for one extra letter. #. you need space for one extra letter, but don't use spaces.
#: src/xz/list.c:69 #: src/xz/list.c:69
msgid "Unknown-2" msgid "Unknown-2"
msgstr "Sconosc2" msgstr "Sconosc2"
@ -320,12 +313,10 @@ msgstr " Padding dello stream: %s\n"
#: src/xz/list.c:693 #: src/xz/list.c:693
msgid "" msgid ""
" Streams:\n" " Streams:\n"
" Stream Blocks CompOffset UncompOffset CompSize " " Stream Blocks CompOffset UncompOffset CompSize UncompSize Ratio Check Padding"
"UncompSize Ratio Check Padding"
msgstr "" msgstr ""
"Stream:\n" "Stream:\n"
" Stream Blocc. Offset comp. Offset estr. Dim. comp. Dim. " " Stream Blocc. Offset comp. Offset estr. Dim. comp. Dim. estratto Rapp. Contr Padding"
"estratto Rapp. Contr Padding"
#. TRANSLATORS: The second line is column headings. All #. TRANSLATORS: The second line is column headings. All
#. except Check are right aligned; Check is left aligned. #. except Check are right aligned; Check is left aligned.
@ -333,12 +324,10 @@ msgstr ""
#, c-format #, c-format
msgid "" msgid ""
" Blocks:\n" " Blocks:\n"
" Stream Block CompOffset UncompOffset TotalSize " " Stream Block CompOffset UncompOffset TotalSize UncompSize Ratio Check"
"UncompSize Ratio Check"
msgstr "" msgstr ""
" Blocchi:\n" " Blocchi:\n"
" Stream Blocc. Offset comp. Offset estratto Dim. tot. Dim. " " Stream Blocc. Offset comp. Offset estratto Dim. tot. Dim. estratto Rapp. Contr"
"estratto Rapp. Contr"
#. TRANSLATORS: These are additional column headings #. TRANSLATORS: These are additional column headings
#. for the most verbose listing mode. CheckVal #. for the most verbose listing mode. CheckVal
@ -408,80 +397,69 @@ msgstr "%s: fine dell'input durante la lettura dei nomi dei file non attesa"
#: src/xz/main.c:120 #: src/xz/main.c:120
#, c-format #, c-format
msgid "" msgid "%s: Null character found when reading filenames; maybe you meant to use `--files0' instead of `--files'?"
"%s: Null character found when reading filenames; maybe you meant to use `--" msgstr "%s: nessun carattere trovato durante la lettura dei nomi dei file; forse si intendeva usare \"--files0\" invece di \"--files\"?"
"files0' instead of `--files'?"
msgstr ""
"%s: nessun carattere trovato durante la lettura dei nomi dei file; forse si "
"intendeva usare \"--files0\" invece di \"--files\"?"
#: src/xz/main.c:174 #: src/xz/main.c:174
msgid "Compression and decompression with --robot are not supported yet." msgid "Compression and decompression with --robot are not supported yet."
msgstr "La compressione e l'estrazione con --robot non sono ancora supportate." msgstr "La compressione e l'estrazione con --robot non sono ancora supportate."
#: src/xz/main.c:231 #: src/xz/main.c:231
msgid "" msgid "Cannot read data from standard input when reading filenames from standard input"
"Cannot read data from standard input when reading filenames from standard " msgstr "Impossibile leggere i dati dallo standard input durante la lettura dei nomi dei file dallo standard input"
"input"
msgstr ""
"Impossibile leggere i dati dallo standard input durante la lettura dei nomi "
"dei file dallo standard input"
#: src/xz/message.c:800 src/xz/message.c:844 #: src/xz/message.c:792 src/xz/message.c:842
msgid "Internal error (bug)" msgid "Internal error (bug)"
msgstr "Errore interno (bug)" msgstr "Errore interno (bug)"
#: src/xz/message.c:807 #: src/xz/message.c:799
msgid "Cannot establish signal handlers" msgid "Cannot establish signal handlers"
msgstr "Impossibile stabilire i gestori dei segnali" msgstr "Impossibile stabilire i gestori dei segnali"
#: src/xz/message.c:816 #: src/xz/message.c:808
msgid "No integrity check; not verifying file integrity" msgid "No integrity check; not verifying file integrity"
msgstr "" msgstr "Nessun controllo d'integrità; l'integrità del file non viene verificata"
"Nessun controllo d'integrità; l'integrità del file non viene verificata"
#: src/xz/message.c:819 #: src/xz/message.c:811
msgid "Unsupported type of integrity check; not verifying file integrity" msgid "Unsupported type of integrity check; not verifying file integrity"
msgstr "" msgstr "Tipo di controllo di integrità non supportato; l'integrità del file non viene verificata"
"Tipo di controllo di integrità non supportato; l'integrità del file non "
"viene verificata"
#: src/xz/message.c:826 #: src/xz/message.c:818
msgid "Memory usage limit reached" msgid "Memory usage limit reached"
msgstr "Limite di utilizzo della memoria raggiunto" msgstr "Limite di utilizzo della memoria raggiunto"
#: src/xz/message.c:829 #: src/xz/message.c:821
msgid "File format not recognized" msgid "File format not recognized"
msgstr "Formato di file non riconosciuto" msgstr "Formato di file non riconosciuto"
#: src/xz/message.c:832 #: src/xz/message.c:824
msgid "Unsupported options" msgid "Unsupported options"
msgstr "Opzioni non supportate" msgstr "Opzioni non supportate"
#: src/xz/message.c:835 #: src/xz/message.c:827
msgid "Compressed data is corrupt" msgid "Compressed data is corrupt"
msgstr "I dati compressi sono danneggiati" msgstr "I dati compressi sono danneggiati"
#: src/xz/message.c:838 #: src/xz/message.c:830
msgid "Unexpected end of input" msgid "Unexpected end of input"
msgstr "Fine dell'input non attesa" msgstr "Fine dell'input non attesa"
#: src/xz/message.c:886 #: src/xz/message.c:881
#, c-format #, c-format
msgid "%s MiB of memory is required. The limit is %s." msgid "%s MiB of memory is required. The limit is %s."
msgstr "%s MiB di memoria sono richiesti. Il limite è %s." msgstr "%s MiB di memoria sono richiesti. Il limite è %s."
#: src/xz/message.c:1053 #: src/xz/message.c:1048
#, c-format #, c-format
msgid "%s: Filter chain: %s\n" msgid "%s: Filter chain: %s\n"
msgstr "%s: catena di filtri: %s\n" msgstr "%s: catena di filtri: %s\n"
#: src/xz/message.c:1063 #: src/xz/message.c:1058
#, c-format #, c-format
msgid "Try `%s --help' for more information." msgid "Try `%s --help' for more information."
msgstr "Provare \"%s --help\" per maggiori informazioni." msgstr "Provare \"%s --help\" per maggiori informazioni."
#: src/xz/message.c:1089 #: src/xz/message.c:1084
#, c-format #, c-format
msgid "" msgid ""
"Usage: %s [OPTION]... [FILE]...\n" "Usage: %s [OPTION]... [FILE]...\n"
@ -492,18 +470,15 @@ msgstr ""
"Comprime o estrae i FILE nel formato .xz.\n" "Comprime o estrae i FILE nel formato .xz.\n"
"\n" "\n"
#: src/xz/message.c:1096 #: src/xz/message.c:1091
msgid "" msgid "Mandatory arguments to long options are mandatory for short options too.\n"
"Mandatory arguments to long options are mandatory for short options too.\n" msgstr "Gli argomenti obbligatori per le opzioni lunghe lo sono anche per quelle brevi.\n"
msgstr ""
"Gli argomenti obbligatori per le opzioni lunghe lo sono anche per quelle "
"brevi.\n"
#: src/xz/message.c:1100 #: src/xz/message.c:1095
msgid " Operation mode:\n" msgid " Operation mode:\n"
msgstr " Modalità di operazione:\n" msgstr " Modalità di operazione:\n"
#: src/xz/message.c:1103 #: src/xz/message.c:1098
msgid "" msgid ""
" -z, --compress force compression\n" " -z, --compress force compression\n"
" -d, --decompress force decompression\n" " -d, --decompress force decompression\n"
@ -515,7 +490,7 @@ msgstr ""
" -t, --test Verifica l'integrità dei file compressi\n" " -t, --test Verifica l'integrità dei file compressi\n"
" -l, --list Elenca informazioni sui file .xz" " -l, --list Elenca informazioni sui file .xz"
#: src/xz/message.c:1109 #: src/xz/message.c:1104
msgid "" msgid ""
"\n" "\n"
" Operation modifiers:\n" " Operation modifiers:\n"
@ -523,40 +498,35 @@ msgstr ""
"\n" "\n"
" Modificatori di operazioni:\n" " Modificatori di operazioni:\n"
#: src/xz/message.c:1112 #: src/xz/message.c:1107
msgid "" msgid ""
" -k, --keep keep (don't delete) input files\n" " -k, --keep keep (don't delete) input files\n"
" -f, --force force overwrite of output file and (de)compress links\n" " -f, --force force overwrite of output file and (de)compress links\n"
" -c, --stdout write to standard output and don't delete input files" " -c, --stdout write to standard output and don't delete input files"
msgstr "" msgstr ""
" -k, --keep Mantiene (non elimina) i file di input\n" " -k, --keep Mantiene (non elimina) i file di input\n"
" -f, --force Forza la sovrascrittura dell'output e comprime/estrae " " -f, --force Forza la sovrascrittura dell'output e comprime/estrae i\n"
"i\n"
" collegamenti\n" " collegamenti\n"
" -c, --stdout Scrive sullo standard output e non elimina i file di " " -c, --stdout Scrive sullo standard output e non elimina i file di input"
"input"
#: src/xz/message.c:1118 #: src/xz/message.c:1113
msgid "" msgid ""
" --no-sparse do not create sparse files when decompressing\n" " --no-sparse do not create sparse files when decompressing\n"
" -S, --suffix=.SUF use the suffix `.SUF' on compressed files\n" " -S, --suffix=.SUF use the suffix `.SUF' on compressed files\n"
" --files[=FILE] read filenames to process from FILE; if FILE is\n" " --files[=FILE] read filenames to process from FILE; if FILE is\n"
" omitted, filenames are read from the standard input;\n" " omitted, filenames are read from the standard input;\n"
" filenames must be terminated with the newline " " filenames must be terminated with the newline character\n"
"character\n"
" --files0[=FILE] like --files but use the null character as terminator" " --files0[=FILE] like --files but use the null character as terminator"
msgstr "" msgstr ""
" --no-sparse Non crea file sparsi durante l'estrazione\n" " --no-sparse Non crea file sparsi durante l'estrazione\n"
" -S, --suffix=.SUF Usa il suffisso \".SUF\" sui file compressi\n" " -S, --suffix=.SUF Usa il suffisso \".SUF\" sui file compressi\n"
" --files=[FILE] Legge i nomi dei file da elaborare da FILE; se FILE è\n" " --files=[FILE] Legge i nomi dei file da elaborare da FILE; se FILE è\n"
" omesso, i nomi dei file sono letti dallo standard " " omesso, i nomi dei file sono letti dallo standard input;\n"
"input;\n" " i nomi dei file devono essere terminati con un carattere\n"
" i nomi dei file devono essere terminati con un "
"carattere\n"
" di newline\n" " di newline\n"
" --files0=[FILE] Come --files ma usa il carattere null come terminatore" " --files0=[FILE] Come --files ma usa il carattere null come terminatore"
#: src/xz/message.c:1126 #: src/xz/message.c:1121
msgid "" msgid ""
"\n" "\n"
" Basic file format and compression options:\n" " Basic file format and compression options:\n"
@ -564,76 +534,62 @@ msgstr ""
"\n" "\n"
" Formato file di base e opzioni di compressione:\n" " Formato file di base e opzioni di compressione:\n"
#: src/xz/message.c:1128 #: src/xz/message.c:1123
msgid "" msgid ""
" -F, --format=FMT file format to encode or decode; possible values are\n" " -F, --format=FMT file format to encode or decode; possible values are\n"
" `auto' (default), `xz', `lzma', and `raw'\n" " `auto' (default), `xz', `lzma', and `raw'\n"
" -C, --check=CHECK integrity check type: `none' (use with caution),\n" " -C, --check=CHECK integrity check type: `none' (use with caution),\n"
" `crc32', `crc64' (default), or `sha256'" " `crc32', `crc64' (default), or `sha256'"
msgstr "" msgstr ""
" -F, --format=FMT Formato file per codificare o decodificare; i " " -F, --format=FMT Formato file per codificare o decodificare; i possibili\n"
"possibili\n" " valori sono \"auto\" (predefinito) \"xz\", \"lzma\" e \"raw\"\n"
" valori sono \"auto\" (predefinito) \"xz\", \"lzma\" e " " -C, --check=CHECK Tipo di verifica integrità: \"none\" (usare con attenzione),\n"
"\"raw\"\n"
" -C, --check=CHECK Tipo di verifica integrità: \"none\" (usare con "
"attenzione),\n"
" \"crc32\", \"crc64\" (predefinito) o \"sha256\"" " \"crc32\", \"crc64\" (predefinito) o \"sha256\""
#: src/xz/message.c:1135 #: src/xz/message.c:1130
msgid "" msgid ""
" -0 ... -9 compression preset; default is 6; take compressor " " -0 ... -9 compression preset; default is 6; take compressor *and*\n"
"*and*\n" " decompressor memory usage into account before using 7-9!"
" decompressor memory usage into account before using 7-"
"9!"
msgstr "" msgstr ""
" -0 ... -9 Preset di compressione; predefinito è 6; tenere a " " -0 ... -9 Preset di compressione; predefinito è 6; tenere a mente\n"
"mente\n" " l'utilizzo di memoria per comprimere ed estrarre prima\n"
" l'utilizzo di memoria per comprimere ed estrarre "
"prima\n"
" di usare 7-9" " di usare 7-9"
#: src/xz/message.c:1139 #: src/xz/message.c:1134
msgid "" msgid ""
" -e, --extreme try to improve compression ratio by using more CPU " " -e, --extreme try to improve compression ratio by using more CPU time;\n"
"time;\n"
" does not affect decompressor memory requirements" " does not affect decompressor memory requirements"
msgstr "" msgstr ""
" -e, --extreme Tenta di migliorare il rapporto di compressione\n" " -e, --extreme Tenta di migliorare il rapporto di compressione\n"
" utilizzando più tempo di CPU; non cambia i requisiti " " utilizzando più tempo di CPU; non cambia i requisiti di\n"
"di\n"
" memoria in fase di estrazione" " memoria in fase di estrazione"
#: src/xz/message.c:1144 #: src/xz/message.c:1139
#, no-c-format #, no-c-format
msgid "" msgid ""
" --memlimit-compress=LIMIT\n" " --memlimit-compress=LIMIT\n"
" --memlimit-decompress=LIMIT\n" " --memlimit-decompress=LIMIT\n"
" -M, --memlimit=LIMIT\n" " -M, --memlimit=LIMIT\n"
" set memory usage limit for compression, " " set memory usage limit for compression, decompression,\n"
"decompression,\n"
" or both; LIMIT is in bytes, % of RAM, or 0 for defaults" " or both; LIMIT is in bytes, % of RAM, or 0 for defaults"
msgstr "" msgstr ""
" --memlimit-compress=LIMIT\n" " --memlimit-compress=LIMIT\n"
" --memlimit-decompress=LIMIT\n" " --memlimit-decompress=LIMIT\n"
" -M, --memlimit=LIMIT\n" " -M, --memlimit=LIMIT\n"
" Imposta il limite di utilizzo della memoria per la\n" " Imposta il limite di utilizzo della memoria per la\n"
" compressione, l'estrazione o entrambe; LIMIT è in " " compressione, l'estrazione o entrambe; LIMIT è in byte,\n"
"byte,\n"
" % della memoria RAM oppure 0 per il valore predefinito" " % della memoria RAM oppure 0 per il valore predefinito"
#: src/xz/message.c:1151 #: src/xz/message.c:1146
msgid "" msgid ""
" --no-adjust if compression settings exceed the memory usage " " --no-adjust if compression settings exceed the memory usage limit,\n"
"limit,\n" " give an error instead of adjusting the settings downwards"
" give an error instead of adjusting the settings "
"downwards"
msgstr "" msgstr ""
" --no-adjust Se le impostazioni di compressione eccedono il limite " " --no-adjust Se le impostazioni di compressione eccedono il limite di\n"
"di\n"
" utilizzo della memoria, lancia un errore invece di\n" " utilizzo della memoria, lancia un errore invece di\n"
" utilizzare valori più piccoli" " utilizzare valori più piccoli"
#: src/xz/message.c:1157 #: src/xz/message.c:1152
msgid "" msgid ""
"\n" "\n"
" Custom filter chain for compression (alternative for using presets):" " Custom filter chain for compression (alternative for using presets):"
@ -642,13 +598,11 @@ msgstr ""
" Catena di filtri personalizzati per la compressione (alternative per\n" " Catena di filtri personalizzati per la compressione (alternative per\n"
" l'utilizzo di preset):" " l'utilizzo di preset):"
#: src/xz/message.c:1166 #: src/xz/message.c:1161
msgid "" msgid ""
"\n" "\n"
" --lzma1[=OPTS] LZMA1 or LZMA2; OPTS is a comma-separated list of zero " " --lzma1[=OPTS] LZMA1 or LZMA2; OPTS is a comma-separated list of zero or\n"
"or\n" " --lzma2[=OPTS] more of the following options (valid values; default):\n"
" --lzma2[=OPTS] more of the following options (valid values; "
"default):\n"
" preset=PRE reset options to a preset (0-9[e])\n" " preset=PRE reset options to a preset (0-9[e])\n"
" dict=NUM dictionary size (4KiB - 1536MiB; 8MiB)\n" " dict=NUM dictionary size (4KiB - 1536MiB; 8MiB)\n"
" lc=NUM number of literal context bits (0-4; 3)\n" " lc=NUM number of literal context bits (0-4; 3)\n"
@ -656,24 +610,17 @@ msgid ""
" pb=NUM number of position bits (0-4; 2)\n" " pb=NUM number of position bits (0-4; 2)\n"
" mode=MODE compression mode (fast, normal; normal)\n" " mode=MODE compression mode (fast, normal; normal)\n"
" nice=NUM nice length of a match (2-273; 64)\n" " nice=NUM nice length of a match (2-273; 64)\n"
" mf=NAME match finder (hc3, hc4, bt2, bt3, bt4; " " mf=NAME match finder (hc3, hc4, bt2, bt3, bt4; bt4)\n"
"bt4)\n" " depth=NUM maximum search depth; 0=automatic (default)"
" depth=NUM maximum search depth; 0=automatic "
"(default)"
msgstr "" msgstr ""
"\n" "\n"
" --lzma1[=OPZ] LZMA1 o LZMA2; OPZ è un elenco separato da virgole di " " --lzma1[=OPZ] LZMA1 o LZMA2; OPZ è un elenco separato da virgole di zero\n"
"zero\n" " --lzma2[=OPZ] o più delle seguenti opzioni (valori validi; predefinito):\n"
" --lzma2[=OPZ] o più delle seguenti opzioni (valori validi; " " preset=NUM Reimposta le opzioni al preset NUM (0-9[e])\n"
"predefinito):\n"
" preset=NUM Reimposta le opzioni al preset NUM (0-9"
"[e])\n"
" dict=NUM Dimensione del dizionario\n" " dict=NUM Dimensione del dizionario\n"
" (4KiB - 1536MiB; 8MiB)\n" " (4KiB - 1536MiB; 8MiB)\n"
" lc=NUM Numero di bit letterali di contesto (0-4; " " lc=NUM Numero di bit letterali di contesto (0-4; 3)\n"
"3)\n" " lp=NUM Numero di bit letterali di posizione (0-4; 0)\n"
" lp=NUM Numero di bit letterali di posizione (0-"
"4; 0)\n"
" pb=NUM Numero di bit di posizione (0-4; 2)\n" " pb=NUM Numero di bit di posizione (0-4; 2)\n"
" mode=MODE Modalità di compressione\n" " mode=MODE Modalità di compressione\n"
" (fast, normal; normal)\n" " (fast, normal; normal)\n"
@ -681,11 +628,10 @@ msgstr ""
" (2-273; 64)\n" " (2-273; 64)\n"
" mf=NAME Strumento per cercare corrispondenze\n" " mf=NAME Strumento per cercare corrispondenze\n"
" (hc3, hc4, bt2, bt3, bt4; bt4)\n" " (hc3, hc4, bt2, bt3, bt4; bt4)\n"
" depth=NUM Profondità massima di ricerca; " " depth=NUM Profondità massima di ricerca; 0=automatica\n"
"0=automatica\n"
" (predefinito)" " (predefinito)"
#: src/xz/message.c:1181 #: src/xz/message.c:1176
msgid "" msgid ""
"\n" "\n"
" --x86[=OPTS] x86 BCJ filter (32-bit and 64-bit)\n" " --x86[=OPTS] x86 BCJ filter (32-bit and 64-bit)\n"
@ -708,7 +654,7 @@ msgstr ""
" start=NUM Offset iniziale per le conversioni\n" " start=NUM Offset iniziale per le conversioni\n"
" (predefinito=0)" " (predefinito=0)"
#: src/xz/message.c:1193 #: src/xz/message.c:1188
msgid "" msgid ""
"\n" "\n"
" --delta[=OPTS] Delta filter; valid OPTS (valid values; default):\n" " --delta[=OPTS] Delta filter; valid OPTS (valid values; default):\n"
@ -720,7 +666,7 @@ msgstr ""
" dist=NUM Distanza tra byte sottratti\n" " dist=NUM Distanza tra byte sottratti\n"
" gli uni dagli altri (1-256; 1)" " gli uni dagli altri (1-256; 1)"
#: src/xz/message.c:1201 #: src/xz/message.c:1196
msgid "" msgid ""
"\n" "\n"
" Other options:\n" " Other options:\n"
@ -728,39 +674,33 @@ msgstr ""
"\n" "\n"
" Altre opzioni:\n" " Altre opzioni:\n"
#: src/xz/message.c:1204 #: src/xz/message.c:1199
msgid "" msgid ""
" -q, --quiet suppress warnings; specify twice to suppress errors " " -q, --quiet suppress warnings; specify twice to suppress errors too\n"
"too\n"
" -v, --verbose be verbose; specify twice for even more verbose" " -v, --verbose be verbose; specify twice for even more verbose"
msgstr "" msgstr ""
" -q, --quiet Sopprime gli avvisi; specificare due volte per " " -q, --quiet Sopprime gli avvisi; specificare due volte per sopprimere\n"
"sopprimere\n"
" anche gli errori\n" " anche gli errori\n"
" -v, --verbose Output prolisso; specificare due volte per output " " -v, --verbose Output prolisso; specificare due volte per output ancora\n"
"ancora\n"
" più prolisso" " più prolisso"
#: src/xz/message.c:1209 #: src/xz/message.c:1204
msgid " -Q, --no-warn make warnings not affect the exit status" msgid " -Q, --no-warn make warnings not affect the exit status"
msgstr " -Q, --no-warn Gli avvisi non influenzano lo stato d'uscita" msgstr " -Q, --no-warn Gli avvisi non influenzano lo stato d'uscita"
#: src/xz/message.c:1211 #: src/xz/message.c:1206
msgid "" msgid " --robot use machine-parsable messages (useful for scripts)"
" --robot use machine-parsable messages (useful for scripts)"
msgstr " --robot Usa messaggi analizzabili (utile per gli script)" msgstr " --robot Usa messaggi analizzabili (utile per gli script)"
#: src/xz/message.c:1214 #: src/xz/message.c:1209
msgid "" msgid ""
" --info-memory display the total amount of RAM and the currently " " --info-memory display the total amount of RAM and the currently active\n"
"active\n"
" memory usage limits, and exit" " memory usage limits, and exit"
msgstr "" msgstr ""
" --info-memory Visualizza la quantità totale di RAM, il limite " " --info-memory Visualizza la quantità totale di RAM, il limite attuale\n"
"attuale\n"
" attivo di utilizzo della memore ed esce" " attivo di utilizzo della memore ed esce"
#: src/xz/message.c:1217 #: src/xz/message.c:1212
msgid "" msgid ""
" -h, --help display the short help (lists only the basic options)\n" " -h, --help display the short help (lists only the basic options)\n"
" -H, --long-help display this long help and exit" " -H, --long-help display this long help and exit"
@ -768,7 +708,7 @@ msgstr ""
" -h, --help Stampa l'aiuto breve (elenca solo le opzioni di base)\n" " -h, --help Stampa l'aiuto breve (elenca solo le opzioni di base)\n"
" -H, --long-help Stampa questo lungo aiuto ed esce" " -H, --long-help Stampa questo lungo aiuto ed esce"
#: src/xz/message.c:1221 #: src/xz/message.c:1216
msgid "" msgid ""
" -h, --help display this short help and exit\n" " -h, --help display this short help and exit\n"
" -H, --long-help display the long help (lists also the advanced options)" " -H, --long-help display the long help (lists also the advanced options)"
@ -776,11 +716,11 @@ msgstr ""
" -h, --help Stampa questo breve aiuto ed esce\n" " -h, --help Stampa questo breve aiuto ed esce\n"
" -H, --long-help Stampa l'aiuto lungo (elenca anche le opzioni avanzate)" " -H, --long-help Stampa l'aiuto lungo (elenca anche le opzioni avanzate)"
#: src/xz/message.c:1226 #: src/xz/message.c:1221
msgid " -V, --version display the version number and exit" msgid " -V, --version display the version number and exit"
msgstr " -V, --version Stampa il numero della versione ed esce" msgstr " -V, --version Stampa il numero della versione ed esce"
#: src/xz/message.c:1228 #: src/xz/message.c:1223
msgid "" msgid ""
"\n" "\n"
"With no FILE, or when FILE is -, read standard input.\n" "With no FILE, or when FILE is -, read standard input.\n"
@ -792,14 +732,14 @@ msgstr ""
#. for this package. Please add _another line_ saying #. for this package. Please add _another line_ saying
#. "Report translation bugs to <...>\n" with the email or WWW #. "Report translation bugs to <...>\n" with the email or WWW
#. address for translation bugs. Thanks. #. address for translation bugs. Thanks.
#: src/xz/message.c:1234 #: src/xz/message.c:1229
#, c-format #, c-format
msgid "Report bugs to <%s> (in English or Finnish).\n" msgid "Report bugs to <%s> (in English or Finnish).\n"
msgstr "" msgstr ""
"Segnalare i bug a <%s> (in inglese o finlandese).\n" "Segnalare i bug a <%s> (in inglese o finlandese).\n"
"Segnalare i bug di traduzione a <tp@lists.linux.it>.\n" "Segnalare i bug di traduzione a <tp@lists.linux.it>.\n"
#: src/xz/message.c:1236 #: src/xz/message.c:1231
#, c-format #, c-format
msgid "%s home page: <%s>\n" msgid "%s home page: <%s>\n"
msgstr "Sito web di %s: <%s>\n" msgstr "Sito web di %s: <%s>\n"
@ -807,8 +747,7 @@ msgstr "Sito web di %s: <%s>\n"
#: src/xz/options.c:86 #: src/xz/options.c:86
#, c-format #, c-format
msgid "%s: Options must be `name=value' pairs separated with commas" msgid "%s: Options must be `name=value' pairs separated with commas"
msgstr "" msgstr "%s: le opzioni devono essere coppie \"nome=valore\" separate da virgole"
"%s: le opzioni devono essere coppie \"nome=valore\" separate da virgole"
#: src/xz/options.c:93 #: src/xz/options.c:93
#, c-format #, c-format
@ -832,17 +771,12 @@ msgstr "La somma di lc e lp non deve superare 4"
#: src/xz/options.c:359 #: src/xz/options.c:359
#, c-format #, c-format
msgid "The selected match finder requires at least nice=%<PRIu32>" msgid "The selected match finder requires at least nice=%<PRIu32>"
msgstr "" msgstr "Lo strumento per cercare corrispondenze selezionato richiede almeno nice=%<PRIu32>"
"Lo strumento per cercare corrispondenze selezionato richiede almeno nice=%"
"<PRIu32>"
#: src/xz/suffix.c:79 src/xz/suffix.c:164 #: src/xz/suffix.c:79 src/xz/suffix.c:164
#, c-format #, c-format
msgid "" msgid "%s: With --format=raw, --suffix=.SUF is required unless writing to stdout"
"%s: With --format=raw, --suffix=.SUF is required unless writing to stdout" msgstr "%s: con --format=raw, --suffix=.SUF è richiesto a meno che non si scriva sullo stdout"
msgstr ""
"%s: con --format=raw, --suffix=.SUF è richiesto a meno che non si scriva "
"sullo stdout"
#: src/xz/suffix.c:99 #: src/xz/suffix.c:99
#, c-format #, c-format
@ -871,15 +805,12 @@ msgstr "%s: suffisso del moltiplicatore non valido"
#: src/xz/util.c:105 #: src/xz/util.c:105
msgid "Valid suffixes are `KiB' (2^10), `MiB' (2^20), and `GiB' (2^30)." msgid "Valid suffixes are `KiB' (2^10), `MiB' (2^20), and `GiB' (2^30)."
msgstr "" msgstr "I suffissi validi sono \"KiB\" (2^10), \"MiB\" (2^20), e \"GiB\" (2^30)."
"I suffissi validi sono \"KiB\" (2^10), \"MiB\" (2^20), e \"GiB\" (2^30)."
#: src/xz/util.c:122 #: src/xz/util.c:122
#, c-format #, c-format
msgid "Value of the option `%s' must be in the range [%<PRIu64>, %<PRIu64>]" msgid "Value of the option `%s' must be in the range [%<PRIu64>, %<PRIu64>]"
msgstr "" msgstr "Il valore dell'opzione \"%s\" deve essere nell'intervallo [%<PRIu64>, %<PRIu64>]"
"Il valore dell'opzione \"%s\" deve essere nell'intervallo [%<PRIu64>, %"
"<PRIu64>]"
#: src/xz/util.c:247 #: src/xz/util.c:247
msgid "Empty filename, skipping" msgid "Empty filename, skipping"

736
contrib/xz/po/xz.pot Normal file
View File

@ -0,0 +1,736 @@
# SOME DESCRIPTIVE TITLE.
# This file is put in the public domain.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: lasse.collin@tukaani.org\n"
"POT-Creation-Date: 2010-10-23 17:48+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: src/xz/args.c:333
#, c-format
msgid "%s: Unknown file format type"
msgstr ""
#: src/xz/args.c:356 src/xz/args.c:364
#, c-format
msgid "%s: Unsupported integrity check type"
msgstr ""
#: src/xz/args.c:382
msgid "Only one file can be specified with `--files' or `--files0'."
msgstr ""
#: src/xz/args.c:445
#, c-format
msgid "The environment variable %s contains too many arguments"
msgstr ""
#: src/xz/coder.c:95
msgid "Maximum number of filters is four"
msgstr ""
#: src/xz/coder.c:108
msgid "Memory usage limit is too low for the given filter setup."
msgstr ""
#: src/xz/coder.c:129
msgid "Using a preset in raw mode is discouraged."
msgstr ""
#: src/xz/coder.c:131
msgid "The exact options of the presets may vary between software versions."
msgstr ""
#: src/xz/coder.c:157
msgid "The .lzma format supports only the LZMA1 filter"
msgstr ""
#: src/xz/coder.c:165
msgid "LZMA1 cannot be used with the .xz format"
msgstr ""
#: src/xz/coder.c:182
msgid "Unsupported filter chain or filter options"
msgstr ""
#: src/xz/coder.c:190
#, c-format
msgid "Decompression will need %s MiB of memory."
msgstr ""
#: src/xz/coder.c:247
#, c-format
msgid "Adjusted LZMA%c dictionary size from %s MiB to %s MiB to not exceed the memory usage limit of %s MiB"
msgstr ""
#. TRANSLATORS: When compression or decompression finishes,
#. and xz is going to remove the source file, xz first checks
#. if the source file still exists, and if it does, does its
#. device and inode numbers match what xz saw when it opened
#. the source file. If these checks fail, this message is
#. shown, %s being the filename, and the file is not deleted.
#. The check for device and inode numbers is there, because
#. it is possible that the user has put a new file in place
#. of the original file, and in that case it obviously
#. shouldn't be removed.
#: src/xz/file_io.c:137
#, c-format
msgid "%s: File seems to have been moved, not removing"
msgstr ""
#: src/xz/file_io.c:144 src/xz/file_io.c:590
#, c-format
msgid "%s: Cannot remove: %s"
msgstr ""
#: src/xz/file_io.c:169
#, c-format
msgid "%s: Cannot set the file owner: %s"
msgstr ""
#: src/xz/file_io.c:175
#, c-format
msgid "%s: Cannot set the file group: %s"
msgstr ""
#: src/xz/file_io.c:194
#, c-format
msgid "%s: Cannot set the file permissions: %s"
msgstr ""
#: src/xz/file_io.c:337 src/xz/file_io.c:420
#, c-format
msgid "%s: Is a symbolic link, skipping"
msgstr ""
#: src/xz/file_io.c:455
#, c-format
msgid "%s: Is a directory, skipping"
msgstr ""
#: src/xz/file_io.c:462
#, c-format
msgid "%s: Not a regular file, skipping"
msgstr ""
#: src/xz/file_io.c:479
#, c-format
msgid "%s: File has setuid or setgid bit set, skipping"
msgstr ""
#: src/xz/file_io.c:486
#, c-format
msgid "%s: File has sticky bit set, skipping"
msgstr ""
#: src/xz/file_io.c:493
#, c-format
msgid "%s: Input file has more than one hard link, skipping"
msgstr ""
#: src/xz/file_io.c:714
#, c-format
msgid "Error restoring the O_APPEND flag to standard output: %s"
msgstr ""
#: src/xz/file_io.c:726
#, c-format
msgid "%s: Closing the file failed: %s"
msgstr ""
#: src/xz/file_io.c:762 src/xz/file_io.c:946
#, c-format
msgid "%s: Seeking failed when trying to create a sparse file: %s"
msgstr ""
#: src/xz/file_io.c:821
#, c-format
msgid "%s: Read error: %s"
msgstr ""
#: src/xz/file_io.c:844
#, c-format
msgid "%s: Error seeking the file: %s"
msgstr ""
#: src/xz/file_io.c:854
#, c-format
msgid "%s: Unexpected end of file"
msgstr ""
#: src/xz/file_io.c:904
#, c-format
msgid "%s: Write error: %s"
msgstr ""
#: src/xz/hardware.c:100
msgid "Disabled"
msgstr ""
#. TRANSLATORS: Test with "xz --info-memory" to see if
#. the alignment looks nice.
#: src/xz/hardware.c:119
msgid "Total amount of physical memory (RAM): "
msgstr ""
#: src/xz/hardware.c:121
msgid "Memory usage limit for compression: "
msgstr ""
#: src/xz/hardware.c:123
msgid "Memory usage limit for decompression: "
msgstr ""
#. TRANSLATORS: Indicates that there is no integrity check.
#. This string is used in tables, so the width must not
#. exceed ten columns with a fixed-width font.
#: src/xz/list.c:62
msgid "None"
msgstr ""
#. TRANSLATORS: Indicates that integrity check name is not known,
#. but the Check ID is known (here 2). This and other "Unknown-N"
#. strings are used in tables, so the width must not exceed ten
#. columns with a fixed-width font. It's OK to omit the dash if
#. you need space for one extra letter, but don't use spaces.
#: src/xz/list.c:69
msgid "Unknown-2"
msgstr ""
#: src/xz/list.c:70
msgid "Unknown-3"
msgstr ""
#: src/xz/list.c:72
msgid "Unknown-5"
msgstr ""
#: src/xz/list.c:73
msgid "Unknown-6"
msgstr ""
#: src/xz/list.c:74
msgid "Unknown-7"
msgstr ""
#: src/xz/list.c:75
msgid "Unknown-8"
msgstr ""
#: src/xz/list.c:76
msgid "Unknown-9"
msgstr ""
#: src/xz/list.c:78
msgid "Unknown-11"
msgstr ""
#: src/xz/list.c:79
msgid "Unknown-12"
msgstr ""
#: src/xz/list.c:80
msgid "Unknown-13"
msgstr ""
#: src/xz/list.c:81
msgid "Unknown-14"
msgstr ""
#: src/xz/list.c:82
msgid "Unknown-15"
msgstr ""
#: src/xz/list.c:126
#, c-format
msgid "%s: File is empty"
msgstr ""
#: src/xz/list.c:131
#, c-format
msgid "%s: Too small to be a valid .xz file"
msgstr ""
#. TRANSLATORS: These are column headings. From Strms (Streams)
#. to Ratio, the columns are right aligned. Check and Filename
#. are left aligned. If you need longer words, it's OK to
#. use two lines here. Test with "xz -l foo.xz".
#: src/xz/list.c:612
msgid "Strms Blocks Compressed Uncompressed Ratio Check Filename"
msgstr ""
#: src/xz/list.c:652
#, c-format
msgid " Streams: %s\n"
msgstr ""
#: src/xz/list.c:654
#, c-format
msgid " Blocks: %s\n"
msgstr ""
#: src/xz/list.c:656
#, c-format
msgid " Compressed size: %s\n"
msgstr ""
#: src/xz/list.c:659
#, c-format
msgid " Uncompressed size: %s\n"
msgstr ""
#: src/xz/list.c:662
#, c-format
msgid " Ratio: %s\n"
msgstr ""
#: src/xz/list.c:664
#, c-format
msgid " Check: %s\n"
msgstr ""
#: src/xz/list.c:665
#, c-format
msgid " Stream padding: %s\n"
msgstr ""
#. TRANSLATORS: The second line is column headings. All except
#. Check are right aligned; Check is left aligned. Test with
#. "xz -lv foo.xz".
#: src/xz/list.c:693
msgid ""
" Streams:\n"
" Stream Blocks CompOffset UncompOffset CompSize UncompSize Ratio Check Padding"
msgstr ""
#. TRANSLATORS: The second line is column headings. All
#. except Check are right aligned; Check is left aligned.
#: src/xz/list.c:748
#, c-format
msgid ""
" Blocks:\n"
" Stream Block CompOffset UncompOffset TotalSize UncompSize Ratio Check"
msgstr ""
#. TRANSLATORS: These are additional column headings
#. for the most verbose listing mode. CheckVal
#. (Check value), Flags, and Filters are left aligned.
#. Header (Block Header Size), CompSize, and MemUsage
#. are right aligned. %*s is replaced with 0-120
#. spaces to make the CheckVal column wide enough.
#. Test with "xz -lvv foo.xz".
#: src/xz/list.c:760
#, c-format
msgid " CheckVal %*s Header Flags CompSize MemUsage Filters"
msgstr ""
#: src/xz/list.c:838 src/xz/list.c:1007
#, c-format
msgid " Memory needed: %s MiB\n"
msgstr ""
#: src/xz/list.c:840 src/xz/list.c:1009
#, c-format
msgid " Sizes in headers: %s\n"
msgstr ""
#: src/xz/list.c:841 src/xz/list.c:1010
msgid "Yes"
msgstr ""
#: src/xz/list.c:841 src/xz/list.c:1010
msgid "No"
msgstr ""
#. TRANSLATORS: %s is an integer. Only the plural form of this
#. message is used (e.g. "2 files"). Test with "xz -l foo.xz bar.xz".
#: src/xz/list.c:986
#, c-format
msgid "%s file\n"
msgid_plural "%s files\n"
msgstr[0] ""
msgstr[1] ""
#: src/xz/list.c:999
msgid "Totals:"
msgstr ""
#: src/xz/list.c:1000
#, c-format
msgid " Number of files: %s\n"
msgstr ""
#: src/xz/list.c:1072
msgid "--list works only on .xz files (--format=xz or --format=auto)"
msgstr ""
#: src/xz/list.c:1078
msgid "--list does not support reading from standard input"
msgstr ""
#: src/xz/main.c:89
#, c-format
msgid "%s: Error reading filenames: %s"
msgstr ""
#: src/xz/main.c:96
#, c-format
msgid "%s: Unexpected end of input when reading filenames"
msgstr ""
#: src/xz/main.c:120
#, c-format
msgid "%s: Null character found when reading filenames; maybe you meant to use `--files0' instead of `--files'?"
msgstr ""
#: src/xz/main.c:174
msgid "Compression and decompression with --robot are not supported yet."
msgstr ""
#: src/xz/main.c:231
msgid "Cannot read data from standard input when reading filenames from standard input"
msgstr ""
#: src/xz/message.c:792 src/xz/message.c:842
msgid "Internal error (bug)"
msgstr ""
#: src/xz/message.c:799
msgid "Cannot establish signal handlers"
msgstr ""
#: src/xz/message.c:808
msgid "No integrity check; not verifying file integrity"
msgstr ""
#: src/xz/message.c:811
msgid "Unsupported type of integrity check; not verifying file integrity"
msgstr ""
#: src/xz/message.c:818
msgid "Memory usage limit reached"
msgstr ""
#: src/xz/message.c:821
msgid "File format not recognized"
msgstr ""
#: src/xz/message.c:824
msgid "Unsupported options"
msgstr ""
#: src/xz/message.c:827
msgid "Compressed data is corrupt"
msgstr ""
#: src/xz/message.c:830
msgid "Unexpected end of input"
msgstr ""
#: src/xz/message.c:881
#, c-format
msgid "%s MiB of memory is required. The limit is %s."
msgstr ""
#: src/xz/message.c:1048
#, c-format
msgid "%s: Filter chain: %s\n"
msgstr ""
#: src/xz/message.c:1058
#, c-format
msgid "Try `%s --help' for more information."
msgstr ""
#: src/xz/message.c:1084
#, c-format
msgid ""
"Usage: %s [OPTION]... [FILE]...\n"
"Compress or decompress FILEs in the .xz format.\n"
"\n"
msgstr ""
#: src/xz/message.c:1091
msgid "Mandatory arguments to long options are mandatory for short options too.\n"
msgstr ""
#: src/xz/message.c:1095
msgid " Operation mode:\n"
msgstr ""
#: src/xz/message.c:1098
msgid ""
" -z, --compress force compression\n"
" -d, --decompress force decompression\n"
" -t, --test test compressed file integrity\n"
" -l, --list list information about .xz files"
msgstr ""
#: src/xz/message.c:1104
msgid ""
"\n"
" Operation modifiers:\n"
msgstr ""
#: src/xz/message.c:1107
msgid ""
" -k, --keep keep (don't delete) input files\n"
" -f, --force force overwrite of output file and (de)compress links\n"
" -c, --stdout write to standard output and don't delete input files"
msgstr ""
#: src/xz/message.c:1113
msgid ""
" --no-sparse do not create sparse files when decompressing\n"
" -S, --suffix=.SUF use the suffix `.SUF' on compressed files\n"
" --files[=FILE] read filenames to process from FILE; if FILE is\n"
" omitted, filenames are read from the standard input;\n"
" filenames must be terminated with the newline character\n"
" --files0[=FILE] like --files but use the null character as terminator"
msgstr ""
#: src/xz/message.c:1121
msgid ""
"\n"
" Basic file format and compression options:\n"
msgstr ""
#: src/xz/message.c:1123
msgid ""
" -F, --format=FMT file format to encode or decode; possible values are\n"
" `auto' (default), `xz', `lzma', and `raw'\n"
" -C, --check=CHECK integrity check type: `none' (use with caution),\n"
" `crc32', `crc64' (default), or `sha256'"
msgstr ""
#: src/xz/message.c:1130
msgid ""
" -0 ... -9 compression preset; default is 6; take compressor *and*\n"
" decompressor memory usage into account before using 7-9!"
msgstr ""
#: src/xz/message.c:1134
msgid ""
" -e, --extreme try to improve compression ratio by using more CPU time;\n"
" does not affect decompressor memory requirements"
msgstr ""
#: src/xz/message.c:1139
#, no-c-format
msgid ""
" --memlimit-compress=LIMIT\n"
" --memlimit-decompress=LIMIT\n"
" -M, --memlimit=LIMIT\n"
" set memory usage limit for compression, decompression,\n"
" or both; LIMIT is in bytes, % of RAM, or 0 for defaults"
msgstr ""
#: src/xz/message.c:1146
msgid ""
" --no-adjust if compression settings exceed the memory usage limit,\n"
" give an error instead of adjusting the settings downwards"
msgstr ""
#: src/xz/message.c:1152
msgid ""
"\n"
" Custom filter chain for compression (alternative for using presets):"
msgstr ""
#: src/xz/message.c:1161
msgid ""
"\n"
" --lzma1[=OPTS] LZMA1 or LZMA2; OPTS is a comma-separated list of zero or\n"
" --lzma2[=OPTS] more of the following options (valid values; default):\n"
" preset=PRE reset options to a preset (0-9[e])\n"
" dict=NUM dictionary size (4KiB - 1536MiB; 8MiB)\n"
" lc=NUM number of literal context bits (0-4; 3)\n"
" lp=NUM number of literal position bits (0-4; 0)\n"
" pb=NUM number of position bits (0-4; 2)\n"
" mode=MODE compression mode (fast, normal; normal)\n"
" nice=NUM nice length of a match (2-273; 64)\n"
" mf=NAME match finder (hc3, hc4, bt2, bt3, bt4; bt4)\n"
" depth=NUM maximum search depth; 0=automatic (default)"
msgstr ""
#: src/xz/message.c:1176
msgid ""
"\n"
" --x86[=OPTS] x86 BCJ filter (32-bit and 64-bit)\n"
" --powerpc[=OPTS] PowerPC BCJ filter (big endian only)\n"
" --ia64[=OPTS] IA-64 (Itanium) BCJ filter\n"
" --arm[=OPTS] ARM BCJ filter (little endian only)\n"
" --armthumb[=OPTS] ARM-Thumb BCJ filter (little endian only)\n"
" --sparc[=OPTS] SPARC BCJ filter\n"
" Valid OPTS for all BCJ filters:\n"
" start=NUM start offset for conversions (default=0)"
msgstr ""
#: src/xz/message.c:1188
msgid ""
"\n"
" --delta[=OPTS] Delta filter; valid OPTS (valid values; default):\n"
" dist=NUM distance between bytes being subtracted\n"
" from each other (1-256; 1)"
msgstr ""
#: src/xz/message.c:1196
msgid ""
"\n"
" Other options:\n"
msgstr ""
#: src/xz/message.c:1199
msgid ""
" -q, --quiet suppress warnings; specify twice to suppress errors too\n"
" -v, --verbose be verbose; specify twice for even more verbose"
msgstr ""
#: src/xz/message.c:1204
msgid " -Q, --no-warn make warnings not affect the exit status"
msgstr ""
#: src/xz/message.c:1206
msgid " --robot use machine-parsable messages (useful for scripts)"
msgstr ""
#: src/xz/message.c:1209
msgid ""
" --info-memory display the total amount of RAM and the currently active\n"
" memory usage limits, and exit"
msgstr ""
#: src/xz/message.c:1212
msgid ""
" -h, --help display the short help (lists only the basic options)\n"
" -H, --long-help display this long help and exit"
msgstr ""
#: src/xz/message.c:1216
msgid ""
" -h, --help display this short help and exit\n"
" -H, --long-help display the long help (lists also the advanced options)"
msgstr ""
#: src/xz/message.c:1221
msgid " -V, --version display the version number and exit"
msgstr ""
#: src/xz/message.c:1223
msgid ""
"\n"
"With no FILE, or when FILE is -, read standard input.\n"
msgstr ""
#. TRANSLATORS: This message indicates the bug reporting address
#. for this package. Please add _another line_ saying
#. "Report translation bugs to <...>\n" with the email or WWW
#. address for translation bugs. Thanks.
#: src/xz/message.c:1229
#, c-format
msgid "Report bugs to <%s> (in English or Finnish).\n"
msgstr ""
#: src/xz/message.c:1231
#, c-format
msgid "%s home page: <%s>\n"
msgstr ""
#: src/xz/options.c:86
#, c-format
msgid "%s: Options must be `name=value' pairs separated with commas"
msgstr ""
#: src/xz/options.c:93
#, c-format
msgid "%s: Invalid option name"
msgstr ""
#: src/xz/options.c:113
#, c-format
msgid "%s: Invalid option value"
msgstr ""
#: src/xz/options.c:247
#, c-format
msgid "Unsupported LZMA1/LZMA2 preset: %s"
msgstr ""
#: src/xz/options.c:355
msgid "The sum of lc and lp must not exceed 4"
msgstr ""
#: src/xz/options.c:359
#, c-format
msgid "The selected match finder requires at least nice=%<PRIu32>"
msgstr ""
#: src/xz/suffix.c:79 src/xz/suffix.c:164
#, c-format
msgid "%s: With --format=raw, --suffix=.SUF is required unless writing to stdout"
msgstr ""
#: src/xz/suffix.c:99
#, c-format
msgid "%s: Filename has an unknown suffix, skipping"
msgstr ""
#: src/xz/suffix.c:154
#, c-format
msgid "%s: File already has `%s' suffix, skipping"
msgstr ""
#: src/xz/suffix.c:205
#, c-format
msgid "%s: Invalid filename suffix"
msgstr ""
#: src/xz/util.c:61
#, c-format
msgid "%s: Value is not a non-negative decimal integer"
msgstr ""
#: src/xz/util.c:103
#, c-format
msgid "%s: Invalid multiplier suffix"
msgstr ""
#: src/xz/util.c:105
msgid "Valid suffixes are `KiB' (2^10), `MiB' (2^20), and `GiB' (2^30)."
msgstr ""
#: src/xz/util.c:122
#, c-format
msgid "Value of the option `%s' must be in the range [%<PRIu64>, %<PRIu64>]"
msgstr ""
#: src/xz/util.c:247
msgid "Empty filename, skipping"
msgstr ""
#: src/xz/util.c:261
msgid "Compressed data cannot be read from a terminal"
msgstr ""
#: src/xz/util.c:274
msgid "Compressed data cannot be written to a terminal"
msgstr ""
#: src/common/tuklib_exit.c:39
msgid "Writing to standard output failed"
msgstr ""
#: src/common/tuklib_exit.c:42
msgid "Unknown error"
msgstr ""

View File

@ -24,6 +24,11 @@
# include <config.h> # include <config.h>
#endif #endif
// Get standard-compliant stdio functions under MinGW and MinGW-w64.
#ifdef __MINGW32__
# define __USE_MINGW_ANSI_STDIO 1
#endif
// size_t and NULL // size_t and NULL
#include <stddef.h> #include <stddef.h>

View File

@ -60,8 +60,8 @@
* *
* Some could argue that liblzma API should provide all the required types, * Some could argue that liblzma API should provide all the required types,
* for example lzma_uint64, LZMA_UINT64_C(n), and LZMA_UINT64_MAX. This was * for example lzma_uint64, LZMA_UINT64_C(n), and LZMA_UINT64_MAX. This was
* seen unnecessary mess, since most systems already provide all the necessary * seen as an unnecessary mess, since most systems already provide all the
* types and macros in the standard headers. * necessary types and macros in the standard headers.
* *
* Note that liblzma API still has lzma_bool, because using stdbool.h would * Note that liblzma API still has lzma_bool, because using stdbool.h would
* break C89 and C++ programs on many systems. sizeof(bool) in C99 isn't * break C89 and C++ programs on many systems. sizeof(bool) in C99 isn't

View File

@ -281,21 +281,21 @@ typedef enum {
* Using LZMA_SYNC_FLUSH very often can dramatically reduce * Using LZMA_SYNC_FLUSH very often can dramatically reduce
* the compression ratio. With some filters (for example, * the compression ratio. With some filters (for example,
* LZMA2), fine-tuning the compression options may help * LZMA2), fine-tuning the compression options may help
* mitigate this problem significantly. * mitigate this problem significantly (for example,
* match finder with LZMA2).
* *
* Decoders don't support LZMA_SYNC_FLUSH. * Decoders don't support LZMA_SYNC_FLUSH.
*/ */
LZMA_FULL_FLUSH = 2, LZMA_FULL_FLUSH = 2,
/**< /**<
* \brief Make all the input available at output * \brief Finish encoding of the current Block
* *
* Finish encoding of the current Block. All the input * All the input data going to the current Block must have
* data going to the current Block must have been given * been given to the encoder (the last bytes can still be
* to the encoder (the last bytes can still be pending in * pending in* next_in). Call lzma_code() with LZMA_FULL_FLUSH
* next_in). Call lzma_code() with LZMA_FULL_FLUSH until * until it returns LZMA_STREAM_END. Then continue normally
* it returns LZMA_STREAM_END. Then continue normally with * with LZMA_RUN or finish the Stream with LZMA_FINISH.
* LZMA_RUN or finish the Stream with LZMA_FINISH.
* *
* This action is currently supported only by Stream encoder * This action is currently supported only by Stream encoder
* and easy encoder (which uses Stream encoder). If there is * and easy encoder (which uses Stream encoder). If there is
@ -306,12 +306,12 @@ typedef enum {
/**< /**<
* \brief Finish the coding operation * \brief Finish the coding operation
* *
* Finishes the coding operation. All the input data must * All the input data must have been given to the encoder
* have been given to the encoder (the last bytes can still * (the last bytes can still be pending in next_in).
* be pending in next_in). Call lzma_code() with LZMA_FINISH * Call lzma_code() with LZMA_FINISH until it returns
* until it returns LZMA_STREAM_END. Once LZMA_FINISH has * LZMA_STREAM_END. Once LZMA_FINISH has been used,
* been used, the amount of input must no longer be changed * the amount of input must no longer be changed by
* by the application. * the application.
* *
* When decoding, using LZMA_FINISH is optional unless the * When decoding, using LZMA_FINISH is optional unless the
* LZMA_CONCATENATED flag was used when the decoder was * LZMA_CONCATENATED flag was used when the decoder was
@ -478,8 +478,12 @@ typedef struct {
*/ */
void *reserved_ptr1; void *reserved_ptr1;
void *reserved_ptr2; void *reserved_ptr2;
void *reserved_ptr3;
void *reserved_ptr4;
uint64_t reserved_int1; uint64_t reserved_int1;
uint64_t reserved_int2; uint64_t reserved_int2;
size_t reserved_int3;
size_t reserved_int4;
lzma_reserved_enum reserved_enum1; lzma_reserved_enum reserved_enum1;
lzma_reserved_enum reserved_enum2; lzma_reserved_enum reserved_enum2;
@ -506,7 +510,8 @@ typedef struct {
*/ */
#define LZMA_STREAM_INIT \ #define LZMA_STREAM_INIT \
{ NULL, 0, 0, NULL, 0, 0, NULL, NULL, \ { NULL, 0, 0, NULL, 0, 0, NULL, NULL, \
NULL, NULL, 0, 0, LZMA_RESERVED_ENUM, LZMA_RESERVED_ENUM } NULL, NULL, NULL, NULL, 0, 0, 0, 0, \
LZMA_RESERVED_ENUM, LZMA_RESERVED_ENUM }
/** /**
@ -554,11 +559,11 @@ extern LZMA_API(void) lzma_end(lzma_stream *strm) lzma_nothrow;
* this may give misleading information if decoding .xz Streams that have * this may give misleading information if decoding .xz Streams that have
* multiple Blocks, because each Block can have different memory requirements. * multiple Blocks, because each Block can have different memory requirements.
* *
* \return Rough estimate of how much memory is currently allocated * \return How much memory is currently allocated for the filter
* for the filter decoders. If no filter chain is currently * decoders. If no filter chain is currently allocated,
* allocated, some non-zero value is still returned, which is * some non-zero value is still returned, which is less than
* less than or equal to what any filter chain would indicate * or equal to what any filter chain would indicate as its
* as its memory requirement. * memory requirement.
* *
* If this function isn't supported by *strm or some other error * If this function isn't supported by *strm or some other error
* occurs, zero is returned. * occurs, zero is returned.

View File

@ -31,7 +31,7 @@
#define LZMA_FILTER_IA64 LZMA_VLI_C(0x06) #define LZMA_FILTER_IA64 LZMA_VLI_C(0x06)
/**< /**<
* Filter for IA64 (Itanium) binaries. * Filter for IA-64 (Itanium) binaries.
*/ */
#define LZMA_FILTER_ARM LZMA_VLI_C(0x07) #define LZMA_FILTER_ARM LZMA_VLI_C(0x07)
@ -41,7 +41,7 @@
#define LZMA_FILTER_ARMTHUMB LZMA_VLI_C(0x08) #define LZMA_FILTER_ARMTHUMB LZMA_VLI_C(0x08)
/**< /**<
* Filter for ARMThumb binaries. * Filter for ARM-Thumb binaries.
*/ */
#define LZMA_FILTER_SPARC LZMA_VLI_C(0x09) #define LZMA_FILTER_SPARC LZMA_VLI_C(0x09)

View File

@ -318,8 +318,8 @@ extern LZMA_API(lzma_ret) lzma_block_header_encode(
* The size of the Block Header must have already been decoded with * The size of the Block Header must have already been decoded with
* lzma_block_header_size_decode() macro and stored to block->header_size. * lzma_block_header_size_decode() macro and stored to block->header_size.
* *
* block->filters must have been allocated, but not necessarily initialized. * block->filters must have been allocated, but they don't need to be
* Possible existing filter options are _not_ freed. * initialized (possible existing filter options are not freed).
* *
* \param block Destination for Block options. * \param block Destination for Block options.
* \param allocator lzma_allocator for custom allocator functions. * \param allocator lzma_allocator for custom allocator functions.

View File

@ -55,13 +55,13 @@
* *
* This flag doesn't affect the memory usage requirements of the decoder (at * This flag doesn't affect the memory usage requirements of the decoder (at
* least not significantly). The memory usage of the encoder may be increased * least not significantly). The memory usage of the encoder may be increased
* a little but only at the lowest preset levels (0-2). * a little but only at the lowest preset levels (0-3).
*/ */
#define LZMA_PRESET_EXTREME (UINT32_C(1) << 31) #define LZMA_PRESET_EXTREME (UINT32_C(1) << 31)
/** /**
* \brief Calculate rough memory usage of easy encoder * \brief Calculate approximate memory usage of easy encoder
* *
* This function is a wrapper for lzma_raw_encoder_memusage(). * This function is a wrapper for lzma_raw_encoder_memusage().
* *
@ -72,7 +72,7 @@ extern LZMA_API(uint64_t) lzma_easy_encoder_memusage(uint32_t preset)
/** /**
* \brief Calculate rough decoder memory usage of a preset * \brief Calculate approximate decoder memory usage of a preset
* *
* This function is a wrapper for lzma_raw_decoder_memusage(). * This function is a wrapper for lzma_raw_decoder_memusage().
* *
@ -93,16 +93,19 @@ extern LZMA_API(uint64_t) lzma_easy_decoder_memusage(uint32_t preset)
* \param preset Compression preset to use. A preset consist of level * \param preset Compression preset to use. A preset consist of level
* number and zero or more flags. Usually flags aren't * number and zero or more flags. Usually flags aren't
* used, so preset is simply a number [0, 9] which match * used, so preset is simply a number [0, 9] which match
* the options -0 .. -9 of the xz command line tool. * the options -0 ... -9 of the xz command line tool.
* Additional flags can be be set using bitwise-or with * Additional flags can be be set using bitwise-or with
* the preset level number, e.g. 6 | LZMA_PRESET_EXTREME. * the preset level number, e.g. 6 | LZMA_PRESET_EXTREME.
* \param check Integrity check type to use. See check.h for available * \param check Integrity check type to use. See check.h for available
* checks. If you are unsure, use LZMA_CHECK_CRC32. * checks. The xz command line tool defaults to
* LZMA_CHECK_CRC64, which is a good choice if you are
* unsure. LZMA_CHECK_CRC32 is good too as long as the
* uncompressed file is not many gigabytes.
* *
* \return - LZMA_OK: Initialization succeeded. Use lzma_code() to * \return - LZMA_OK: Initialization succeeded. Use lzma_code() to
* encode your data. * encode your data.
* - LZMA_MEM_ERROR: Memory allocation failed. * - LZMA_MEM_ERROR: Memory allocation failed.
* - LZMA_OPTIONS_ERROR: The given compression level is not * - LZMA_OPTIONS_ERROR: The given compression preset is not
* supported by this build of liblzma. * supported by this build of liblzma.
* - LZMA_UNSUPPORTED_CHECK: The given check type is not * - LZMA_UNSUPPORTED_CHECK: The given check type is not
* supported by this liblzma build. * supported by this liblzma build.
@ -310,7 +313,8 @@ extern LZMA_API(lzma_ret) lzma_stream_buffer_encode(
* \brief Initialize .xz Stream decoder * \brief Initialize .xz Stream decoder
* *
* \param strm Pointer to properly prepared lzma_stream * \param strm Pointer to properly prepared lzma_stream
* \param memlimit Rough memory usage limit as bytes * \param memlimit Memory usage limit as bytes. Use UINT64_MAX
* to effectively disable the limiter.
* \param flags Bitwise-or of zero or more of the decoder flags: * \param flags Bitwise-or of zero or more of the decoder flags:
* LZMA_TELL_NO_CHECK, LZMA_TELL_UNSUPPORTED_CHECK, * LZMA_TELL_NO_CHECK, LZMA_TELL_UNSUPPORTED_CHECK,
* LZMA_TELL_ANY_CHECK, LZMA_CONCATENATED * LZMA_TELL_ANY_CHECK, LZMA_CONCATENATED
@ -318,6 +322,7 @@ extern LZMA_API(lzma_ret) lzma_stream_buffer_encode(
* \return - LZMA_OK: Initialization was successful. * \return - LZMA_OK: Initialization was successful.
* - LZMA_MEM_ERROR: Cannot allocate memory. * - LZMA_MEM_ERROR: Cannot allocate memory.
* - LZMA_OPTIONS_ERROR: Unsupported flags * - LZMA_OPTIONS_ERROR: Unsupported flags
* - LZMA_PROG_ERROR
*/ */
extern LZMA_API(lzma_ret) lzma_stream_decoder( extern LZMA_API(lzma_ret) lzma_stream_decoder(
lzma_stream *strm, uint64_t memlimit, uint32_t flags) lzma_stream *strm, uint64_t memlimit, uint32_t flags)
@ -332,12 +337,14 @@ extern LZMA_API(lzma_ret) lzma_stream_decoder(
* of the input file has been detected. * of the input file has been detected.
* *
* \param strm Pointer to properly prepared lzma_stream * \param strm Pointer to properly prepared lzma_stream
* \param memlimit Rough memory usage limit as bytes * \param memlimit Memory usage limit as bytes. Use UINT64_MAX
* to effectively disable the limiter.
* \param flags Bitwise-or of flags, or zero for no flags. * \param flags Bitwise-or of flags, or zero for no flags.
* *
* \return - LZMA_OK: Initialization was successful. * \return - LZMA_OK: Initialization was successful.
* - LZMA_MEM_ERROR: Cannot allocate memory. * - LZMA_MEM_ERROR: Cannot allocate memory.
* - LZMA_OPTIONS_ERROR: Unsupported flags * - LZMA_OPTIONS_ERROR: Unsupported flags
* - LZMA_PROG_ERROR
*/ */
extern LZMA_API(lzma_ret) lzma_auto_decoder( extern LZMA_API(lzma_ret) lzma_auto_decoder(
lzma_stream *strm, uint64_t memlimit, uint32_t flags) lzma_stream *strm, uint64_t memlimit, uint32_t flags)
@ -353,6 +360,7 @@ extern LZMA_API(lzma_ret) lzma_auto_decoder(
* *
* \return - LZMA_OK * \return - LZMA_OK
* - LZMA_MEM_ERROR * - LZMA_MEM_ERROR
* - LZMA_PROG_ERROR
*/ */
extern LZMA_API(lzma_ret) lzma_alone_decoder( extern LZMA_API(lzma_ret) lzma_alone_decoder(
lzma_stream *strm, uint64_t memlimit) lzma_stream *strm, uint64_t memlimit)
@ -379,7 +387,7 @@ extern LZMA_API(lzma_ret) lzma_alone_decoder(
* won't be read is in[in_size]. * won't be read is in[in_size].
* \param out Beginning of the output buffer * \param out Beginning of the output buffer
* \param out_pos The next byte will be written to out[*out_pos]. * \param out_pos The next byte will be written to out[*out_pos].
* *out_pos is updated only if encoding succeeds. * *out_pos is updated only if decoding succeeds.
* \param out_size Size of the out buffer; the first byte into * \param out_size Size of the out buffer; the first byte into
* which no data is written to is out[out_size]. * which no data is written to is out[out_size].
* *

View File

@ -1,6 +1,6 @@
/** /**
* \file lzma/filter.h * \file lzma/filter.h
* \brief Common filter related types * \brief Common filter related types and functions
*/ */
/* /*
@ -59,11 +59,6 @@ typedef struct {
* If the filter doesn't need options, set this to NULL. If id is * If the filter doesn't need options, set this to NULL. If id is
* set to LZMA_VLI_UNKNOWN, options is ignored, and thus * set to LZMA_VLI_UNKNOWN, options is ignored, and thus
* doesn't need be initialized. * doesn't need be initialized.
*
* Some filters support changing the options in the middle of
* the encoding process. These filters store the pointer of the
* options structure and communicate with the application via
* modifications of the options structure.
*/ */
void *options; void *options;
@ -126,15 +121,16 @@ extern LZMA_API(lzma_ret) lzma_filters_copy(const lzma_filter *src,
/** /**
* \brief Calculate rough memory requirements for raw encoder * \brief Calculate approximate memory requirements for raw encoder
* *
* Because the calculation is rough, this function can be used to calculate * This function can be used to calculate the memory requirements for
* the memory requirements for Block and Stream encoders too. * Block and Stream encoders too because Block and Stream encoders don't
* need significantly more memory than raw encoder.
* *
* \param filters Array of filters terminated with * \param filters Array of filters terminated with
* .id == LZMA_VLI_UNKNOWN. * .id == LZMA_VLI_UNKNOWN.
* *
* \return Rough number of bytes of memory required for the given * \return Number of bytes of memory required for the given
* filter chain when encoding. * filter chain when encoding.
*/ */
extern LZMA_API(uint64_t) lzma_raw_encoder_memusage(const lzma_filter *filters) extern LZMA_API(uint64_t) lzma_raw_encoder_memusage(const lzma_filter *filters)
@ -142,15 +138,16 @@ extern LZMA_API(uint64_t) lzma_raw_encoder_memusage(const lzma_filter *filters)
/** /**
* \brief Calculate rough memory requirements for raw decoder * \brief Calculate approximate memory requirements for raw decoder
* *
* Because the calculation is rough, this function can be used to calculate * This function can be used to calculate the memory requirements for
* the memory requirements for Block and Stream decoders too. * Block and Stream decoders too because Block and Stream decoders don't
* need significantly more memory than raw decoder.
* *
* \param filters Array of filters terminated with * \param filters Array of filters terminated with
* .id == LZMA_VLI_UNKNOWN. * .id == LZMA_VLI_UNKNOWN.
* *
* \return Rough number of bytes of memory required for the given * \return Number of bytes of memory required for the given
* filter chain when decoding. * filter chain when decoding.
*/ */
extern LZMA_API(uint64_t) lzma_raw_decoder_memusage(const lzma_filter *filters) extern LZMA_API(uint64_t) lzma_raw_decoder_memusage(const lzma_filter *filters)
@ -251,7 +248,8 @@ extern LZMA_API(lzma_ret) lzma_filters_update(
* *
* \note There is no function to calculate how big output buffer * \note There is no function to calculate how big output buffer
* would surely be big enough. (lzma_stream_buffer_bound() * would surely be big enough. (lzma_stream_buffer_bound()
* works only for lzma_stream_buffer_encode().) * works only for lzma_stream_buffer_encode(); raw encoder
* won't necessarily meet that bound.)
*/ */
extern LZMA_API(lzma_ret) lzma_raw_buffer_encode( extern LZMA_API(lzma_ret) lzma_raw_buffer_encode(
const lzma_filter *filters, lzma_allocator *allocator, const lzma_filter *filters, lzma_allocator *allocator,
@ -323,9 +321,10 @@ extern LZMA_API(lzma_ret) lzma_properties_size(
* succeeds but using the same options to initialize the encoder * succeeds but using the same options to initialize the encoder
* will fail. * will fail.
* *
* \note It is OK to skip calling this function if * \note If lzma_properties_size() indicated that the size
* lzma_properties_size() indicated that the size * of the Filter Properties field is zero, calling
* of the Filter Properties field is zero. * lzma_properties_encode() is not required, but it
* won't do any harm either.
*/ */
extern LZMA_API(lzma_ret) lzma_properties_encode( extern LZMA_API(lzma_ret) lzma_properties_encode(
const lzma_filter *filter, uint8_t *props) lzma_nothrow; const lzma_filter *filter, uint8_t *props) lzma_nothrow;
@ -364,11 +363,11 @@ extern LZMA_API(lzma_ret) lzma_properties_decode(
* memory to hold the encoded Filter Flags. * memory to hold the encoded Filter Flags.
* *
* \param size Pointer to integer to hold the calculated size * \param size Pointer to integer to hold the calculated size
* \param filters Filter ID and associated options whose encoded * \param filter Filter ID and associated options whose encoded
* size is to be calculated * size is to be calculated
* *
* \return - LZMA_OK: *size set successfully. Note that this doesn't * \return - LZMA_OK: *size set successfully. Note that this doesn't
* guarantee that filters->options is valid, thus * guarantee that filter->options is valid, thus
* lzma_filter_flags_encode() may still fail. * lzma_filter_flags_encode() may still fail.
* - LZMA_OPTIONS_ERROR: Unknown Filter ID or unsupported options. * - LZMA_OPTIONS_ERROR: Unknown Filter ID or unsupported options.
* - LZMA_PROG_ERROR: Invalid options * - LZMA_PROG_ERROR: Invalid options
@ -377,7 +376,7 @@ extern LZMA_API(lzma_ret) lzma_properties_decode(
* you need to loop over every lzma_filter entry. * you need to loop over every lzma_filter entry.
*/ */
extern LZMA_API(lzma_ret) lzma_filter_flags_size( extern LZMA_API(lzma_ret) lzma_filter_flags_size(
uint32_t *size, const lzma_filter *filters) uint32_t *size, const lzma_filter *filter)
lzma_nothrow lzma_attr_warn_unused_result; lzma_nothrow lzma_attr_warn_unused_result;
@ -387,7 +386,7 @@ extern LZMA_API(lzma_ret) lzma_filter_flags_size(
* In contrast to some functions, this doesn't allocate the needed buffer. * In contrast to some functions, this doesn't allocate the needed buffer.
* This is due to how this function is used internally by liblzma. * This is due to how this function is used internally by liblzma.
* *
* \param filters Filter ID and options to be encoded * \param filter Filter ID and options to be encoded
* \param out Beginning of the output buffer * \param out Beginning of the output buffer
* \param out_pos out[*out_pos] is the next write position. This * \param out_pos out[*out_pos] is the next write position. This
* is updated by the encoder. * is updated by the encoder.
@ -399,7 +398,7 @@ extern LZMA_API(lzma_ret) lzma_filter_flags_size(
* buffer space (you should have checked it with * buffer space (you should have checked it with
* lzma_filter_flags_size()). * lzma_filter_flags_size()).
*/ */
extern LZMA_API(lzma_ret) lzma_filter_flags_encode(const lzma_filter *filters, extern LZMA_API(lzma_ret) lzma_filter_flags_encode(const lzma_filter *filter,
uint8_t *out, size_t *out_pos, size_t out_size) uint8_t *out, size_t *out_pos, size_t out_size)
lzma_nothrow lzma_attr_warn_unused_result; lzma_nothrow lzma_attr_warn_unused_result;
@ -407,8 +406,8 @@ extern LZMA_API(lzma_ret) lzma_filter_flags_encode(const lzma_filter *filters,
/** /**
* \brief Decode Filter Flags from given buffer * \brief Decode Filter Flags from given buffer
* *
* The decoded result is stored into *filters. filters->options is * The decoded result is stored into *filter. The old value of
* initialized but the old value is NOT free()d. * filter->options is not free()d.
* *
* \return - LZMA_OK * \return - LZMA_OK
* - LZMA_OPTIONS_ERROR * - LZMA_OPTIONS_ERROR
@ -416,6 +415,6 @@ extern LZMA_API(lzma_ret) lzma_filter_flags_encode(const lzma_filter *filters,
* - LZMA_PROG_ERROR * - LZMA_PROG_ERROR
*/ */
extern LZMA_API(lzma_ret) lzma_filter_flags_decode( extern LZMA_API(lzma_ret) lzma_filter_flags_decode(
lzma_filter *filters, lzma_allocator *allocator, lzma_filter *filter, lzma_allocator *allocator,
const uint8_t *in, size_t *in_pos, size_t in_size) const uint8_t *in, size_t *in_pos, size_t in_size)
lzma_nothrow lzma_attr_warn_unused_result; lzma_nothrow lzma_attr_warn_unused_result;

View File

@ -39,8 +39,7 @@
* *
* This function may be useful when determining a reasonable memory * This function may be useful when determining a reasonable memory
* usage limit for decompressing or how much memory it is OK to use * usage limit for decompressing or how much memory it is OK to use
* for compressing. For example, the default limit used by the xz * for compressing.
* command line tool is 40 % of RAM.
* *
* \return On success, the total amount of physical memory in bytes * \return On success, the total amount of physical memory in bytes
* is returned. If the amount of RAM cannot be determined, * is returned. If the amount of RAM cannot be determined,

View File

@ -136,6 +136,13 @@ typedef struct {
* *
* This offset is relative to the beginning of the lzma_index * This offset is relative to the beginning of the lzma_index
* (i.e. usually the beginning of the .xz file). * (i.e. usually the beginning of the .xz file).
*
* When doing random-access reading, it is possible that
* the target offset is not exactly at Block boundary. One
* will need to compare the target offset against
* uncompressed_file_offset or uncompressed_stream_offset,
* and possibly decode and throw away some amount of data
* before reaching the target offset.
*/ */
lzma_vli uncompressed_file_offset; lzma_vli uncompressed_file_offset;
@ -166,14 +173,8 @@ typedef struct {
* \brief Uncompressed size of this Block * \brief Uncompressed size of this Block
* *
* You should pass this to the Block decoder if you will * You should pass this to the Block decoder if you will
* decode this Block. * decode this Block. It will allow the Block decoder to
* * validate the uncompressed size.
* When doing random-access reading, it is possible that
* the target offset is not exactly at Block boundary. One
* will need to compare the target offset against
* uncompressed_file_offset or uncompressed_stream_offset,
* and possibly decode and throw away some amount of data
* before reaching the target offset.
*/ */
lzma_vli uncompressed_size; lzma_vli uncompressed_size;
@ -181,7 +182,8 @@ typedef struct {
* \brief Unpadded size of this Block * \brief Unpadded size of this Block
* *
* You should pass this to the Block decoder if you will * You should pass this to the Block decoder if you will
* decode this Block. * decode this Block. It will allow the Block decoder to
* validate the unpadded size.
*/ */
lzma_vli unpadded_size; lzma_vli unpadded_size;
@ -583,7 +585,9 @@ extern LZMA_API(lzma_index *) lzma_index_dup(
* \param strm Pointer to properly prepared lzma_stream * \param strm Pointer to properly prepared lzma_stream
* \param i Pointer to lzma_index which should be encoded. * \param i Pointer to lzma_index which should be encoded.
* *
* The only valid action value for lzma_code() is LZMA_RUN. * The valid `action' values for lzma_code() are LZMA_RUN and LZMA_FINISH.
* It is enough to use only one of them (you can choose freely; use LZMA_RUN
* to support liblzma versions older than 5.0.0).
* *
* \return - LZMA_OK: Initialization succeeded, continue with lzma_code(). * \return - LZMA_OK: Initialization succeeded, continue with lzma_code().
* - LZMA_MEM_ERROR * - LZMA_MEM_ERROR
@ -608,7 +612,9 @@ extern LZMA_API(lzma_ret) lzma_index_encoder(
* \param memlimit How much memory the resulting lzma_index is * \param memlimit How much memory the resulting lzma_index is
* allowed to require. * allowed to require.
* *
* The only valid action value for lzma_code() is LZMA_RUN. * The valid `action' values for lzma_code() are LZMA_RUN and LZMA_FINISH.
* It is enough to use only one of them (you can choose freely; use LZMA_RUN
* to support liblzma versions older than 5.0.0).
* *
* \return - LZMA_OK: Initialization succeeded, continue with lzma_code(). * \return - LZMA_OK: Initialization succeeded, continue with lzma_code().
* - LZMA_MEM_ERROR * - LZMA_MEM_ERROR

View File

@ -1,6 +1,6 @@
/** /**
* \file lzma/index_hash.h * \file lzma/index_hash.h
* \brief Validates Index by using a hash function * \brief Validate Index by using a hash function
* *
* Hashing makes it possible to use constant amount of memory to validate * Hashing makes it possible to use constant amount of memory to validate
* Index of arbitrary size. * Index of arbitrary size.

View File

@ -46,6 +46,10 @@
* Match finder has major effect on both speed and compression ratio. * Match finder has major effect on both speed and compression ratio.
* Usually hash chains are faster than binary trees. * Usually hash chains are faster than binary trees.
* *
* If you will use LZMA_SYNC_FLUSH often, the hash chains may be a better
* choice, because binary trees get much higher compression ratio penalty
* with LZMA_SYNC_FLUSH.
*
* The memory usage formulas are only rough estimates, which are closest to * The memory usage formulas are only rough estimates, which are closest to
* reality when dict_size is a power of two. The formulas are more complex * reality when dict_size is a power of two. The formulas are more complex
* in reality, and can also change a little between liblzma versions. Use * in reality, and can also change a little between liblzma versions. Use
@ -173,6 +177,7 @@ extern LZMA_API(lzma_bool) lzma_mode_is_supported(lzma_mode mode)
* Since LZMA1 and LZMA2 share most of the code, it's simplest to share * Since LZMA1 and LZMA2 share most of the code, it's simplest to share
* the options structure too. For encoding, all but the reserved variables * the options structure too. For encoding, all but the reserved variables
* need to be initialized unless specifically mentioned otherwise. * need to be initialized unless specifically mentioned otherwise.
* lzma_lzma_preset() can be used to get a good starting point.
* *
* For raw decoding, both LZMA1 and LZMA2 need dict_size, preset_dict, and * For raw decoding, both LZMA1 and LZMA2 need dict_size, preset_dict, and
* preset_dict_size (if preset_dict != NULL). LZMA1 needs also lc, lp, and pb. * preset_dict_size (if preset_dict != NULL). LZMA1 needs also lc, lp, and pb.
@ -255,7 +260,13 @@ typedef struct {
* eight-bit byte (also known as `literal') are taken into * eight-bit byte (also known as `literal') are taken into
* account when predicting the bits of the next literal. * account when predicting the bits of the next literal.
* *
* \todo Example * E.g. in typical English text, an upper-case letter is
* often followed by a lower-case letter, and a lower-case
* letter is usually followed by another lower-case letter.
* In the US-ASCII character set, the highest three bits are 010
* for upper-case letters and 011 for lower-case letters.
* When lc is at least 3, the literal coding can take advantage of
* this property in the uncompressed data.
* *
* There is a limit that applies to literal context bits and literal * There is a limit that applies to literal context bits and literal
* position bits together: lc + lp <= 4. Without this limit the * position bits together: lc + lp <= 4. Without this limit the
@ -275,12 +286,9 @@ typedef struct {
/** /**
* \brief Number of literal position bits * \brief Number of literal position bits
* *
* How many of the lowest bits of the current position (number * lp affects what kind of alignment in the uncompressed data is
* of bytes from the beginning of the uncompressed data) in the * assumed when encoding literals. A literal is a single 8-bit byte.
* uncompressed data is taken into account when predicting the * See pb below for more information about alignment.
* bits of the next literal (a single eight-bit byte).
*
* \todo Example
*/ */
uint32_t lp; uint32_t lp;
# define LZMA_LP_DEFAULT 0 # define LZMA_LP_DEFAULT 0
@ -288,14 +296,22 @@ typedef struct {
/** /**
* \brief Number of position bits * \brief Number of position bits
* *
* How many of the lowest bits of the current position in the * pb affects what kind of alignment in the uncompressed data is
* uncompressed data is taken into account when estimating * assumed in general. The default means four-byte alignment
* probabilities of matches. A match is a sequence of bytes for * (2^ pb =2^2=4), which is often a good choice when there's
* which a matching sequence is found from the dictionary and * no better guess.
* thus can be stored as distance-length pair.
* *
* Example: If most of the matches occur at byte positions of * When the aligment is known, setting pb accordingly may reduce
* 8 * n + 3, that is, 3, 11, 19, ... set pb to 3, because 2**3 == 8. * the file size a little. E.g. with text files having one-byte
* alignment (US-ASCII, ISO-8859-*, UTF-8), setting pb=0 can
* improve compression slightly. For UTF-16 text, pb=1 is a good
* choice. If the alignment is an odd number like 3 bytes, pb=0
* might be the best choice.
*
* Even though the assumed alignment can be adjusted with pb and
* lp, LZMA1 and LZMA2 still slightly favor 16-byte alignment.
* It might be worth taking into account when designing file formats
* that are likely to be often compressed with LZMA1 or LZMA2.
*/ */
uint32_t pb; uint32_t pb;
# define LZMA_PB_MIN 0 # define LZMA_PB_MIN 0
@ -346,7 +362,7 @@ typedef struct {
* *
* Setting depth to zero tells liblzma to use an automatic default * Setting depth to zero tells liblzma to use an automatic default
* value, that depends on the selected match finder and nice_len. * value, that depends on the selected match finder and nice_len.
* The default is in the range [10, 200] or so (it may vary between * The default is in the range [4, 200] or so (it may vary between
* liblzma versions). * liblzma versions).
* *
* Using a bigger depth value than the default can increase * Using a bigger depth value than the default can increase
@ -365,8 +381,6 @@ typedef struct {
* with the currently supported options, so it is safe to leave these * with the currently supported options, so it is safe to leave these
* uninitialized. * uninitialized.
*/ */
void *reserved_ptr1;
void *reserved_ptr2;
uint32_t reserved_int1; uint32_t reserved_int1;
uint32_t reserved_int2; uint32_t reserved_int2;
uint32_t reserved_int3; uint32_t reserved_int3;
@ -379,6 +393,8 @@ typedef struct {
lzma_reserved_enum reserved_enum2; lzma_reserved_enum reserved_enum2;
lzma_reserved_enum reserved_enum3; lzma_reserved_enum reserved_enum3;
lzma_reserved_enum reserved_enum4; lzma_reserved_enum reserved_enum4;
void *reserved_ptr1;
void *reserved_ptr2;
} lzma_options_lzma; } lzma_options_lzma;

View File

@ -91,8 +91,6 @@ typedef struct {
lzma_reserved_enum reserved_enum2; lzma_reserved_enum reserved_enum2;
lzma_reserved_enum reserved_enum3; lzma_reserved_enum reserved_enum3;
lzma_reserved_enum reserved_enum4; lzma_reserved_enum reserved_enum4;
lzma_reserved_enum reserved_enum5;
lzma_reserved_enum reserved_enum6;
lzma_bool reserved_bool1; lzma_bool reserved_bool1;
lzma_bool reserved_bool2; lzma_bool reserved_bool2;
lzma_bool reserved_bool3; lzma_bool reserved_bool3;
@ -103,8 +101,6 @@ typedef struct {
lzma_bool reserved_bool8; lzma_bool reserved_bool8;
uint32_t reserved_int1; uint32_t reserved_int1;
uint32_t reserved_int2; uint32_t reserved_int2;
uint32_t reserved_int3;
uint32_t reserved_int4;
} lzma_stream_flags; } lzma_stream_flags;
@ -148,7 +144,7 @@ extern LZMA_API(lzma_ret) lzma_stream_footer_encode(
/** /**
* \brief Decode Stream Header * \brief Decode Stream Header
* *
* \param options Stream Header options to be encoded. * \param options Target for the decoded Stream Header options.
* \param in Beginning of the input buffer of * \param in Beginning of the input buffer of
* LZMA_STREAM_HEADER_SIZE bytes. * LZMA_STREAM_HEADER_SIZE bytes.
* *
@ -183,7 +179,7 @@ extern LZMA_API(lzma_ret) lzma_stream_header_decode(
/** /**
* \brief Decode Stream Footer * \brief Decode Stream Footer
* *
* \param options Stream Header options to be encoded. * \param options Target for the decoded Stream Header options.
* \param in Beginning of the input buffer of * \param in Beginning of the input buffer of
* LZMA_STREAM_HEADER_SIZE bytes. * LZMA_STREAM_HEADER_SIZE bytes.
* *

View File

@ -20,10 +20,10 @@
/* /*
* Version number split into components * Version number split into components
*/ */
#define LZMA_VERSION_MAJOR 4 #define LZMA_VERSION_MAJOR 5
#define LZMA_VERSION_MINOR 999 #define LZMA_VERSION_MINOR 0
#define LZMA_VERSION_PATCH 9 #define LZMA_VERSION_PATCH 0
#define LZMA_VERSION_STABILITY LZMA_VERSION_STABILITY_BETA #define LZMA_VERSION_STABILITY LZMA_VERSION_STABILITY_STABLE
#ifndef LZMA_VERSION_COMMIT #ifndef LZMA_VERSION_COMMIT
# define LZMA_VERSION_COMMIT "" # define LZMA_VERSION_COMMIT ""

View File

@ -29,7 +29,7 @@
/** /**
* \brief Maximum supported value of variable-length integer * \brief Maximum supported value of a variable-length integer
*/ */
#define LZMA_VLI_MAX (UINT64_MAX / 2) #define LZMA_VLI_MAX (UINT64_MAX / 2)
@ -39,11 +39,10 @@
#define LZMA_VLI_UNKNOWN UINT64_MAX #define LZMA_VLI_UNKNOWN UINT64_MAX
/** /**
* \brief Maximum supported length of variable length integers * \brief Maximum supported encoded length of variable length integers
*/ */
#define LZMA_VLI_BYTES_MAX 9 #define LZMA_VLI_BYTES_MAX 9
/** /**
* \brief VLI constant suffix * \brief VLI constant suffix
*/ */
@ -53,19 +52,19 @@
/** /**
* \brief Variable-length integer type * \brief Variable-length integer type
* *
* This will always be unsigned integer. Valid VLI values are in the range * Valid VLI values are in the range [0, LZMA_VLI_MAX]. Unknown value is
* [0, LZMA_VLI_MAX]. Unknown value is indicated with LZMA_VLI_UNKNOWN, * indicated with LZMA_VLI_UNKNOWN, which is the maximum value of the
* which is the maximum value of the underlaying integer type. * underlaying integer type.
* *
* In future, even if lzma_vli is defined to be something other than uint64_t, * lzma_vli will be uint64_t for the foreseeable future. If a bigger size
* it is guaranteed that 2 * LZMA_VLI_MAX will not overflow lzma_vli. * is needed in the future, it is guaranteed that 2 * LZMA_VLI_MAX will
* This simplifies integer overflow detection. * not overflow lzma_vli. This simplifies integer overflow detection.
*/ */
typedef uint64_t lzma_vli; typedef uint64_t lzma_vli;
/** /**
* \brief Simple macro to validate variable-length integer * \brief Validate a variable-length integer
* *
* This is useful to test that application has given acceptable values * This is useful to test that application has given acceptable values
* for example in the uncompressed_size and compressed_size variables. * for example in the uncompressed_size and compressed_size variables.
@ -88,9 +87,9 @@ typedef uint64_t lzma_vli;
* *
* \param vli Integer to be encoded * \param vli Integer to be encoded
* \param vli_pos How many VLI-encoded bytes have already been written * \param vli_pos How many VLI-encoded bytes have already been written
* out. When starting to encode a new integer, *vli_pos * out. When starting to encode a new integer in
* must be set to zero. To use single-call encoding, * multi-call mode, *vli_pos must be set to zero.
* set vli_pos to NULL. * To use single-call encoding, set vli_pos to NULL.
* \param out Beginning of the output buffer * \param out Beginning of the output buffer
* \param out_pos The next byte will be written to out[*out_pos]. * \param out_pos The next byte will be written to out[*out_pos].
* \param out_size Size of the out buffer; the first byte into * \param out_size Size of the out buffer; the first byte into
@ -126,9 +125,9 @@ extern LZMA_API(lzma_ret) lzma_vli_encode(lzma_vli vli, size_t *vli_pos,
* initialize it to zero when *vli_pos == 0, so * initialize it to zero when *vli_pos == 0, so
* application isn't required to initialize *vli. * application isn't required to initialize *vli.
* \param vli_pos How many bytes have already been decoded. When * \param vli_pos How many bytes have already been decoded. When
* starting to decode a new integer, *vli_pos must * starting to decode a new integer in multi-call
* be initialized to zero. To use single-call decoding, * mode, *vli_pos must be initialized to zero. To
* set this to NULL. * use single-call decoding, set vli_pos to NULL.
* \param in Beginning of the input buffer * \param in Beginning of the input buffer
* \param in_pos The next byte will be read from in[*in_pos]. * \param in_pos The next byte will be read from in[*in_pos].
* \param in_size Size of the input buffer; the first byte that * \param in_size Size of the input buffer; the first byte that

View File

@ -182,6 +182,20 @@ lzma_code(lzma_stream *strm, lzma_action action)
|| !strm->internal->supported_actions[action]) || !strm->internal->supported_actions[action])
return LZMA_PROG_ERROR; return LZMA_PROG_ERROR;
// Check if unsupported members have been set to non-zero or non-NULL,
// which would indicate that some new feature is wanted.
if (strm->reserved_ptr1 != NULL
|| strm->reserved_ptr2 != NULL
|| strm->reserved_ptr3 != NULL
|| strm->reserved_ptr4 != NULL
|| strm->reserved_int1 != 0
|| strm->reserved_int2 != 0
|| strm->reserved_int3 != 0
|| strm->reserved_int4 != 0
|| strm->reserved_enum1 != LZMA_RESERVED_ENUM
|| strm->reserved_enum2 != LZMA_RESERVED_ENUM)
return LZMA_OPTIONS_ERROR;
switch (strm->internal->sequence) { switch (strm->internal->sequence) {
case ISEQ_RUN: case ISEQ_RUN:
switch (action) { switch (action) {

View File

@ -226,6 +226,7 @@ lzma_raw_encoder_memusage(const lzma_filter *filters)
} }
/*
extern LZMA_API(lzma_vli) extern LZMA_API(lzma_vli)
lzma_chunk_size(const lzma_filter *filters) lzma_chunk_size(const lzma_filter *filters)
{ {
@ -247,6 +248,7 @@ lzma_chunk_size(const lzma_filter *filters)
return max; return max;
} }
*/
extern LZMA_API(lzma_ret) extern LZMA_API(lzma_ret)

View File

@ -16,8 +16,8 @@
#include "common.h" #include "common.h"
// FIXME !!! Public API // FIXME: Might become a part of the public API once finished.
extern lzma_vli lzma_chunk_size(const lzma_filter *filters); // extern lzma_vli lzma_chunk_size(const lzma_filter *filters);
extern lzma_ret lzma_raw_encoder_init( extern lzma_ret lzma_raw_encoder_init(

View File

@ -18,7 +18,7 @@
/// ///
/// This should be big enough to avoid making lots of tiny allocations /// This should be big enough to avoid making lots of tiny allocations
/// but small enough to avoid too much unused memory at once. /// but small enough to avoid too much unused memory at once.
#define INDEX_GROUP_SIZE 500 #define INDEX_GROUP_SIZE 512
/// \brief How many Records can be allocated at once at maximum /// \brief How many Records can be allocated at once at maximum

View File

@ -291,6 +291,7 @@ lzma_index_decoder(lzma_stream *strm, lzma_index **i, uint64_t memlimit)
lzma_next_strm_init(index_decoder_init, strm, i, memlimit); lzma_next_strm_init(index_decoder_init, strm, i, memlimit);
strm->internal->supported_actions[LZMA_RUN] = true; strm->internal->supported_actions[LZMA_RUN] = true;
strm->internal->supported_actions[LZMA_FINISH] = true;
return LZMA_OK; return LZMA_OK;
} }

View File

@ -209,6 +209,7 @@ lzma_index_encoder(lzma_stream *strm, const lzma_index *i)
lzma_next_strm_init(lzma_index_encoder_init, strm, i); lzma_next_strm_init(lzma_index_encoder_init, strm, i);
strm->internal->supported_actions[LZMA_RUN] = true; strm->internal->supported_actions[LZMA_RUN] = true;
strm->internal->supported_actions[LZMA_FINISH] = true;
return LZMA_OK; return LZMA_OK;
} }

View File

@ -191,7 +191,6 @@ lzma2_decode(lzma_coder *restrict coder, lzma_dict *restrict dict,
case SEQ_COPY: { case SEQ_COPY: {
// Copy from input to the dictionary as is. // Copy from input to the dictionary as is.
// FIXME Can copy too much?
dict_write(dict, in, in_pos, in_size, &coder->compressed_size); dict_write(dict, in, in_pos, in_size, &coder->compressed_size);
if (coder->compressed_size != 0) if (coder->compressed_size != 0)
return LZMA_OK; return LZMA_OK;

View File

@ -656,7 +656,8 @@ lzma_decode(lzma_coder *restrict coder, lzma_dict *restrict dictptr,
} }
case SEQ_EOPM: case SEQ_EOPM:
// TODO Comment // LZMA1 stream with
// end-of-payload marker.
rc_normalize(SEQ_EOPM); rc_normalize(SEQ_EOPM);
ret = LZMA_STREAM_END; ret = LZMA_STREAM_END;
goto out; goto out;
@ -856,7 +857,6 @@ lzma_decoder_reset(lzma_coder *coder, const void *opt)
// NOTE: We assume that lc/lp/pb are valid since they were // NOTE: We assume that lc/lp/pb are valid since they were
// successfully decoded with lzma_lzma_decode_properties(). // successfully decoded with lzma_lzma_decode_properties().
// FIXME?
// Calculate pos_mask. We don't need pos_bits as is for anything. // Calculate pos_mask. We don't need pos_bits as is for anything.
coder->pos_mask = (1U << options->pb) - 1; coder->pos_mask = (1U << options->pb) - 1;

View File

@ -334,7 +334,7 @@ lzma_lzma_encode(lzma_coder *restrict coder, lzma_mf *restrict mf,
// With LZMA2 we need to take care that compressed size of // With LZMA2 we need to take care that compressed size of
// a chunk doesn't get too big. // a chunk doesn't get too big.
// TODO // FIXME? Check if this could be improved.
if (limit != UINT32_MAX if (limit != UINT32_MAX
&& (mf->read_pos - mf->read_ahead >= limit && (mf->read_pos - mf->read_ahead >= limit
|| *out_pos + rc_pending(&coder->rc) || *out_pos + rc_pending(&coder->rc)

View File

@ -77,6 +77,17 @@ static uint64_t start_time;
// gettimeofday(). // gettimeofday().
#ifdef SIGALRM #ifdef SIGALRM
const int message_progress_sigs[] = {
SIGALRM,
#ifdef SIGINFO
SIGINFO,
#endif
#ifdef SIGUSR1
SIGUSR1,
#endif
0
};
/// The signal handler for SIGALRM sets this to true. It is set back to false /// The signal handler for SIGALRM sets this to true. It is set back to false
/// once the progress message has been updated. /// once the progress message has been updated.
static volatile sig_atomic_t progress_needs_updating = false; static volatile sig_atomic_t progress_needs_updating = false;
@ -142,34 +153,15 @@ message_init(void)
*/ */
#ifdef SIGALRM #ifdef SIGALRM
// DJGPP lacks SA_RESTART, but it shouldn't give EINTR
// in most places either.
# if defined(__DJGPP__) && !defined(SA_RESTART)
# define SA_RESTART 0
# endif
// Establish the signal handlers which set a flag to tell us that // Establish the signal handlers which set a flag to tell us that
// progress info should be updated. Since these signals don't // progress info should be updated.
// require any quick action, we set SA_RESTART. That way we don't
// need to block them either in signals_block() to keep stdio
// functions from getting EINTR.
static const int sigs[] = {
SIGALRM,
#ifdef SIGINFO
SIGINFO,
#endif
#ifdef SIGUSR1
SIGUSR1,
#endif
};
struct sigaction sa; struct sigaction sa;
sigemptyset(&sa.sa_mask); sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART; sa.sa_flags = 0;
sa.sa_handler = &progress_signal_handler; sa.sa_handler = &progress_signal_handler;
for (size_t i = 0; i < ARRAY_SIZE(sigs); ++i) for (size_t i = 0; message_progress_sigs[i] != 0; ++i)
if (sigaction(sigs[i], &sa, NULL)) if (sigaction(message_progress_sigs[i], &sa, NULL))
message_signal_handler(); message_signal_handler();
#endif #endif
@ -841,10 +833,13 @@ message_strm(lzma_ret code)
case LZMA_STREAM_END: case LZMA_STREAM_END:
case LZMA_GET_CHECK: case LZMA_GET_CHECK:
case LZMA_PROG_ERROR: case LZMA_PROG_ERROR:
return _("Internal error (bug)"); // Without "default", compiler will warn if new constants
// are added to lzma_ret, it is not too easy to forget to
// add the new constants to this function.
break;
} }
return NULL; return _("Internal error (bug)");
} }

View File

@ -16,10 +16,14 @@ enum message_verbosity {
V_ERROR, ///< Only error messages V_ERROR, ///< Only error messages
V_WARNING, ///< Errors and warnings V_WARNING, ///< Errors and warnings
V_VERBOSE, ///< Errors, warnings, and verbose statistics V_VERBOSE, ///< Errors, warnings, and verbose statistics
V_DEBUG, ///< Debugging, FIXME remove? V_DEBUG, ///< Very verbose
}; };
/// \brief Signals used for progress message handling
extern const int message_progress_sigs[];
/// \brief Initializes the message functions /// \brief Initializes the message functions
/// ///
/// If an error occurs, this function doesn't return. /// If an error occurs, this function doesn't return.

View File

@ -71,6 +71,12 @@ signals_init(void)
for (size_t i = 0; i < ARRAY_SIZE(sigs); ++i) for (size_t i = 0; i < ARRAY_SIZE(sigs); ++i)
sigaddset(&hooked_signals, sigs[i]); sigaddset(&hooked_signals, sigs[i]);
#ifdef SIGALRM
// Add also the signals from message.c to hooked_signals.
for (size_t i = 0; message_progress_sigs[i] != 0; ++i)
sigaddset(&hooked_signals, message_progress_sigs[i]);
#endif
struct sigaction sa; struct sigaction sa;
// All the signals that we handle we also blocked while the signal // All the signals that we handle we also blocked while the signal
@ -142,7 +148,7 @@ signals_exit(void)
const int sig = exit_signal; const int sig = exit_signal;
if (sig != 0) { if (sig != 0) {
#ifdef TUKLIB_DOSLIKE #if defined(TUKLIB_DOSLIKE) || defined(__VMS)
// Don't raise(), set only exit status. This avoids // Don't raise(), set only exit status. This avoids
// printing unwanted message about SIGINT when the user // printing unwanted message about SIGINT when the user
// presses C-c. // presses C-c.

View File

@ -15,6 +15,10 @@ MK_SSP= no
.include "${.CURDIR}/../../usr.bin/cc/Makefile.tgt" .include "${.CURDIR}/../../usr.bin/cc/Makefile.tgt"
.if ${TARGET_CPUARCH} == "sparc64"
LIB= gcc
.endif
.PATH: ${GCCDIR}/config/${GCC_CPU} ${GCCDIR}/config ${GCCDIR} .PATH: ${GCCDIR}/config/${GCC_CPU} ${GCCDIR}/config ${GCCDIR}
CFLAGS+= -DIN_GCC -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED \ CFLAGS+= -DIN_GCC -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED \

View File

@ -184,15 +184,18 @@ The following options are recognized in
.It Dv SO_LISTENQLIMIT Ta "get backlog limit of the socket (get only)" .It Dv SO_LISTENQLIMIT Ta "get backlog limit of the socket (get only)"
.It Dv SO_LISTENQLEN Ta "get complete queue length of the socket (get only)" .It Dv SO_LISTENQLEN Ta "get complete queue length of the socket (get only)"
.It Dv SO_LISTENINCQLEN Ta "get incomplete queue length of the socket (get only)" .It Dv SO_LISTENINCQLEN Ta "get incomplete queue length of the socket (get only)"
.It Dv SO_USER_COOKIE Ta "set the 'so_user_cookie' value for the socket (uint32_t, set only)"
.El .El
.Pp .Pp
.Dv SO_DEBUG .Dv SO_DEBUG
enables debugging in the underlying protocol modules. enables debugging in the underlying protocol modules.
.Pp
.Dv SO_REUSEADDR .Dv SO_REUSEADDR
indicates that the rules used in validating addresses supplied indicates that the rules used in validating addresses supplied
in a in a
.Xr bind 2 .Xr bind 2
system call should allow reuse of local addresses. system call should allow reuse of local addresses.
.Pp
.Dv SO_REUSEPORT .Dv SO_REUSEPORT
allows completely duplicate bindings by multiple processes allows completely duplicate bindings by multiple processes
if they all set if they all set
@ -200,6 +203,7 @@ if they all set
before binding the port. before binding the port.
This option permits multiple instances of a program to each This option permits multiple instances of a program to each
receive UDP/IP multicast or broadcast datagrams destined for the bound port. receive UDP/IP multicast or broadcast datagrams destined for the bound port.
.Pp
.Dv SO_KEEPALIVE .Dv SO_KEEPALIVE
enables the enables the
periodic transmission of messages on a connected socket. periodic transmission of messages on a connected socket.
@ -208,6 +212,7 @@ connected party fail to respond to these messages, the connection is
considered broken and processes using the socket are notified via a considered broken and processes using the socket are notified via a
.Dv SIGPIPE .Dv SIGPIPE
signal when attempting to send data. signal when attempting to send data.
.Pp
.Dv SO_DONTROUTE .Dv SO_DONTROUTE
indicates that outgoing messages should indicates that outgoing messages should
bypass the standard routing facilities. bypass the standard routing facilities.
@ -244,6 +249,7 @@ The option
requests permission to send broadcast datagrams requests permission to send broadcast datagrams
on the socket. on the socket.
Broadcast was a privileged operation in earlier versions of the system. Broadcast was a privileged operation in earlier versions of the system.
.Pp
With protocols that support out-of-band data, the With protocols that support out-of-band data, the
.Dv SO_OOBINLINE .Dv SO_OOBINLINE
option option
@ -256,6 +262,7 @@ calls without the
.Dv MSG_OOB .Dv MSG_OOB
flag. flag.
Some protocols always behave as if this option is set. Some protocols always behave as if this option is set.
.Pp
.Dv SO_SNDBUF .Dv SO_SNDBUF
and and
.Dv SO_RCVBUF .Dv SO_RCVBUF
@ -285,6 +292,7 @@ only if the low water mark amount could be processed.
The default value for The default value for
.Dv SO_SNDLOWAT .Dv SO_SNDLOWAT
is set to a convenient size for network efficiency, often 1024. is set to a convenient size for network efficiency, often 1024.
.Pp
.Dv SO_RCVLOWAT .Dv SO_RCVLOWAT
is an option to set the minimum count for input operations. is an option to set the minimum count for input operations.
In general, receive calls will block until any (non-zero) amount of data In general, receive calls will block until any (non-zero) amount of data
@ -317,6 +325,7 @@ In the current implementation, this timer is restarted each time additional
data are delivered to the protocol, data are delivered to the protocol,
implying that the limit applies to output portions ranging in size implying that the limit applies to output portions ranging in size
from the low water mark to the high water mark for output. from the low water mark to the high water mark for output.
.Pp
.Dv SO_RCVTIMEO .Dv SO_RCVTIMEO
is an option to set a timeout value for input operations. is an option to set a timeout value for input operations.
It accepts a It accepts a
@ -338,6 +347,15 @@ The value must be from 0 to one less than the number returned from
the sysctl the sysctl
.Em net.fibs . .Em net.fibs .
.Pp .Pp
.Dv SO_USER_COOKIE
can be used to set the uint32_t so_user_cookie field in the socket.
The value is an uint32_t, and can be used in the kernel code that
manipulates traffic related to the socket.
The default value for the field is 0.
As an example, the value can be used as the skipto target or
pipe number in
.Nm ipfw/dummynet .
.Pp
.Dv SO_ACCEPTFILTER .Dv SO_ACCEPTFILTER
places an places an
.Xr accept_filter 9 .Xr accept_filter 9

View File

@ -147,11 +147,13 @@ SRCS+= ${file}.c
. endif . endif
.endfor .endfor
.if ${MK_INSTALLLIB} != "no" .if ${MACHINE_CPUARCH} != "sparc64"
. if ${MK_INSTALLLIB} != "no"
SYMLINKS+=libcompiler_rt.a ${LIBDIR}/libgcc.a SYMLINKS+=libcompiler_rt.a ${LIBDIR}/libgcc.a
.endif . endif
.if ${MK_PROFILE} != "no" . if ${MK_PROFILE} != "no"
SYMLINKS+=libcompiler_rt_p.a ${LIBDIR}/libgcc_p.a SYMLINKS+=libcompiler_rt_p.a ${LIBDIR}/libgcc_p.a
. endif
.endif .endif
.include <bsd.lib.mk> .include <bsd.lib.mk>

View File

@ -59,13 +59,14 @@
#define PACKAGE "xz" #define PACKAGE "xz"
#define PACKAGE_BUGREPORT "lasse.collin@tukaani.org" #define PACKAGE_BUGREPORT "lasse.collin@tukaani.org"
#define PACKAGE_NAME "XZ Utils" #define PACKAGE_NAME "XZ Utils"
#define PACKAGE_STRING "XZ Utils 4.999.9beta" #define PACKAGE_STRING "XZ Utils 5.0.0"
#define PACKAGE_TARNAME "xz" #define PACKAGE_TARNAME "xz"
#define PACKAGE_URL "http://tukaani.org/xz/" #define PACKAGE_URL "http://tukaani.org/xz/"
#define PACKAGE_VERSION "4.999.9beta" #define PACKAGE_VERSION "5.0.0"
#define SIZEOF_SIZE_T 8 #define SIZEOF_SIZE_T 8
#define STDC_HEADERS 1 #define STDC_HEADERS 1
#define TUKLIB_CPUCORES_SYSCTL 1 #define TUKLIB_CPUCORES_SYSCTL 1
#define TUKLIB_FAST_UNALIGNED_ACCESS 1
#define TUKLIB_PHYSMEM_SYSCONF 1 #define TUKLIB_PHYSMEM_SYSCONF 1
#ifndef _ALL_SOURCE #ifndef _ALL_SOURCE
# define _ALL_SOURCE 1 # define _ALL_SOURCE 1
@ -82,7 +83,7 @@
#ifndef __EXTENSIONS__ #ifndef __EXTENSIONS__
# define __EXTENSIONS__ 1 # define __EXTENSIONS__ 1
#endif #endif
#define VERSION "4.999.9beta" #define VERSION "5.0.0"
#if defined(__FreeBSD__) #if defined(__FreeBSD__)
#include <machine/endian.h> #include <machine/endian.h>
#if _BYTE_ORDER == _BIG_ENDIAN #if _BYTE_ORDER == _BIG_ENDIAN

View File

@ -29,7 +29,12 @@ SYMLINKS= ${BINDIR}/${PROG} /usr/libexec/${PROG}
MLINKS= rtld.1 ld-elf.so.1.1 \ MLINKS= rtld.1 ld-elf.so.1.1 \
rtld.1 ld.so.1 rtld.1 ld.so.1
CFLAGS+= -fPIC -DPIC .if ${MACHINE_CPUARCH} == "sparc64"
CFLAGS+= -fPIC
.else
CFLAGS+= -fpic
.endif
CFLAGS+= -DPIC
LDFLAGS+= -shared -Wl,-Bsymbolic LDFLAGS+= -shared -Wl,-Bsymbolic
DPADD= ${LIBC_PIC} DPADD= ${LIBC_PIC}
LDADD= -lc_pic -lssp_nonshared LDADD= -lc_pic -lssp_nonshared

View File

@ -297,11 +297,6 @@ build_image() {
PICO_OBJ=${l_objtree}/picobsd/${THETYPE} PICO_OBJ=${l_objtree}/picobsd/${THETYPE}
log "PICO_OBJ is ${PICO_OBJ}" log "PICO_OBJ is ${PICO_OBJ}"
if [ ${OSVERSION} -ge 500035 ] ; then
export MAKEOBJDIRPREFIX=${l_objtree}
eval "export BINMAKE=\"`cd ${SRC}; make -f Makefile -V BINMAKE`\""
eval export `cd ${SRC}; ${BINMAKE} -f Makefile.inc1 -V WMAKEENV`
fi
# create build directory and subtree # create build directory and subtree
mkdir -p ${BUILDDIR}/crunch mkdir -p ${BUILDDIR}/crunch
# remove any old stuff # remove any old stuff
@ -979,10 +974,17 @@ set_build_parameters() {
l_usrtree=${USR:-${SRC}/../usr} l_usrtree=${USR:-${SRC}/../usr}
fi fi
l_objtree=${l_usrtree}/obj-pico l_objtree=${l_usrtree}/obj-pico
PICO_TREE=${PICO_TREE:-${SRC}/release/picobsd} PICO_TREE=${PICO_TREE:-${SRC}/release/picobsd}
set `grep "#define[\t ]__FreeBSD_version" ${SRC}/sys/sys/param.h` set `grep "#define[\t ]__FreeBSD_version" ${SRC}/sys/sys/param.h`
OSVERSION=$3 OSVERSION=$3
log "OSVERSION is ${OSVERSION}" log "OSVERSION is ${OSVERSION}"
if [ ${OSVERSION} -ge 500035 ] ; then
export MAKEOBJDIRPREFIX=${l_objtree}
eval "export BINMAKE=\"`cd ${SRC}; make -f Makefile -V BINMAKE`\""
eval export `cd ${SRC}; ${BINMAKE} -f Makefile.inc1 -V WMAKEENV`
fi
if [ "${o_init_src}" != "" ] ; then if [ "${o_init_src}" != "" ] ; then
if [ ${OSVERSION} -lt 500035 ] ; then if [ ${OSVERSION} -lt 500035 ] ; then
create_includes_and_libraries create_includes_and_libraries

View File

@ -1510,6 +1510,17 @@ interface.
Matches TCP packets that have the SYN bit set but no ACK bit. Matches TCP packets that have the SYN bit set but no ACK bit.
This is the short form of This is the short form of
.Dq Li tcpflags\ syn,!ack . .Dq Li tcpflags\ syn,!ack .
.It Cm sockarg
Matches packets that are associated to a local socket and
for which the SO_USER_COOKIE socket option has been set
to a non-zero value. As a side effect, the value of the
option is made available as
.Cm tablearg
value, which in turn can be used as
.Cm skipto
or
.Cm pipe
number.
.It Cm src-ip Ar ip-address .It Cm src-ip Ar ip-address
Matches IPv4 packets whose source IP is one of the address(es) Matches IPv4 packets whose source IP is one of the address(es)
specified as an argument. specified as an argument.

View File

@ -266,6 +266,7 @@ static struct _s_x rule_options[] = {
{ "estab", TOK_ESTAB }, { "estab", TOK_ESTAB },
{ "established", TOK_ESTAB }, { "established", TOK_ESTAB },
{ "setup", TOK_SETUP }, { "setup", TOK_SETUP },
{ "sockarg", TOK_SOCKARG },
{ "tcpdatalen", TOK_TCPDATALEN }, { "tcpdatalen", TOK_TCPDATALEN },
{ "tcpflags", TOK_TCPFLAGS }, { "tcpflags", TOK_TCPFLAGS },
{ "tcpflgs", TOK_TCPFLAGS }, { "tcpflgs", TOK_TCPFLAGS },
@ -1338,6 +1339,9 @@ show_ipfw(struct ip_fw *rule, int pcwidth, int bcwidth)
case O_FIB: case O_FIB:
printf(" fib %u", cmd->arg1 ); printf(" fib %u", cmd->arg1 );
break; break;
case O_SOCKARG:
printf(" sockarg");
break;
case O_IN: case O_IN:
printf(cmd->len & F_NOT ? " out" : " in"); printf(cmd->len & F_NOT ? " out" : " in");
@ -3531,6 +3535,9 @@ ipfw_add(char *av[])
fill_cmd(cmd, O_FIB, 0, strtoul(*av, NULL, 0)); fill_cmd(cmd, O_FIB, 0, strtoul(*av, NULL, 0));
av++; av++;
break; break;
case TOK_SOCKARG:
fill_cmd(cmd, O_SOCKARG, 0, 0);
break;
case TOK_LOOKUP: { case TOK_LOOKUP: {
ipfw_insn_u32 *c = (ipfw_insn_u32 *)cmd; ipfw_insn_u32 *c = (ipfw_insn_u32 *)cmd;

View File

@ -199,6 +199,7 @@ enum tokens {
TOK_FIB, TOK_FIB,
TOK_SETFIB, TOK_SETFIB,
TOK_LOOKUP, TOK_LOOKUP,
TOK_SOCKARG,
}; };
/* /*
* the following macro returns an error message if we run out of * the following macro returns an error message if we run out of

View File

@ -30,7 +30,7 @@
.\" .\"
.\" $FreeBSD$ .\" $FreeBSD$
.\" .\"
.Dd September 25, 2010 .Dd November 12, 2010
.Dt SIFTR 4 .Dt SIFTR 4
.Os .Os
.Sh NAME .Sh NAME
@ -610,7 +610,9 @@ and the FreeBSD Foundation.
.Sh HISTORY .Sh HISTORY
.Nm .Nm
first appeared in first appeared in
.Fx 9.0 . .Fx 7.4
and
.Fx 8.2 .
.Pp .Pp
.Nm .Nm
was first released in 2007 by Lawrence Stewart and James Healy whilst working on was first released in 2007 by Lawrence Stewart and James Healy whilst working on

View File

@ -1318,7 +1318,6 @@ MLINKS+=vfs_getopt.9 vfs_copyopt.9 \
vfs_getopt.9 vfs_setopt_part.9 \ vfs_getopt.9 vfs_setopt_part.9 \
vfs_getopt.9 vfs_setopts.9 vfs_getopt.9 vfs_setopts.9
MLINKS+=VFS_LOCK_GIANT.9 VFS_UNLOCK_GIANT.9 MLINKS+=VFS_LOCK_GIANT.9 VFS_UNLOCK_GIANT.9
MLINKS+=vgone.9 vgonel.9
MLINKS+=vhold.9 vdrop.9 \ MLINKS+=vhold.9 vdrop.9 \
vhold.9 vdropl.9 \ vhold.9 vdropl.9 \
vhold.9 vholdl.9 vhold.9 vholdl.9

View File

@ -75,7 +75,6 @@ A value of 0 is returned if the flush is successful; otherwise,
will be returned. will be returned.
.Sh SEE ALSO .Sh SEE ALSO
.Xr vgone 9 , .Xr vgone 9 ,
.Xr vgonel 9 ,
.Xr vrele 9 .Xr vrele 9
.Sh AUTHORS .Sh AUTHORS
This manual page was written by This manual page was written by

View File

@ -26,24 +26,21 @@
.\" .\"
.\" $FreeBSD$ .\" $FreeBSD$
.\" .\"
.Dd November 21, 2001 .Dd November 12, 2010
.Dt VGONE 9 .Dt VGONE 9
.Os .Os
.Sh NAME .Sh NAME
.Nm vgone , vgonel .Nm vgone
.Nd "prepare a vnode for reuse" .Nd "prepare a vnode for reuse"
.Sh SYNOPSIS .Sh SYNOPSIS
.In sys/param.h .In sys/param.h
.In sys/vnode.h .In sys/vnode.h
.Ft void .Ft void
.Fn vgone "struct vnode *vp" .Fn vgone "struct vnode *vp"
.Ft void
.Fn vgonel "struct vnode *vp" "struct thread *td"
.Sh DESCRIPTION .Sh DESCRIPTION
The
.Fn vgone .Fn vgone
and function prepares the vnode to be destroyed.
.Fn vgonel
prepare a vnode for reuse by another file system.
The preparation includes the cleaning of all file system specific data and The preparation includes the cleaning of all file system specific data and
the removal from its mount point vnode list. the removal from its mount point vnode list.
.Pp .Pp
@ -55,17 +52,12 @@ flag is not set, it is moved to the head of the free list
as in most cases the vnode as in most cases the vnode
is about to be reused, or its file system is being unmounted. is about to be reused, or its file system is being unmounted.
.Pp .Pp
The difference between The
.Fn vgone .Fn vgone
and function takes an exclusively locked vnode, and returns with the vnode
.Fn vgonel exclusively locked.
is that .Sh SEE ALSO
.Fn vgone .Xr vnode 9
locks the vnode interlock and then calls
.Fn vgonel
while
.Fn vgonel
expects the interlock to already be locked.
.Sh AUTHORS .Sh AUTHORS
This manual page was written by This manual page was written by
.An Chad David Aq davidc@acns.ab.ca . .An Chad David Aq davidc@acns.ab.ca .

View File

@ -7,11 +7,11 @@ unix ?= We run FreeBSD, not UNIX.
.if !defined(%POSIX) .if !defined(%POSIX)
# #
# MACHINE_CPUARCH defines a collection of MACHINE_ARCH. Machines with # MACHINE_CPUARCH defines a collection of MACHINE_ARCH. Machines with
# the same MACHINE_ARCH can run reach-other's binaries, so it # the same MACHINE_ARCH can run each other's binaries, so it necessarily
# necessarily has word size and endian swizzled in. However, support # has word size and endian swizzled in. However, support files for
# files for these machines often are shared amongst all combinations # these machines often are shared amongst all combinations of size
# of size and/or endian. This is called MACHINE_CPU in NetBSD, but # and/or endian. This is called MACHINE_CPU in NetBSD, but that's used
# that's used for something different in FreeBSD. # for something different in FreeBSD.
# #
MACHINE_CPUARCH=${MACHINE_ARCH:C/mipse[lb]/mips/:C/armeb/arm/:C/powerpc64/powerpc/} MACHINE_CPUARCH=${MACHINE_ARCH:C/mipse[lb]/mips/:C/armeb/arm/:C/powerpc64/powerpc/}
.endif .endif

View File

@ -90,6 +90,10 @@ device ad7418 # AD7418 on I2C bus
device cambria_fled # Font Panel LED on I2C bus device cambria_fled # Font Panel LED on I2C bus
device cambria_led # 8-LED latch device cambria_led # 8-LED latch
device gpio
device gpioled
device cambria_gpio # GPIO pins on J11
device ata device ata
device atadisk # ATA disk drives device atadisk # ATA disk drives
device avila_ata # Gateworks CF/IDE support device avila_ata # Gateworks CF/IDE support

View File

@ -54,6 +54,10 @@ hint.fled.0.addr=0x5a
# Octal LED Latch # Octal LED Latch
hint.led_cambria.0.at="ixp0" hint.led_cambria.0.at="ixp0"
# GPIO pins
hint.gpio_cambria.0.at="iicbus0"
hint.gpio_cambria.0.addr=0x56
# Analog Devices AD7418 temperature sensor # Analog Devices AD7418 temperature sensor
hint.ad7418.0.at="iicbus0" hint.ad7418.0.at="iicbus0"
hint.ad7418.0.addr=0x50 hint.ad7418.0.addr=0x50

View File

@ -0,0 +1,471 @@
/*-
* Copyright (c) 2010, Andrew Thompson <thompsa@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice unmodified, this list of conditions, and the following
* disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/*
* GPIO driver for Gateworks Cambria
*
* Note:
* The Cambria PLD does not set the i2c ack bit after each write, if we used the
* regular iicbus interface it would abort the xfer after the address byte
* times out and not write our latch. To get around this we grab the iicbus and
* then do our own bit banging. This is a comprimise to changing all the iicbb
* device methods to allow a flag to be passed down and is similir to how Linux
* does it.
*
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/rman.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/gpio.h>
#include <arm/xscale/ixp425/ixp425reg.h>
#include <arm/xscale/ixp425/ixp425var.h>
#include <arm/xscale/ixp425/ixdp425reg.h>
#include <dev/iicbus/iiconf.h>
#include <dev/iicbus/iicbus.h>
#include "iicbb_if.h"
#include "gpio_if.h"
#define IIC_M_WR 0 /* write operation */
#define PLD_ADDR 0xac /* slave address */
#define I2C_DELAY 10
#define GPIO_CONF_CLR(sc, reg, mask) \
GPIO_CONF_WRITE_4(sc, reg, GPIO_CONF_READ_4(sc, reg) &~ (mask))
#define GPIO_CONF_SET(sc, reg, mask) \
GPIO_CONF_WRITE_4(sc, reg, GPIO_CONF_READ_4(sc, reg) | (mask))
#define GPIO_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx)
#define GPIO_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx)
#define GPIO_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
#define GPIO_PINS 5
struct cambria_gpio_softc {
device_t sc_dev;
bus_space_tag_t sc_iot;
bus_space_handle_t sc_gpio_ioh;
struct mtx sc_mtx;
struct gpio_pin sc_pins[GPIO_PINS];
uint8_t sc_latch;
};
struct cambria_gpio_pin {
const char *name;
int pin;
int flags;
};
extern struct ixp425_softc *ixp425_softc;
static struct cambria_gpio_pin cambria_gpio_pins[GPIO_PINS] = {
{ "GPIO0", 0, GPIO_PIN_OUTPUT },
{ "GPIO1", 1, GPIO_PIN_OUTPUT },
{ "GPIO2", 2, GPIO_PIN_OUTPUT },
{ "GPIO3", 3, GPIO_PIN_OUTPUT },
{ "GPIO4", 4, GPIO_PIN_OUTPUT },
};
/*
* Helpers
*/
static int cambria_gpio_read(struct cambria_gpio_softc *, uint32_t, unsigned int *);
static int cambria_gpio_write(struct cambria_gpio_softc *);
/*
* Driver stuff
*/
static int cambria_gpio_probe(device_t dev);
static int cambria_gpio_attach(device_t dev);
static int cambria_gpio_detach(device_t dev);
/*
* GPIO interface
*/
static int cambria_gpio_pin_max(device_t dev, int *maxpin);
static int cambria_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps);
static int cambria_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t
*flags);
static int cambria_gpio_pin_getname(device_t dev, uint32_t pin, char *name);
static int cambria_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags);
static int cambria_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value);
static int cambria_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val);
static int cambria_gpio_pin_toggle(device_t dev, uint32_t pin);
static int
i2c_getsda(struct cambria_gpio_softc *sc)
{
uint32_t reg;
mtx_lock(&Giant);
GPIO_CONF_SET(sc, IXP425_GPIO_GPOER, GPIO_I2C_SDA_BIT);
reg = GPIO_CONF_READ_4(sc, IXP425_GPIO_GPINR);
mtx_unlock(&Giant);
return (reg & GPIO_I2C_SDA_BIT);
}
static void
i2c_setsda(struct cambria_gpio_softc *sc, int val)
{
mtx_lock(&Giant);
GPIO_CONF_CLR(sc, IXP425_GPIO_GPOUTR, GPIO_I2C_SDA_BIT);
if (val)
GPIO_CONF_SET(sc, IXP425_GPIO_GPOER, GPIO_I2C_SDA_BIT);
else
GPIO_CONF_CLR(sc, IXP425_GPIO_GPOER, GPIO_I2C_SDA_BIT);
mtx_unlock(&Giant);
DELAY(I2C_DELAY);
}
static void
i2c_setscl(struct cambria_gpio_softc *sc, int val)
{
mtx_lock(&Giant);
GPIO_CONF_CLR(sc, IXP425_GPIO_GPOUTR, GPIO_I2C_SCL_BIT);
if (val)
GPIO_CONF_SET(sc, IXP425_GPIO_GPOER, GPIO_I2C_SCL_BIT);
else
GPIO_CONF_CLR(sc, IXP425_GPIO_GPOER, GPIO_I2C_SCL_BIT);
mtx_unlock(&Giant);
DELAY(I2C_DELAY);
}
static void
i2c_sendstart(struct cambria_gpio_softc *sc)
{
i2c_setsda(sc, 1);
i2c_setscl(sc, 1);
i2c_setsda(sc, 0);
i2c_setscl(sc, 0);
}
static void
i2c_sendstop(struct cambria_gpio_softc *sc)
{
i2c_setscl(sc, 1);
i2c_setsda(sc, 1);
i2c_setscl(sc, 0);
i2c_setsda(sc, 0);
}
static void
i2c_sendbyte(struct cambria_gpio_softc *sc, u_char data)
{
int i;
for (i=7; i>=0; i--) {
i2c_setsda(sc, data & (1<<i));
i2c_setscl(sc, 1);
i2c_setscl(sc, 0);
}
i2c_setscl(sc, 1);
i2c_getsda(sc);
i2c_setscl(sc, 0);
}
static u_char
i2c_readbyte(struct cambria_gpio_softc *sc)
{
int i;
unsigned char data=0;
for (i=7; i>=0; i--)
{
i2c_setscl(sc, 1);
if (i2c_getsda(sc))
data |= (1<<i);
i2c_setscl(sc, 0);
}
return data;
}
static int
cambria_gpio_read(struct cambria_gpio_softc *sc, uint32_t pin, unsigned int *val)
{
device_t dev = sc->sc_dev;
int error;
error = iicbus_request_bus(device_get_parent(dev), dev,
IIC_DONTWAIT);
if (error)
return (error);
i2c_sendstart(sc);
i2c_sendbyte(sc, PLD_ADDR | LSB);
*val = (i2c_readbyte(sc) & (1 << pin)) != 0;
i2c_sendstop(sc);
iicbus_release_bus(device_get_parent(dev), dev);
return (0);
}
static int
cambria_gpio_write(struct cambria_gpio_softc *sc)
{
device_t dev = sc->sc_dev;
int error;
error = iicbus_request_bus(device_get_parent(dev), dev,
IIC_DONTWAIT);
if (error)
return (error);
i2c_sendstart(sc);
i2c_sendbyte(sc, PLD_ADDR & ~LSB);
i2c_sendbyte(sc, sc->sc_latch);
i2c_sendstop(sc);
iicbus_release_bus(device_get_parent(dev), dev);
return (0);
}
static int
cambria_gpio_pin_max(device_t dev, int *maxpin)
{
*maxpin = GPIO_PINS - 1;
return (0);
}
static int
cambria_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps)
{
struct cambria_gpio_softc *sc = device_get_softc(dev);
if (pin >= GPIO_PINS)
return (EINVAL);
*caps = sc->sc_pins[pin].gp_caps;
return (0);
}
static int
cambria_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags)
{
struct cambria_gpio_softc *sc = device_get_softc(dev);
if (pin >= GPIO_PINS)
return (EINVAL);
*flags = sc->sc_pins[pin].gp_flags;
return (0);
}
static int
cambria_gpio_pin_getname(device_t dev, uint32_t pin, char *name)
{
struct cambria_gpio_softc *sc = device_get_softc(dev);
if (pin >= GPIO_PINS)
return (EINVAL);
memcpy(name, sc->sc_pins[pin].gp_name, GPIOMAXNAME);
return (0);
}
static int
cambria_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
{
struct cambria_gpio_softc *sc = device_get_softc(dev);
int error;
if (pin >= GPIO_PINS)
return (EINVAL);
/* Filter out unwanted flags */
if ((flags &= sc->sc_pins[pin].gp_caps) != flags)
return (EINVAL);
/* Can't mix input/output together */
if ((flags & (GPIO_PIN_INPUT|GPIO_PIN_OUTPUT)) ==
(GPIO_PIN_INPUT|GPIO_PIN_OUTPUT))
return (EINVAL);
GPIO_LOCK(sc);
sc->sc_pins[pin].gp_flags = flags;
sc->sc_latch |= (1 << pin);
error = cambria_gpio_write(sc);
GPIO_UNLOCK(sc);
return (error);
}
static int
cambria_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value)
{
struct cambria_gpio_softc *sc = device_get_softc(dev);
int error;
if (pin >= GPIO_PINS || sc->sc_pins[pin].gp_flags != GPIO_PIN_OUTPUT)
return (EINVAL);
GPIO_LOCK(sc);
if (value)
sc->sc_latch |= (1 << pin);
else
sc->sc_latch &= ~(1 << pin);
error = cambria_gpio_write(sc);
GPIO_UNLOCK(sc);
return (error);
}
static int
cambria_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val)
{
struct cambria_gpio_softc *sc = device_get_softc(dev);
int error = 0;
if (pin >= GPIO_PINS)
return (EINVAL);
GPIO_LOCK(sc);
if (sc->sc_pins[pin].gp_flags == GPIO_PIN_OUTPUT)
*val = (sc->sc_latch & (1 << pin)) ? 1 : 0;
else
error = cambria_gpio_read(sc, pin, val);
GPIO_UNLOCK(sc);
return (error);
}
static int
cambria_gpio_pin_toggle(device_t dev, uint32_t pin)
{
struct cambria_gpio_softc *sc = device_get_softc(dev);
int error;
if (pin >= GPIO_PINS || sc->sc_pins[pin].gp_flags != GPIO_PIN_OUTPUT)
return (EINVAL);
GPIO_LOCK(sc);
sc->sc_latch ^= (1 << pin);
error = cambria_gpio_write(sc);
GPIO_UNLOCK(sc);
return (error);
}
static int
cambria_gpio_probe(device_t dev)
{
device_set_desc(dev, "Gateworks Cambria GPIO driver");
return (0);
}
static int
cambria_gpio_attach(device_t dev)
{
struct cambria_gpio_softc *sc = device_get_softc(dev);
int pin;
sc->sc_dev = dev;
sc->sc_iot = ixp425_softc->sc_iot;
sc->sc_gpio_ioh = ixp425_softc->sc_gpio_ioh;
mtx_init(&sc->sc_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
MTX_DEF);
for (pin = 0; pin < GPIO_PINS; pin++) {
struct cambria_gpio_pin *p = &cambria_gpio_pins[pin];
strncpy(sc->sc_pins[pin].gp_name, p->name, GPIOMAXNAME);
sc->sc_pins[pin].gp_pin = pin;
sc->sc_pins[pin].gp_caps = GPIO_PIN_INPUT|GPIO_PIN_OUTPUT;
sc->sc_pins[pin].gp_flags = 0;
cambria_gpio_pin_setflags(dev, pin, p->flags);
}
device_add_child(dev, "gpioc", device_get_unit(dev));
device_add_child(dev, "gpiobus", device_get_unit(dev));
return (bus_generic_attach(dev));
}
static int
cambria_gpio_detach(device_t dev)
{
struct cambria_gpio_softc *sc = device_get_softc(dev);
KASSERT(mtx_initialized(&sc->sc_mtx), ("gpio mutex not initialized"));
bus_generic_detach(dev);
mtx_destroy(&sc->sc_mtx);
return(0);
}
static device_method_t cambria_gpio_methods[] = {
DEVMETHOD(device_probe, cambria_gpio_probe),
DEVMETHOD(device_attach, cambria_gpio_attach),
DEVMETHOD(device_detach, cambria_gpio_detach),
/* GPIO protocol */
DEVMETHOD(gpio_pin_max, cambria_gpio_pin_max),
DEVMETHOD(gpio_pin_getname, cambria_gpio_pin_getname),
DEVMETHOD(gpio_pin_getflags, cambria_gpio_pin_getflags),
DEVMETHOD(gpio_pin_getcaps, cambria_gpio_pin_getcaps),
DEVMETHOD(gpio_pin_setflags, cambria_gpio_pin_setflags),
DEVMETHOD(gpio_pin_get, cambria_gpio_pin_get),
DEVMETHOD(gpio_pin_set, cambria_gpio_pin_set),
DEVMETHOD(gpio_pin_toggle, cambria_gpio_pin_toggle),
{0, 0},
};
static driver_t cambria_gpio_driver = {
"gpio_cambria",
cambria_gpio_methods,
sizeof(struct cambria_gpio_softc),
};
static devclass_t cambria_gpio_devclass;
extern devclass_t gpiobus_devclass, gpioc_devclass;
extern driver_t gpiobus_driver, gpioc_driver;
DRIVER_MODULE(gpio_cambria, iicbus, cambria_gpio_driver, cambria_gpio_devclass, 0, 0);
DRIVER_MODULE(gpiobus, gpio_cambria, gpiobus_driver, gpiobus_devclass, 0, 0);
DRIVER_MODULE(gpioc, gpio_cambria, gpioc_driver, gpioc_devclass, 0, 0);
MODULE_VERSION(gpio_cambria, 1);
MODULE_DEPEND(gpio_cambria, iicbus, 1, 1, 1);

View File

@ -6,4 +6,5 @@ arm/xscale/ixp425/avila_gpio.c optional avila_gpio
arm/xscale/ixp425/cambria_exp_space.c standard arm/xscale/ixp425/cambria_exp_space.c standard
arm/xscale/ixp425/cambria_fled.c optional cambria_fled arm/xscale/ixp425/cambria_fled.c optional cambria_fled
arm/xscale/ixp425/cambria_led.c optional cambria_led arm/xscale/ixp425/cambria_led.c optional cambria_led
arm/xscale/ixp425/cambria_gpio.c optional cambria_gpio
arm/xscale/ixp425/ixdp425_pci.c optional pci arm/xscale/ixp425/ixdp425_pci.c optional pci

View File

@ -2598,6 +2598,8 @@ netinet/ip_mroute.c optional mrouting inet | mrouting inet6
netinet/ip_options.c optional inet netinet/ip_options.c optional inet
netinet/ip_output.c optional inet netinet/ip_output.c optional inet
netinet/raw_ip.c optional inet netinet/raw_ip.c optional inet
netinet/cc/cc.c optional inet
netinet/cc/cc_newreno.c optional inet
netinet/sctp_asconf.c optional inet sctp netinet/sctp_asconf.c optional inet sctp
netinet/sctp_auth.c optional inet sctp netinet/sctp_auth.c optional inet sctp
netinet/sctp_bsd_addr.c optional inet sctp netinet/sctp_bsd_addr.c optional inet sctp

View File

@ -85,7 +85,6 @@ powerpc/aim/mmu_oea.c optional aim powerpc
powerpc/aim/mmu_oea64.c optional aim powerpc/aim/mmu_oea64.c optional aim
powerpc/aim/mp_cpudep.c optional aim smp powerpc/aim/mp_cpudep.c optional aim smp
powerpc/aim/nexus.c optional aim powerpc/aim/nexus.c optional aim
powerpc/aim/ofw_machdep.c optional aim
powerpc/aim/ofwmagic.S optional aim powerpc/aim/ofwmagic.S optional aim
powerpc/aim/slb.c optional aim powerpc64 powerpc/aim/slb.c optional aim powerpc64
powerpc/aim/swtch32.S optional aim powerpc powerpc/aim/swtch32.S optional aim powerpc
@ -131,6 +130,7 @@ powerpc/mpc85xx/nexus.c optional mpc85xx
powerpc/mpc85xx/openpic_fdt.c optional fdt powerpc/mpc85xx/openpic_fdt.c optional fdt
powerpc/mpc85xx/pci_fdt.c optional pci mpc85xx powerpc/mpc85xx/pci_fdt.c optional pci mpc85xx
powerpc/ofw/ofw_cpu.c optional aim powerpc/ofw/ofw_cpu.c optional aim
powerpc/ofw/ofw_machdep.c optional aim
powerpc/ofw/ofw_pcibus.c optional pci aim powerpc/ofw/ofw_pcibus.c optional pci aim
powerpc/ofw/ofw_pcib_pci.c optional pci aim powerpc/ofw/ofw_pcib_pci.c optional pci aim
powerpc/ofw/ofw_real.c optional aim powerpc/ofw/ofw_real.c optional aim

View File

@ -668,9 +668,19 @@ acpi_cpu_cx_cst(struct acpi_cpu_softc *sc)
count = MAX_CX_STATES; count = MAX_CX_STATES;
} }
/* Set up all valid states. */ sc->cpu_non_c3 = 0;
sc->cpu_cx_count = 0; sc->cpu_cx_count = 0;
cx_ptr = sc->cpu_cx_states; cx_ptr = sc->cpu_cx_states;
/*
* C1 has been required since just after ACPI 1.0.
* Reserve the first slot for it.
*/
cx_ptr->type = ACPI_STATE_C0;
cx_ptr++;
sc->cpu_cx_count++;
/* Set up all valid states. */
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
pkg = &top->Package.Elements[i + 1]; pkg = &top->Package.Elements[i + 1];
if (!ACPI_PKG_VALID(pkg, 4) || if (!ACPI_PKG_VALID(pkg, 4) ||
@ -685,9 +695,14 @@ acpi_cpu_cx_cst(struct acpi_cpu_softc *sc)
/* Validate the state to see if we should use it. */ /* Validate the state to see if we should use it. */
switch (cx_ptr->type) { switch (cx_ptr->type) {
case ACPI_STATE_C1: case ACPI_STATE_C1:
sc->cpu_non_c3 = i; if (sc->cpu_cx_states[0].type == ACPI_STATE_C0) {
cx_ptr++; /* This is the first C1 state. Use the reserved slot. */
sc->cpu_cx_count++; sc->cpu_cx_states[0] = *cx_ptr;
} else {
sc->cpu_non_c3 = i;
cx_ptr++;
sc->cpu_cx_count++;
}
continue; continue;
case ACPI_STATE_C2: case ACPI_STATE_C2:
sc->cpu_non_c3 = i; sc->cpu_non_c3 = i;
@ -726,6 +741,13 @@ acpi_cpu_cx_cst(struct acpi_cpu_softc *sc)
} }
AcpiOsFree(buf.Pointer); AcpiOsFree(buf.Pointer);
/* If C1 state was not found, we need one now. */
cx_ptr = sc->cpu_cx_states;
if (cx_ptr->type == ACPI_STATE_C0) {
cx_ptr->type = ACPI_STATE_C1;
cx_ptr->trans_lat = 0;
}
return (0); return (0);
} }

View File

@ -481,7 +481,7 @@ static device_method_t gpiobus_methods[] = {
{ 0, 0 } { 0, 0 }
}; };
static driver_t gpiobus_driver = { driver_t gpiobus_driver = {
"gpiobus", "gpiobus",
gpiobus_methods, gpiobus_methods,
sizeof(struct gpiobus_softc) sizeof(struct gpiobus_softc)

View File

@ -188,7 +188,7 @@ static device_method_t gpioc_methods[] = {
{ 0, 0 } { 0, 0 }
}; };
static driver_t gpioc_driver = { driver_t gpioc_driver = {
"gpioc", "gpioc",
gpioc_methods, gpioc_methods,
sizeof(struct gpioc_softc) sizeof(struct gpioc_softc)

View File

@ -784,10 +784,10 @@ fill_kinfo_proc_only(struct proc *p, struct kinfo_proc *kp)
calcru(p, &kp->ki_rusage.ru_utime, &kp->ki_rusage.ru_stime); calcru(p, &kp->ki_rusage.ru_utime, &kp->ki_rusage.ru_stime);
PROC_SUNLOCK(p); PROC_SUNLOCK(p);
calccru(p, &kp->ki_childutime, &kp->ki_childstime); calccru(p, &kp->ki_childutime, &kp->ki_childstime);
/* Some callers want child times in a single value. */
/* Some callers want child-times in a single value */
kp->ki_childtime = kp->ki_childstime; kp->ki_childtime = kp->ki_childstime;
timevaladd(&kp->ki_childtime, &kp->ki_childutime); timevaladd(&kp->ki_childtime, &kp->ki_childutime);
tp = NULL; tp = NULL;
if (p->p_pgrp) { if (p->p_pgrp) {
kp->ki_pgid = p->p_pgrp->pg_id; kp->ki_pgid = p->p_pgrp->pg_id;

View File

@ -2386,6 +2386,7 @@ sosetopt(struct socket *so, struct sockopt *sopt)
struct linger l; struct linger l;
struct timeval tv; struct timeval tv;
u_long val; u_long val;
uint32_t val32;
#ifdef MAC #ifdef MAC
struct mac extmac; struct mac extmac;
#endif #endif
@ -2461,6 +2462,15 @@ sosetopt(struct socket *so, struct sockopt *sopt)
so->so_fibnum = 0; so->so_fibnum = 0;
} }
break; break;
case SO_USER_COOKIE:
error = sooptcopyin(sopt, &val32, sizeof val32,
sizeof val32);
if (error)
goto bad;
so->so_user_cookie = val32;
break;
case SO_SNDBUF: case SO_SNDBUF:
case SO_RCVBUF: case SO_RCVBUF:
case SO_SNDLOWAT: case SO_SNDLOWAT:

161
sys/netinet/cc.h Normal file
View File

@ -0,0 +1,161 @@
/*-
* Copyright (c) 2007-2008
* Swinburne University of Technology, Melbourne, Australia.
* Copyright (c) 2009-2010 Lawrence Stewart <lstewart@freebsd.org>
* Copyright (c) 2010 The FreeBSD Foundation
* All rights reserved.
*
* This software was developed at the Centre for Advanced Internet
* Architectures, Swinburne University, by Lawrence Stewart and James Healy,
* made possible in part by a grant from the Cisco University Research Program
* Fund at Community Foundation Silicon Valley.
*
* Portions of this software were developed at the Centre for Advanced
* Internet Architectures, Swinburne University of Technology, Melbourne,
* Australia by David Hayes under sponsorship from the FreeBSD Foundation.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
/*
* This software was first released in 2007 by James Healy and Lawrence Stewart
* whilst working on the NewTCP research project at Swinburne University's
* Centre for Advanced Internet Architectures, Melbourne, Australia, which was
* made possible in part by a grant from the Cisco University Research Program
* Fund at Community Foundation Silicon Valley. More details are available at:
* http://caia.swin.edu.au/urp/newtcp/
*/
#ifndef _NETINET_CC_H_
#define _NETINET_CC_H_
/* XXX: TCP_CA_NAME_MAX define lives in tcp.h for compat reasons. */
#include <netinet/tcp.h>
/* Global CC vars. */
extern STAILQ_HEAD(cc_head, cc_algo) cc_list;
extern const int tcprexmtthresh;
extern struct cc_algo newreno_cc_algo;
/* Define the new net.inet.tcp.cc sysctl tree. */
SYSCTL_DECL(_net_inet_tcp_cc);
/* CC housekeeping functions. */
void cc_init(void);
int cc_register_algo(struct cc_algo *add_cc);
int cc_deregister_algo(struct cc_algo *remove_cc);
/*
* Wrapper around transport structs that contain same-named congestion
* control variables. Allows algos to be shared amongst multiple CC aware
* transprots.
*/
struct cc_var {
void *cc_data; /* Per-connection private CC algorithm data. */
int bytes_this_ack; /* # bytes acked by the current ACK. */
tcp_seq curack; /* Most recent ACK. */
uint32_t flags; /* Flags for cc_var (see below) */
int type; /* Indicates which ptr is valid in ccvc. */
union ccv_container {
struct tcpcb *tcp;
struct sctp_nets *sctp;
} ccvc;
};
/* cc_var flags. */
#define CCF_ABC_SENTAWND 0x0001 /* ABC counted cwnd worth of bytes? */
#define CCF_CWND_LIMITED 0x0002 /* Are we currently cwnd limited? */
/* ACK types passed to the ack_received() hook. */
#define CC_ACK 0x0001 /* Regular in sequence ACK. */
#define CC_DUPACK 0x0002 /* Duplicate ACK. */
#define CC_PARTIALACK 0x0004 /* Not yet. */
#define CC_SACK 0x0008 /* Not yet. */
/*
* Congestion signal types passed to the cong_signal() hook. The highest order 8
* bits (0x01000000 - 0x80000000) are reserved for CC algos to declare their own
* congestion signal types.
*/
#define CC_ECN 0x000001/* ECN marked packet received. */
#define CC_RTO 0x000002/* RTO fired. */
#define CC_RTO_ERR 0x000004/* RTO fired in error. */
#define CC_NDUPACK 0x000008/* Threshold of dupack's reached. */
/*
* Structure to hold data and function pointers that together represent a
* congestion control algorithm.
*/
struct cc_algo {
char name[TCP_CA_NAME_MAX];
/* Init global module state on kldload. */
int (*mod_init)(void);
/* Cleanup global module state on kldunload. */
int (*mod_destroy)(void);
/* Init CC state for a new control block. */
int (*cb_init)(struct cc_var *ccv);
/* Cleanup CC state for a terminating control block. */
void (*cb_destroy)(struct cc_var *ccv);
/* Init variables for a newly established connection. */
void (*conn_init)(struct cc_var *ccv);
/* Called on receipt of an ack. */
void (*ack_received)(struct cc_var *ccv, uint16_t type);
/* Called on detection of a congestion signal. */
void (*cong_signal)(struct cc_var *ccv, uint32_t type);
/* Called after exiting congestion recovery. */
void (*post_recovery)(struct cc_var *ccv);
/* Called when data transfer resumes after an idle period. */
void (*after_idle)(struct cc_var *ccv);
STAILQ_ENTRY (cc_algo) entries;
};
/* Macro to obtain the CC algo's struct ptr. */
#define CC_ALGO(tp) ((tp)->cc_algo)
/* Macro to obtain the CC algo's data ptr. */
#define CC_DATA(tp) ((tp)->ccv->cc_data)
/* Macro to obtain the system default CC algo's struct ptr. */
#define CC_DEFAULT() STAILQ_FIRST(&cc_list)
extern struct rwlock cc_list_lock;
#define CC_LIST_LOCK_INIT() rw_init(&cc_list_lock, "cc_list")
#define CC_LIST_LOCK_DESTROY() rw_destroy(&cc_list_lock)
#define CC_LIST_RLOCK() rw_rlock(&cc_list_lock)
#define CC_LIST_RUNLOCK() rw_runlock(&cc_list_lock)
#define CC_LIST_WLOCK() rw_wlock(&cc_list_lock)
#define CC_LIST_WUNLOCK() rw_wunlock(&cc_list_lock)
#define CC_LIST_WLOCK_ASSERT() rw_assert(&cc_list_lock, RA_WLOCKED)
#endif /* _NETINET_CC_H_ */

340
sys/netinet/cc/cc.c Normal file
View File

@ -0,0 +1,340 @@
/*-
* Copyright (c) 2007-2008
* Swinburne University of Technology, Melbourne, Australia.
* Copyright (c) 2009-2010 Lawrence Stewart <lstewart@freebsd.org>
* Copyright (c) 2010 The FreeBSD Foundation
* All rights reserved.
*
* This software was developed at the Centre for Advanced Internet
* Architectures, Swinburne University, by Lawrence Stewart and James Healy,
* made possible in part by a grant from the Cisco University Research Program
* Fund at Community Foundation Silicon Valley.
*
* Portions of this software were developed at the Centre for Advanced
* Internet Architectures, Swinburne University of Technology, Melbourne,
* Australia by David Hayes under sponsorship from the FreeBSD Foundation.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/*
* This software was first released in 2007 by James Healy and Lawrence Stewart
* whilst working on the NewTCP research project at Swinburne University's
* Centre for Advanced Internet Architectures, Melbourne, Australia, which was
* made possible in part by a grant from the Cisco University Research Program
* Fund at Community Foundation Silicon Valley. More details are available at:
* http://caia.swin.edu.au/urp/newtcp/
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/libkern.h>
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/mutex.h>
#include <sys/queue.h>
#include <sys/rwlock.h>
#include <sys/sbuf.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_var.h>
#include <netinet/cc.h>
#include <netinet/in.h>
#include <netinet/in_pcb.h>
#include <netinet/tcp_var.h>
#include <netinet/cc/cc_module.h>
/*
* List of available cc algorithms on the current system. First element
* is used as the system default CC algorithm.
*/
struct cc_head cc_list = STAILQ_HEAD_INITIALIZER(cc_list);
/* Protects the cc_list TAILQ. */
struct rwlock cc_list_lock;
/*
* Set the default CC algorithm to new_default. The default is identified
* by being the first element in the cc_list TAILQ.
*/
static void
cc_set_default(struct cc_algo *new_default)
{
CC_LIST_WLOCK_ASSERT();
/*
* Make the requested system default CC algorithm the first element in
* the list if it isn't already.
*/
if (new_default != CC_DEFAULT()) {
STAILQ_REMOVE(&cc_list, new_default, cc_algo, entries);
STAILQ_INSERT_HEAD(&cc_list, new_default, entries);
}
}
/*
* Sysctl handler to show and change the default CC algorithm.
*/
static int
cc_default_algo(SYSCTL_HANDLER_ARGS)
{
struct cc_algo *funcs;
int err, found;
err = found = 0;
if (req->newptr == NULL) {
char default_cc[TCP_CA_NAME_MAX];
/* Just print the current default. */
CC_LIST_RLOCK();
strlcpy(default_cc, CC_DEFAULT()->name, TCP_CA_NAME_MAX);
CC_LIST_RUNLOCK();
err = sysctl_handle_string(oidp, default_cc, 1, req);
} else {
/* Find algo with specified name and set it to default. */
CC_LIST_WLOCK();
STAILQ_FOREACH(funcs, &cc_list, entries) {
if (strncmp((char *)req->newptr, funcs->name,
TCP_CA_NAME_MAX) == 0) {
found = 1;
cc_set_default(funcs);
}
}
CC_LIST_WUNLOCK();
if (!found)
err = ESRCH;
}
return (err);
}
/*
* Sysctl handler to display the list of available CC algorithms.
*/
static int
cc_list_available(SYSCTL_HANDLER_ARGS)
{
struct cc_algo *algo;
struct sbuf *s;
int err, first;
err = 0;
first = 1;
s = sbuf_new(NULL, NULL, TCP_CA_NAME_MAX, SBUF_AUTOEXTEND);
if (s == NULL)
return (ENOMEM);
CC_LIST_RLOCK();
STAILQ_FOREACH(algo, &cc_list, entries) {
err = sbuf_printf(s, first ? "%s" : ", %s", algo->name);
if (err)
break;
first = 0;
}
CC_LIST_RUNLOCK();
if (!err) {
sbuf_finish(s);
err = sysctl_handle_string(oidp, sbuf_data(s), 1, req);
}
sbuf_delete(s);
return (err);
}
/*
* Initialise CC subsystem on system boot.
*/
void
cc_init()
{
CC_LIST_LOCK_INIT();
STAILQ_INIT(&cc_list);
}
/*
* Returns non-zero on success, 0 on failure.
*/
int
cc_deregister_algo(struct cc_algo *remove_cc)
{
struct cc_algo *funcs, *tmpfuncs;
struct tcpcb *tp;
struct inpcb *inp;
int err;
err = ENOENT;
/* Never allow newreno to be deregistered. */
if (&newreno_cc_algo == remove_cc)
return (EPERM);
/* Remove algo from cc_list so that new connections can't use it. */
CC_LIST_WLOCK();
STAILQ_FOREACH_SAFE(funcs, &cc_list, entries, tmpfuncs) {
if (funcs == remove_cc) {
/*
* If we're removing the current system default,
* reset the default to newreno.
*/
if (strncmp(CC_DEFAULT()->name, remove_cc->name,
TCP_CA_NAME_MAX) == 0)
cc_set_default(&newreno_cc_algo);
STAILQ_REMOVE(&cc_list, funcs, cc_algo, entries);
err = 0;
break;
}
}
CC_LIST_WUNLOCK();
if (!err) {
/*
* Check all active control blocks and change any that are
* using this algorithm back to newreno. If the algorithm that
* was in use requires cleanup code to be run, call it.
*
* New connections already part way through being initialised
* with the CC algo we're removing will not race with this code
* because the INP_INFO_WLOCK is held during initialisation.
* We therefore don't enter the loop below until the connection
* list has stabilised.
*/
INP_INFO_RLOCK(&V_tcbinfo);
LIST_FOREACH(inp, &V_tcb, inp_list) {
INP_WLOCK(inp);
/* Important to skip tcptw structs. */
if (!(inp->inp_flags & INP_TIMEWAIT) &&
(tp = intotcpcb(inp)) != NULL) {
/*
* By holding INP_WLOCK here, we are
* assured that the connection is not
* currently executing inside the CC
* module's functions i.e. it is safe to
* make the switch back to newreno.
*/
if (CC_ALGO(tp) == remove_cc) {
tmpfuncs = CC_ALGO(tp);
/* Newreno does not require any init. */
CC_ALGO(tp) = &newreno_cc_algo;
if (tmpfuncs->cb_destroy != NULL)
tmpfuncs->cb_destroy(tp->ccv);
}
}
INP_WUNLOCK(inp);
}
INP_INFO_RUNLOCK(&V_tcbinfo);
}
return (err);
}
/*
* Returns 0 on success, non-zero on failure.
*/
int
cc_register_algo(struct cc_algo *add_cc)
{
struct cc_algo *funcs;
int err;
err = 0;
/*
* Iterate over list of registered CC algorithms and make sure
* we're not trying to add a duplicate.
*/
CC_LIST_WLOCK();
STAILQ_FOREACH(funcs, &cc_list, entries) {
if (funcs == add_cc || strncmp(funcs->name, add_cc->name,
TCP_CA_NAME_MAX) == 0)
err = EEXIST;
}
if (!err)
STAILQ_INSERT_TAIL(&cc_list, add_cc, entries);
CC_LIST_WUNLOCK();
return (err);
}
/*
* Handles kld related events. Returns 0 on success, non-zero on failure.
*/
int
cc_modevent(module_t mod, int event_type, void *data)
{
struct cc_algo *algo;
int err;
err = 0;
algo = (struct cc_algo *)data;
switch(event_type) {
case MOD_LOAD:
if (algo->mod_init != NULL)
err = algo->mod_init();
if (!err)
err = cc_register_algo(algo);
break;
case MOD_QUIESCE:
case MOD_SHUTDOWN:
case MOD_UNLOAD:
err = cc_deregister_algo(algo);
if (!err && algo->mod_destroy != NULL)
algo->mod_destroy();
if (err == ENOENT)
err = 0;
break;
default:
err = EINVAL;
break;
}
return (err);
}
/* Declare sysctl tree and populate it. */
SYSCTL_NODE(_net_inet_tcp, OID_AUTO, cc, CTLFLAG_RW, NULL,
"congestion control related settings");
SYSCTL_PROC(_net_inet_tcp_cc, OID_AUTO, algorithm, CTLTYPE_STRING|CTLFLAG_RW,
NULL, 0, cc_default_algo, "A", "default congestion control algorithm");
SYSCTL_PROC(_net_inet_tcp_cc, OID_AUTO, available, CTLTYPE_STRING|CTLFLAG_RD,
NULL, 0, cc_list_available, "A",
"list available congestion control algorithms");

View File

@ -0,0 +1,70 @@
/*-
* Copyright (c) 2009-2010 Lawrence Stewart <lstewart@freebsd.org>
* All rights reserved.
*
* This software was developed by Lawrence Stewart while studying at the Centre
* for Advanced Internet Architectures, Swinburne University, made possible in
* part by a grant from the Cisco University Research Program Fund at Community
* Foundation Silicon Valley.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
/*
* This software was first released in 2009 by Lawrence Stewart as part of the
* NewTCP research project at Swinburne University's Centre for Advanced
* Internet Architectures, Melbourne, Australia, which was made possible in part
* by a grant from the Cisco University Research Program Fund at Community
* Foundation Silicon Valley. More details are available at:
* http://caia.swin.edu.au/urp/newtcp/
*/
#ifndef _NETINET_CC_MODULE_H_
#define _NETINET_CC_MODULE_H_
/*
* Allows a CC algorithm to manipulate a commonly named CC variable regardless
* of the transport protocol and associated C struct.
* XXXLAS: Out of action until the work to support SCTP is done.
*
#define CCV(ccv, what) \
(*( \
(ccv)->type == IPPROTO_TCP ? &(ccv)->ccvc.tcp->what : \
&(ccv)->ccvc.sctp->what \
))
*/
#define CCV(ccv, what) (ccv)->ccvc.tcp->what
#define DECLARE_CC_MODULE(ccname, ccalgo) \
static moduledata_t cc_##ccname = { \
.name = #ccname, \
.evhand = cc_modevent, \
.priv = ccalgo \
}; \
DECLARE_MODULE(ccname, cc_##ccname, \
SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY)
int cc_modevent(module_t mod, int type, void *data);
#endif /* _NETINET_CC_MODULE_H_ */

231
sys/netinet/cc/cc_newreno.c Normal file
View File

@ -0,0 +1,231 @@
/*-
* Copyright (c) 1982, 1986, 1988, 1990, 1993, 1994, 1995
* The Regents of the University of California.
* Copyright (c) 2007-2008,2010
* Swinburne University of Technology, Melbourne, Australia.
* Copyright (c) 2009-2010 Lawrence Stewart <lstewart@freebsd.org>
* Copyright (c) 2010 The FreeBSD Foundation
* All rights reserved.
*
* This software was developed at the Centre for Advanced Internet
* Architectures, Swinburne University, by Lawrence Stewart, James Healy and
* David Hayes, made possible in part by a grant from the Cisco University
* Research Program Fund at Community Foundation Silicon Valley.
*
* Portions of this software were developed at the Centre for Advanced
* Internet Architectures, Swinburne University of Technology, Melbourne,
* Australia by David Hayes under sponsorship from the FreeBSD Foundation.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/*
* This software was first released in 2007 by James Healy and Lawrence Stewart
* whilst working on the NewTCP research project at Swinburne University's
* Centre for Advanced Internet Architectures, Melbourne, Australia, which was
* made possible in part by a grant from the Cisco University Research Program
* Fund at Community Foundation Silicon Valley. More details are available at:
* http://caia.swin.edu.au/urp/newtcp/
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_var.h>
#include <netinet/cc.h>
#include <netinet/in.h>
#include <netinet/in_pcb.h>
#include <netinet/tcp_seq.h>
#include <netinet/tcp_var.h>
#include <netinet/cc/cc_module.h>
void newreno_ack_received(struct cc_var *ccv, uint16_t type);
void newreno_cong_signal(struct cc_var *ccv, uint32_t type);
void newreno_post_recovery(struct cc_var *ccv);
void newreno_after_idle(struct cc_var *ccv);
struct cc_algo newreno_cc_algo = {
.name = "newreno",
.ack_received = newreno_ack_received,
.cong_signal = newreno_cong_signal,
.post_recovery = newreno_post_recovery,
.after_idle = newreno_after_idle
};
/*
* Increase cwnd on receipt of a successful ACK:
* if cwnd <= ssthresh, increases by 1 MSS per ACK
* if cwnd > ssthresh, increase by ~1 MSS per RTT
*/
void
newreno_ack_received(struct cc_var *ccv, uint16_t type)
{
if (type == CC_ACK && !IN_RECOVERY(CCV(ccv, t_flags)) &&
(ccv->flags & CCF_CWND_LIMITED)) {
u_int cw = CCV(ccv, snd_cwnd);
u_int incr = CCV(ccv, t_maxseg);
/*
* Regular in-order ACK, open the congestion window.
* Method depends on which congestion control state we're
* in (slow start or cong avoid) and if ABC (RFC 3465) is
* enabled.
*
* slow start: cwnd <= ssthresh
* cong avoid: cwnd > ssthresh
*
* slow start and ABC (RFC 3465):
* Grow cwnd exponentially by the amount of data
* ACKed capping the max increment per ACK to
* (abc_l_var * maxseg) bytes.
*
* slow start without ABC (RFC 5681):
* Grow cwnd exponentially by maxseg per ACK.
*
* cong avoid and ABC (RFC 3465):
* Grow cwnd linearly by maxseg per RTT for each
* cwnd worth of ACKed data.
*
* cong avoid without ABC (RFC 5681):
* Grow cwnd linearly by approximately maxseg per RTT using
* maxseg^2 / cwnd per ACK as the increment.
* If cwnd > maxseg^2, fix the cwnd increment at 1 byte to
* avoid capping cwnd.
*/
if (cw > CCV(ccv, snd_ssthresh)) {
if (V_tcp_do_rfc3465) {
if (ccv->flags & CCF_ABC_SENTAWND)
ccv->flags &= ~CCF_ABC_SENTAWND;
else
incr = 0;
} else
incr = max((incr * incr / cw), 1);
} else if (V_tcp_do_rfc3465) {
/*
* In slow-start with ABC enabled and no RTO in sight?
* (Must not use abc_l_var > 1 if slow starting after
* an RTO. On RTO, snd_nxt = snd_una, so the
* snd_nxt == snd_max check is sufficient to
* handle this).
*
* XXXLAS: Find a way to signal SS after RTO that
* doesn't rely on tcpcb vars.
*/
if (CCV(ccv, snd_nxt) == CCV(ccv, snd_max))
incr = min(ccv->bytes_this_ack,
V_tcp_abc_l_var * CCV(ccv, t_maxseg));
else
incr = min(ccv->bytes_this_ack, CCV(ccv, t_maxseg));
}
/* ABC is on by default, so incr equals 0 frequently. */
if (incr > 0)
CCV(ccv, snd_cwnd) = min(cw + incr,
TCP_MAXWIN << CCV(ccv, snd_scale));
}
}
/*
* manage congestion signals
*/
void
newreno_cong_signal(struct cc_var *ccv, uint32_t type)
{
u_int win;
win = max(CCV(ccv, snd_cwnd) / 2 / CCV(ccv, t_maxseg), 2) *
CCV(ccv, t_maxseg);
switch (type) {
case CC_NDUPACK:
if (!IN_FASTRECOVERY(CCV(ccv, t_flags))) {
if (!IN_CONGRECOVERY(CCV(ccv, t_flags)))
CCV(ccv, snd_ssthresh) = win;
ENTER_RECOVERY(CCV(ccv, t_flags));
}
break;
case CC_ECN:
if (!IN_CONGRECOVERY(CCV(ccv, t_flags))) {
CCV(ccv, snd_ssthresh) = win;
CCV(ccv, snd_cwnd) = win;
ENTER_CONGRECOVERY(CCV(ccv, t_flags));
}
break;
}
}
/*
* decrease the cwnd in response to packet loss or a transmit timeout.
* th can be null, in which case cwnd will be set according to reno instead
* of new reno.
*/
void
newreno_post_recovery(struct cc_var *ccv)
{
if (IN_FASTRECOVERY(CCV(ccv, t_flags))) {
/*
* Fast recovery will conclude after returning from this
* function. Window inflation should have left us with
* approximately snd_ssthresh outstanding data. But in case we
* would be inclined to send a burst, better to do it via the
* slow start mechanism.
*
* XXXLAS: Find a way to do this without needing curack
*/
if (SEQ_GT(ccv->curack + CCV(ccv, snd_ssthresh),
CCV(ccv, snd_max)))
CCV(ccv, snd_cwnd) = CCV(ccv, snd_max) -
ccv->curack + CCV(ccv, t_maxseg);
else
CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
}
}
/*
* if a connection has been idle for a while and more data is ready to be sent,
* reset cwnd
*/
void
newreno_after_idle(struct cc_var *ccv)
{
/*
* We have been idle for "a while" and no acks are expected to clock out
* any data we send -- slow start to get ack "clock" running again.
*/
if (V_tcp_do_rfc3390)
CCV(ccv, snd_cwnd) = min(4 * CCV(ccv, t_maxseg),
max(2 * CCV(ccv, t_maxseg), 4380));
else
CCV(ccv, snd_cwnd) = CCV(ccv, t_maxseg) * 2;
}
DECLARE_CC_MODULE(newreno, &newreno_cc_algo);

View File

@ -192,10 +192,13 @@ enum ipfw_opcodes { /* arguments (4 byte each) */
O_SETFIB, /* arg1=FIB number */ O_SETFIB, /* arg1=FIB number */
O_FIB, /* arg1=FIB desired fib number */ O_FIB, /* arg1=FIB desired fib number */
O_SOCKARG, /* socket argument */
O_LAST_OPCODE /* not an opcode! */ O_LAST_OPCODE /* not an opcode! */
}; };
/* /*
* The extension header are filtered only for presence using a bit * The extension header are filtered only for presence using a bit
* vector with a flag for each header. * vector with a flag for each header.

View File

@ -1801,6 +1801,39 @@ do { \
match = 1; match = 1;
break; break;
case O_SOCKARG: {
struct inpcb *inp = args->inp;
struct inpcbinfo *pi;
if (is_ipv6) /* XXX can we remove this ? */
break;
if (proto == IPPROTO_TCP)
pi = &V_tcbinfo;
else if (proto == IPPROTO_UDP)
pi = &V_udbinfo;
else
break;
/* For incomming packet, lookup up the
inpcb using the src/dest ip/port tuple */
if (inp == NULL) {
INP_INFO_RLOCK(pi);
inp = in_pcblookup_hash(pi,
src_ip, htons(src_port),
dst_ip, htons(dst_port),
0, NULL);
INP_INFO_RUNLOCK(pi);
}
if (inp && inp->inp_socket) {
tablearg = inp->inp_socket->so_user_cookie;
if (tablearg)
match = 1;
}
break;
}
case O_TAGGED: { case O_TAGGED: {
struct m_tag *mtag; struct m_tag *mtag;
uint32_t tag = (cmd->arg1 == IP_FW_TABLEARG) ? uint32_t tag = (cmd->arg1 == IP_FW_TABLEARG) ?

View File

@ -572,6 +572,7 @@ check_ipfw_struct(struct ip_fw *rule, int size)
case O_IPTOS: case O_IPTOS:
case O_IPPRECEDENCE: case O_IPPRECEDENCE:
case O_IPVER: case O_IPVER:
case O_SOCKARG:
case O_TCPWIN: case O_TCPWIN:
case O_TCPFLAGS: case O_TCPFLAGS:
case O_TCPOPTS: case O_TCPOPTS:

View File

@ -1,9 +1,7 @@
/** /*-
* @file alias_sctp.c * Copyright (c) 2008
* Copyright (c) 2008, Centre for Advanced Internet Architectures * Swinburne University of Technology, Melbourne, Australia.
* Swinburne University of Technology, Melbourne, Australia *
* (CRICOS number 00111D).
*
* 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:
@ -12,11 +10,7 @@
* 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 names of the authors, the "Centre for Advanced Internet Architectures" *
* and "Swinburne University of Technology" may not be used to endorse
* or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS "AS IS" AND * THIS SOFTWARE IS PROVIDED BY THE AUTHORS 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
@ -28,7 +22,9 @@
* 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.
* */
/*
* Alias_sctp forms part of the libalias kernel module to handle * Alias_sctp forms part of the libalias kernel module to handle
* Network Address Translation (NAT) for the SCTP protocol. * Network Address Translation (NAT) for the SCTP protocol.
* *

View File

@ -1,9 +1,7 @@
/** /*-
* @file alias_sctp.h * Copyright (c) 2008
* Copyright (c) 2008, Centre for Advanced Internet Architectures * Swinburne University of Technology, Melbourne, Australia.
* Swinburne University of Technology, Melbourne, Australia *
* (CRICOS number 00111D).
*
* 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:
@ -12,11 +10,7 @@
* 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 names of the authors, the "Centre for Advanced Internet Architectures" *
* and "Swinburne University of Technology" may not be used to endorse
* or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS "AS IS" AND * THIS SOFTWARE IS PROVIDED BY THE AUTHORS 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
@ -28,7 +22,9 @@
* 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.
* */
/*
* Alias_sctp forms part of the libalias kernel module to handle * Alias_sctp forms part of the libalias kernel module to handle
* Network Address Translation (NAT) for the SCTP protocol. * Network Address Translation (NAT) for the SCTP protocol.
* *

View File

@ -1,7 +1,6 @@
/*- /*-
* Copyright (c) 2007-2009, Centre for Advanced Internet Architectures * Copyright (c) 2007-2009
* Swinburne University of Technology, Melbourne, Australia * Swinburne University of Technology, Melbourne, Australia.
* (CRICOS number 00111D).
* Copyright (c) 2009-2010, The FreeBSD Foundation * Copyright (c) 2009-2010, The FreeBSD Foundation
* All rights reserved. * All rights reserved.
* *

View File

@ -1,6 +1,20 @@
/*- /*-
* Copyright (c) 1982, 1986, 1988, 1990, 1993, 1994, 1995 * Copyright (c) 1982, 1986, 1988, 1990, 1993, 1994, 1995
* The Regents of the University of California. All rights reserved. * The Regents of the University of California. All rights reserved.
* Copyright (c) 2007-2008,2010
* Swinburne University of Technology, Melbourne, Australia.
* Copyright (c) 2009-2010 Lawrence Stewart <lstewart@freebsd.org>
* Copyright (c) 2010 The FreeBSD Foundation
* All rights reserved.
*
* Portions of this software were developed at the Centre for Advanced Internet
* Architectures, Swinburne University, by Lawrence Stewart, James Healy and
* David Hayes, made possible in part by a grant from the Cisco University
* Research Program Fund at Community Foundation Silicon Valley.
*
* Portions of this software were developed at the Centre for Advanced
* Internet Architectures, Swinburne University of Technology, Melbourne,
* Australia by David Hayes under sponsorship from the FreeBSD Foundation.
* *
* 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
@ -61,6 +75,7 @@ __FBSDID("$FreeBSD$");
#define TCPSTATES /* for logging */ #define TCPSTATES /* for logging */
#include <netinet/cc.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <netinet/in_pcb.h> #include <netinet/in_pcb.h>
#include <netinet/in_systm.h> #include <netinet/in_systm.h>
@ -75,7 +90,6 @@ __FBSDID("$FreeBSD$");
#include <netinet6/in6_pcb.h> #include <netinet6/in6_pcb.h>
#include <netinet6/ip6_var.h> #include <netinet6/ip6_var.h>
#include <netinet6/nd6.h> #include <netinet6/nd6.h>
#include <netinet/tcp.h>
#include <netinet/tcp_fsm.h> #include <netinet/tcp_fsm.h>
#include <netinet/tcp_seq.h> #include <netinet/tcp_seq.h>
#include <netinet/tcp_timer.h> #include <netinet/tcp_timer.h>
@ -96,7 +110,7 @@ __FBSDID("$FreeBSD$");
#include <security/mac/mac_framework.h> #include <security/mac/mac_framework.h>
static const int tcprexmtthresh = 3; const int tcprexmtthresh = 3;
VNET_DEFINE(struct tcpstat, tcpstat); VNET_DEFINE(struct tcpstat, tcpstat);
SYSCTL_VNET_STRUCT(_net_inet_tcp, TCPCTL_STATS, stats, CTLFLAG_RW, SYSCTL_VNET_STRUCT(_net_inet_tcp, TCPCTL_STATS, stats, CTLFLAG_RW,
@ -132,19 +146,16 @@ SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, rfc3042, CTLFLAG_RW,
"Enable RFC 3042 (Limited Transmit)"); "Enable RFC 3042 (Limited Transmit)");
VNET_DEFINE(int, tcp_do_rfc3390) = 1; VNET_DEFINE(int, tcp_do_rfc3390) = 1;
#define V_tcp_do_rfc3390 VNET(tcp_do_rfc3390)
SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, rfc3390, CTLFLAG_RW, SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, rfc3390, CTLFLAG_RW,
&VNET_NAME(tcp_do_rfc3390), 0, &VNET_NAME(tcp_do_rfc3390), 0,
"Enable RFC 3390 (Increasing TCP's Initial Congestion Window)"); "Enable RFC 3390 (Increasing TCP's Initial Congestion Window)");
VNET_DEFINE(int, tcp_do_rfc3465) = 1; VNET_DEFINE(int, tcp_do_rfc3465) = 1;
#define V_tcp_do_rfc3465 VNET(tcp_do_rfc3465)
SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, rfc3465, CTLFLAG_RW, SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, rfc3465, CTLFLAG_RW,
&VNET_NAME(tcp_do_rfc3465), 0, &VNET_NAME(tcp_do_rfc3465), 0,
"Enable RFC 3465 (Appropriate Byte Counting)"); "Enable RFC 3465 (Appropriate Byte Counting)");
VNET_DEFINE(int, tcp_abc_l_var) = 2; VNET_DEFINE(int, tcp_abc_l_var) = 2;
#define V_tcp_abc_l_var VNET(tcp_abc_l_var)
SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, abc_l_var, CTLFLAG_RW, SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, abc_l_var, CTLFLAG_RW,
&VNET_NAME(tcp_abc_l_var), 2, &VNET_NAME(tcp_abc_l_var), 2,
"Cap the max cwnd increment during slow-start to this number of segments"); "Cap the max cwnd increment during slow-start to this number of segments");
@ -203,8 +214,10 @@ static void tcp_pulloutofband(struct socket *,
struct tcphdr *, struct mbuf *, int); struct tcphdr *, struct mbuf *, int);
static void tcp_xmit_timer(struct tcpcb *, int); static void tcp_xmit_timer(struct tcpcb *, int);
static void tcp_newreno_partial_ack(struct tcpcb *, struct tcphdr *); static void tcp_newreno_partial_ack(struct tcpcb *, struct tcphdr *);
static void inline static void inline cc_ack_received(struct tcpcb *tp, struct tcphdr *th,
tcp_congestion_exp(struct tcpcb *); uint16_t type);
static void inline cc_conn_init(struct tcpcb *tp);
static void inline cc_post_recovery(struct tcpcb *tp, struct tcphdr *th);
/* /*
* Kernel module interface for updating tcpstat. The argument is an index * Kernel module interface for updating tcpstat. The argument is an index
@ -220,20 +233,188 @@ kmod_tcpstat_inc(int statnum)
(*((u_long *)&V_tcpstat + statnum))++; (*((u_long *)&V_tcpstat + statnum))++;
} }
/*
* CC wrapper hook functions
*/
static void inline static void inline
tcp_congestion_exp(struct tcpcb *tp) cc_ack_received(struct tcpcb *tp, struct tcphdr *th, uint16_t type)
{ {
u_int win; INP_WLOCK_ASSERT(tp->t_inpcb);
win = min(tp->snd_wnd, tp->snd_cwnd) / tp->ccv->bytes_this_ack = BYTES_THIS_ACK(tp, th);
2 / tp->t_maxseg; if (tp->snd_cwnd == min(tp->snd_cwnd, tp->snd_wnd))
if (win < 2) tp->ccv->flags |= CCF_CWND_LIMITED;
win = 2; else
tp->snd_ssthresh = win * tp->t_maxseg; tp->ccv->flags &= ~CCF_CWND_LIMITED;
ENTER_FASTRECOVERY(tp);
tp->snd_recover = tp->snd_max; if (type == CC_ACK) {
if (tp->t_flags & TF_ECN_PERMIT) if (tp->snd_cwnd > tp->snd_ssthresh) {
tp->t_flags |= TF_ECN_SND_CWR; tp->t_bytes_acked += min(tp->ccv->bytes_this_ack,
V_tcp_abc_l_var * tp->t_maxseg);
if (tp->t_bytes_acked >= tp->snd_cwnd) {
tp->t_bytes_acked -= tp->snd_cwnd;
tp->ccv->flags |= CCF_ABC_SENTAWND;
}
} else {
tp->ccv->flags &= ~CCF_ABC_SENTAWND;
tp->t_bytes_acked = 0;
}
}
if (CC_ALGO(tp)->ack_received != NULL) {
/* XXXLAS: Find a way to live without this */
tp->ccv->curack = th->th_ack;
CC_ALGO(tp)->ack_received(tp->ccv, type);
}
}
static void inline
cc_conn_init(struct tcpcb *tp)
{
struct hc_metrics_lite metrics;
struct inpcb *inp = tp->t_inpcb;
int rtt;
#ifdef INET6
int isipv6 = ((inp->inp_vflag & INP_IPV6) != 0) ? 1 : 0;
#endif
INP_WLOCK_ASSERT(tp->t_inpcb);
tcp_hc_get(&inp->inp_inc, &metrics);
if (tp->t_srtt == 0 && (rtt = metrics.rmx_rtt)) {
tp->t_srtt = rtt;
tp->t_rttbest = tp->t_srtt + TCP_RTT_SCALE;
TCPSTAT_INC(tcps_usedrtt);
if (metrics.rmx_rttvar) {
tp->t_rttvar = metrics.rmx_rttvar;
TCPSTAT_INC(tcps_usedrttvar);
} else {
/* default variation is +- 1 rtt */
tp->t_rttvar =
tp->t_srtt * TCP_RTTVAR_SCALE / TCP_RTT_SCALE;
}
TCPT_RANGESET(tp->t_rxtcur,
((tp->t_srtt >> 2) + tp->t_rttvar) >> 1,
tp->t_rttmin, TCPTV_REXMTMAX);
}
if (metrics.rmx_ssthresh) {
/*
* There's some sort of gateway or interface
* buffer limit on the path. Use this to set
* the slow start threshhold, but set the
* threshold to no less than 2*mss.
*/
tp->snd_ssthresh = max(2 * tp->t_maxseg, metrics.rmx_ssthresh);
TCPSTAT_INC(tcps_usedssthresh);
}
/*
* Set the slow-start flight size depending on whether this
* is a local network or not.
*
* Extend this so we cache the cwnd too and retrieve it here.
* Make cwnd even bigger than RFC3390 suggests but only if we
* have previous experience with the remote host. Be careful
* not make cwnd bigger than remote receive window or our own
* send socket buffer. Maybe put some additional upper bound
* on the retrieved cwnd. Should do incremental updates to
* hostcache when cwnd collapses so next connection doesn't
* overloads the path again.
*
* XXXAO: Initializing the CWND from the hostcache is broken
* and in its current form not RFC conformant. It is disabled
* until fixed or removed entirely.
*
* RFC3390 says only do this if SYN or SYN/ACK didn't got lost.
* We currently check only in syncache_socket for that.
*/
/* #define TCP_METRICS_CWND */
#ifdef TCP_METRICS_CWND
if (metrics.rmx_cwnd)
tp->snd_cwnd = max(tp->t_maxseg, min(metrics.rmx_cwnd / 2,
min(tp->snd_wnd, so->so_snd.sb_hiwat)));
else
#endif
if (V_tcp_do_rfc3390)
tp->snd_cwnd = min(4 * tp->t_maxseg,
max(2 * tp->t_maxseg, 4380));
#ifdef INET6
else if ((isipv6 && in6_localaddr(&inp->in6p_faddr)) ||
(!isipv6 && in_localaddr(inp->inp_faddr)))
#else
else if (in_localaddr(inp->inp_faddr))
#endif
tp->snd_cwnd = tp->t_maxseg * V_ss_fltsz_local;
else
tp->snd_cwnd = tp->t_maxseg * V_ss_fltsz;
if (CC_ALGO(tp)->conn_init != NULL)
CC_ALGO(tp)->conn_init(tp->ccv);
}
void inline
cc_cong_signal(struct tcpcb *tp, struct tcphdr *th, uint32_t type)
{
INP_WLOCK_ASSERT(tp->t_inpcb);
switch(type) {
case CC_NDUPACK:
if (!IN_FASTRECOVERY(tp->t_flags)) {
tp->snd_recover = tp->snd_max;
if (tp->t_flags & TF_ECN_PERMIT)
tp->t_flags |= TF_ECN_SND_CWR;
}
break;
case CC_ECN:
if (!IN_CONGRECOVERY(tp->t_flags)) {
TCPSTAT_INC(tcps_ecn_rcwnd);
tp->snd_recover = tp->snd_max;
if (tp->t_flags & TF_ECN_PERMIT)
tp->t_flags |= TF_ECN_SND_CWR;
}
break;
case CC_RTO:
tp->t_dupacks = 0;
tp->t_bytes_acked = 0;
EXIT_RECOVERY(tp->t_flags);
tp->snd_cwnd = tp->t_maxseg;
break;
case CC_RTO_ERR:
TCPSTAT_INC(tcps_sndrexmitbad);
/* RTO was unnecessary, so reset everything. */
tp->snd_cwnd = tp->snd_cwnd_prev;
tp->snd_ssthresh = tp->snd_ssthresh_prev;
tp->snd_recover = tp->snd_recover_prev;
if (tp->t_flags & TF_WASFRECOVERY)
ENTER_FASTRECOVERY(tp->t_flags);
if (tp->t_flags & TF_WASCRECOVERY)
ENTER_CONGRECOVERY(tp->t_flags);
tp->snd_nxt = tp->snd_max;
tp->t_badrxtwin = 0;
break;
}
if (CC_ALGO(tp)->cong_signal != NULL) {
if (th != NULL)
tp->ccv->curack = th->th_ack;
CC_ALGO(tp)->cong_signal(tp->ccv, type);
}
}
static void inline
cc_post_recovery(struct tcpcb *tp, struct tcphdr *th)
{
INP_WLOCK_ASSERT(tp->t_inpcb);
/* XXXLAS: KASSERT that we're in recovery? */
if (CC_ALGO(tp)->post_recovery != NULL) {
tp->ccv->curack = th->th_ack;
CC_ALGO(tp)->post_recovery(tp->ccv);
}
/* XXXLAS: EXIT_RECOVERY ? */
tp->t_bytes_acked = 0;
} }
/* Neighbor Discovery, Neighbor Unreachability Detection Upper layer hint. */ /* Neighbor Discovery, Neighbor Unreachability Detection Upper layer hint. */
@ -1157,14 +1338,9 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
TCPSTAT_INC(tcps_ecn_ect1); TCPSTAT_INC(tcps_ecn_ect1);
break; break;
} }
/* /* Congestion experienced. */
* Congestion experienced. if (thflags & TH_ECE) {
* Ignore if we are already trying to recover. cc_cong_signal(tp, th, CC_ECN);
*/
if ((thflags & TH_ECE) &&
SEQ_LEQ(th->th_ack, tp->snd_recover)) {
TCPSTAT_INC(tcps_ecn_rcwnd);
tcp_congestion_exp(tp);
} }
} }
@ -1259,15 +1435,9 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
if (tlen == 0) { if (tlen == 0) {
if (SEQ_GT(th->th_ack, tp->snd_una) && if (SEQ_GT(th->th_ack, tp->snd_una) &&
SEQ_LEQ(th->th_ack, tp->snd_max) && SEQ_LEQ(th->th_ack, tp->snd_max) &&
tp->snd_cwnd >= tp->snd_wnd && !IN_RECOVERY(tp->t_flags) &&
((!V_tcp_do_newreno && (to.to_flags & TOF_SACK) == 0 &&
!(tp->t_flags & TF_SACK_PERMIT) && TAILQ_EMPTY(&tp->snd_holes)) {
tp->t_dupacks < tcprexmtthresh) ||
((V_tcp_do_newreno ||
(tp->t_flags & TF_SACK_PERMIT)) &&
!IN_FASTRECOVERY(tp) &&
(to.to_flags & TOF_SACK) == 0 &&
TAILQ_EMPTY(&tp->snd_holes)))) {
/* /*
* This is a pure ack for outstanding data. * This is a pure ack for outstanding data.
*/ */
@ -1287,15 +1457,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
*/ */
if (tp->t_rxtshift == 1 && if (tp->t_rxtshift == 1 &&
(int)(ticks - tp->t_badrxtwin) < 0) { (int)(ticks - tp->t_badrxtwin) < 0) {
TCPSTAT_INC(tcps_sndrexmitbad); cc_cong_signal(tp, th, CC_RTO_ERR);
tp->snd_cwnd = tp->snd_cwnd_prev;
tp->snd_ssthresh =
tp->snd_ssthresh_prev;
tp->snd_recover = tp->snd_recover_prev;
if (tp->t_flags & TF_WASFRECOVERY)
ENTER_FASTRECOVERY(tp);
tp->snd_nxt = tp->snd_max;
tp->t_badrxtwin = 0;
} }
/* /*
@ -1321,13 +1483,22 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
tcp_xmit_timer(tp, tcp_xmit_timer(tp,
ticks - tp->t_rtttime); ticks - tp->t_rtttime);
} }
acked = th->th_ack - tp->snd_una; acked = BYTES_THIS_ACK(tp, th);
TCPSTAT_INC(tcps_rcvackpack); TCPSTAT_INC(tcps_rcvackpack);
TCPSTAT_ADD(tcps_rcvackbyte, acked); TCPSTAT_ADD(tcps_rcvackbyte, acked);
sbdrop(&so->so_snd, acked); sbdrop(&so->so_snd, acked);
if (SEQ_GT(tp->snd_una, tp->snd_recover) && if (SEQ_GT(tp->snd_una, tp->snd_recover) &&
SEQ_LEQ(th->th_ack, tp->snd_recover)) SEQ_LEQ(th->th_ack, tp->snd_recover))
tp->snd_recover = th->th_ack - 1; tp->snd_recover = th->th_ack - 1;
/*
* Let the congestion control algorithm update
* congestion control related information. This
* typically means increasing the congestion
* window.
*/
cc_ack_received(tp, th, CC_ACK);
tp->snd_una = th->th_ack; tp->snd_una = th->th_ack;
/* /*
* Pull snd_wl2 up to prevent seq wrap relative * Pull snd_wl2 up to prevent seq wrap relative
@ -1587,6 +1758,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
thflags &= ~TH_SYN; thflags &= ~TH_SYN;
} else { } else {
tp->t_state = TCPS_ESTABLISHED; tp->t_state = TCPS_ESTABLISHED;
cc_conn_init(tp);
tcp_timer_activate(tp, TT_KEEP, tcp_keepidle); tcp_timer_activate(tp, TT_KEEP, tcp_keepidle);
} }
} else { } else {
@ -1990,6 +2162,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
tp->t_flags &= ~TF_NEEDFIN; tp->t_flags &= ~TF_NEEDFIN;
} else { } else {
tp->t_state = TCPS_ESTABLISHED; tp->t_state = TCPS_ESTABLISHED;
cc_conn_init(tp);
tcp_timer_activate(tp, TT_KEEP, tcp_keepidle); tcp_timer_activate(tp, TT_KEEP, tcp_keepidle);
} }
/* /*
@ -2058,11 +2231,10 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
th->th_ack != tp->snd_una) th->th_ack != tp->snd_una)
tp->t_dupacks = 0; tp->t_dupacks = 0;
else if (++tp->t_dupacks > tcprexmtthresh || else if (++tp->t_dupacks > tcprexmtthresh ||
((V_tcp_do_newreno || IN_FASTRECOVERY(tp->t_flags)) {
(tp->t_flags & TF_SACK_PERMIT)) && cc_ack_received(tp, th, CC_DUPACK);
IN_FASTRECOVERY(tp))) {
if ((tp->t_flags & TF_SACK_PERMIT) && if ((tp->t_flags & TF_SACK_PERMIT) &&
IN_FASTRECOVERY(tp)) { IN_FASTRECOVERY(tp->t_flags)) {
int awnd; int awnd;
/* /*
@ -2093,19 +2265,20 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
* recovery. * recovery.
*/ */
if (tp->t_flags & TF_SACK_PERMIT) { if (tp->t_flags & TF_SACK_PERMIT) {
if (IN_FASTRECOVERY(tp)) { if (IN_FASTRECOVERY(tp->t_flags)) {
tp->t_dupacks = 0; tp->t_dupacks = 0;
break; break;
} }
} else if (V_tcp_do_newreno || } else {
V_tcp_do_ecn) {
if (SEQ_LEQ(th->th_ack, if (SEQ_LEQ(th->th_ack,
tp->snd_recover)) { tp->snd_recover)) {
tp->t_dupacks = 0; tp->t_dupacks = 0;
break; break;
} }
} }
tcp_congestion_exp(tp); /* Congestion signal before ack. */
cc_cong_signal(tp, th, CC_NDUPACK);
cc_ack_received(tp, th, CC_DUPACK);
tcp_timer_activate(tp, TT_REXMT, 0); tcp_timer_activate(tp, TT_REXMT, 0);
tp->t_rtttime = 0; tp->t_rtttime = 0;
if (tp->t_flags & TF_SACK_PERMIT) { if (tp->t_flags & TF_SACK_PERMIT) {
@ -2129,6 +2302,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
tp->snd_nxt = onxt; tp->snd_nxt = onxt;
goto drop; goto drop;
} else if (V_tcp_do_rfc3042) { } else if (V_tcp_do_rfc3042) {
cc_ack_received(tp, th, CC_DUPACK);
u_long oldcwnd = tp->snd_cwnd; u_long oldcwnd = tp->snd_cwnd;
tcp_seq oldsndmax = tp->snd_max; tcp_seq oldsndmax = tp->snd_max;
u_int sent; u_int sent;
@ -2170,37 +2344,14 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
* If the congestion window was inflated to account * If the congestion window was inflated to account
* for the other side's cached packets, retract it. * for the other side's cached packets, retract it.
*/ */
if (V_tcp_do_newreno || (tp->t_flags & TF_SACK_PERMIT)) { if (IN_FASTRECOVERY(tp->t_flags)) {
if (IN_FASTRECOVERY(tp)) { if (SEQ_LT(th->th_ack, tp->snd_recover)) {
if (SEQ_LT(th->th_ack, tp->snd_recover)) { if (tp->t_flags & TF_SACK_PERMIT)
if (tp->t_flags & TF_SACK_PERMIT) tcp_sack_partialack(tp, th);
tcp_sack_partialack(tp, th); else
else tcp_newreno_partial_ack(tp, th);
tcp_newreno_partial_ack(tp, th); } else
} else { cc_post_recovery(tp, th);
/*
* Out of fast recovery.
* Window inflation should have left us
* with approximately snd_ssthresh
* outstanding data.
* But in case we would be inclined to
* send a burst, better to do it via
* the slow start mechanism.
*/
if (SEQ_GT(th->th_ack +
tp->snd_ssthresh,
tp->snd_max))
tp->snd_cwnd = tp->snd_max -
th->th_ack +
tp->t_maxseg;
else
tp->snd_cwnd = tp->snd_ssthresh;
}
}
} else {
if (tp->t_dupacks >= tcprexmtthresh &&
tp->snd_cwnd > tp->snd_ssthresh)
tp->snd_cwnd = tp->snd_ssthresh;
} }
tp->t_dupacks = 0; tp->t_dupacks = 0;
/* /*
@ -2231,7 +2382,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
("tcp_input: process_ACK ti_locked %d", ti_locked)); ("tcp_input: process_ACK ti_locked %d", ti_locked));
INP_WLOCK_ASSERT(tp->t_inpcb); INP_WLOCK_ASSERT(tp->t_inpcb);
acked = th->th_ack - tp->snd_una; acked = BYTES_THIS_ACK(tp, th);
TCPSTAT_INC(tcps_rcvackpack); TCPSTAT_INC(tcps_rcvackpack);
TCPSTAT_ADD(tcps_rcvackbyte, acked); TCPSTAT_ADD(tcps_rcvackbyte, acked);
@ -2242,16 +2393,8 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
* original cwnd and ssthresh, and proceed to transmit where * original cwnd and ssthresh, and proceed to transmit where
* we left off. * we left off.
*/ */
if (tp->t_rxtshift == 1 && (int)(ticks - tp->t_badrxtwin) < 0) { if (tp->t_rxtshift == 1 && (int)(ticks - tp->t_badrxtwin) < 0)
TCPSTAT_INC(tcps_sndrexmitbad); cc_cong_signal(tp, th, CC_RTO_ERR);
tp->snd_cwnd = tp->snd_cwnd_prev;
tp->snd_ssthresh = tp->snd_ssthresh_prev;
tp->snd_recover = tp->snd_recover_prev;
if (tp->t_flags & TF_WASFRECOVERY)
ENTER_FASTRECOVERY(tp);
tp->snd_nxt = tp->snd_max;
tp->t_badrxtwin = 0; /* XXX probably not required */
}
/* /*
* If we have a timestamp reply, update smoothed * If we have a timestamp reply, update smoothed
@ -2298,61 +2441,12 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
goto step6; goto step6;
/* /*
* When new data is acked, open the congestion window. * Let the congestion control algorithm update congestion
* Method depends on which congestion control state we're * control related information. This typically means increasing
* in (slow start or cong avoid) and if ABC (RFC 3465) is * the congestion window.
* enabled.
*
* slow start: cwnd <= ssthresh
* cong avoid: cwnd > ssthresh
*
* slow start and ABC (RFC 3465):
* Grow cwnd exponentially by the amount of data
* ACKed capping the max increment per ACK to
* (abc_l_var * maxseg) bytes.
*
* slow start without ABC (RFC 2581):
* Grow cwnd exponentially by maxseg per ACK.
*
* cong avoid and ABC (RFC 3465):
* Grow cwnd linearly by maxseg per RTT for each
* cwnd worth of ACKed data.
*
* cong avoid without ABC (RFC 2581):
* Grow cwnd linearly by approximately maxseg per RTT using
* maxseg^2 / cwnd per ACK as the increment.
* If cwnd > maxseg^2, fix the cwnd increment at 1 byte to
* avoid capping cwnd.
*/ */
if ((!V_tcp_do_newreno && !(tp->t_flags & TF_SACK_PERMIT)) || cc_ack_received(tp, th, CC_ACK);
!IN_FASTRECOVERY(tp)) {
u_int cw = tp->snd_cwnd;
u_int incr = tp->t_maxseg;
/* In congestion avoidance? */
if (cw > tp->snd_ssthresh) {
if (V_tcp_do_rfc3465) {
tp->t_bytes_acked += acked;
if (tp->t_bytes_acked >= tp->snd_cwnd)
tp->t_bytes_acked -= cw;
else
incr = 0;
}
else
incr = max((incr * incr / cw), 1);
/*
* In slow-start with ABC enabled and no RTO in sight?
* (Must not use abc_l_var > 1 if slow starting after an
* RTO. On RTO, snd_nxt = snd_una, so the snd_nxt ==
* snd_max check is sufficient to handle this).
*/
} else if (V_tcp_do_rfc3465 &&
tp->snd_nxt == tp->snd_max)
incr = min(acked,
V_tcp_abc_l_var * tp->t_maxseg);
/* ABC is on by default, so (incr == 0) frequently. */
if (incr > 0)
tp->snd_cwnd = min(cw+incr, TCP_MAXWIN<<tp->snd_scale);
}
SOCKBUF_LOCK(&so->so_snd); SOCKBUF_LOCK(&so->so_snd);
if (acked > so->so_snd.sb_cc) { if (acked > so->so_snd.sb_cc) {
tp->snd_wnd -= so->so_snd.sb_cc; tp->snd_wnd -= so->so_snd.sb_cc;
@ -2366,16 +2460,14 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
/* NB: sowwakeup_locked() does an implicit unlock. */ /* NB: sowwakeup_locked() does an implicit unlock. */
sowwakeup_locked(so); sowwakeup_locked(so);
/* Detect una wraparound. */ /* Detect una wraparound. */
if ((V_tcp_do_newreno || (tp->t_flags & TF_SACK_PERMIT)) && if (!IN_RECOVERY(tp->t_flags) &&
!IN_FASTRECOVERY(tp) &&
SEQ_GT(tp->snd_una, tp->snd_recover) && SEQ_GT(tp->snd_una, tp->snd_recover) &&
SEQ_LEQ(th->th_ack, tp->snd_recover)) SEQ_LEQ(th->th_ack, tp->snd_recover))
tp->snd_recover = th->th_ack - 1; tp->snd_recover = th->th_ack - 1;
if ((V_tcp_do_newreno || (tp->t_flags & TF_SACK_PERMIT)) && /* XXXLAS: Can this be moved up into cc_post_recovery? */
IN_FASTRECOVERY(tp) && if (IN_RECOVERY(tp->t_flags) &&
SEQ_GEQ(th->th_ack, tp->snd_recover)) { SEQ_GEQ(th->th_ack, tp->snd_recover)) {
EXIT_FASTRECOVERY(tp); EXIT_RECOVERY(tp->t_flags);
tp->t_bytes_acked = 0;
} }
tp->snd_una = th->th_ack; tp->snd_una = th->th_ack;
if (tp->t_flags & TF_SACK_PERMIT) { if (tp->t_flags & TF_SACK_PERMIT) {
@ -3240,24 +3332,19 @@ tcp_mss_update(struct tcpcb *tp, int offer,
void void
tcp_mss(struct tcpcb *tp, int offer) tcp_mss(struct tcpcb *tp, int offer)
{ {
int rtt, mss; int mss;
u_long bufsize; u_long bufsize;
struct inpcb *inp; struct inpcb *inp;
struct socket *so; struct socket *so;
struct hc_metrics_lite metrics; struct hc_metrics_lite metrics;
int mtuflags = 0; int mtuflags = 0;
#ifdef INET6
int isipv6;
#endif
KASSERT(tp != NULL, ("%s: tp == NULL", __func__)); KASSERT(tp != NULL, ("%s: tp == NULL", __func__));
tcp_mss_update(tp, offer, &metrics, &mtuflags); tcp_mss_update(tp, offer, &metrics, &mtuflags);
mss = tp->t_maxseg; mss = tp->t_maxseg;
inp = tp->t_inpcb; inp = tp->t_inpcb;
#ifdef INET6
isipv6 = ((inp->inp_vflag & INP_IPV6) != 0) ? 1 : 0;
#endif
/* /*
* If there's a pipesize, change the socket buffer to that size, * If there's a pipesize, change the socket buffer to that size,
@ -3297,71 +3384,6 @@ tcp_mss(struct tcpcb *tp, int offer)
(void)sbreserve_locked(&so->so_rcv, bufsize, so, NULL); (void)sbreserve_locked(&so->so_rcv, bufsize, so, NULL);
} }
SOCKBUF_UNLOCK(&so->so_rcv); SOCKBUF_UNLOCK(&so->so_rcv);
/*
* While we're here, check the others too.
*/
if (tp->t_srtt == 0 && (rtt = metrics.rmx_rtt)) {
tp->t_srtt = rtt;
tp->t_rttbest = tp->t_srtt + TCP_RTT_SCALE;
TCPSTAT_INC(tcps_usedrtt);
if (metrics.rmx_rttvar) {
tp->t_rttvar = metrics.rmx_rttvar;
TCPSTAT_INC(tcps_usedrttvar);
} else {
/* default variation is +- 1 rtt */
tp->t_rttvar =
tp->t_srtt * TCP_RTTVAR_SCALE / TCP_RTT_SCALE;
}
TCPT_RANGESET(tp->t_rxtcur,
((tp->t_srtt >> 2) + tp->t_rttvar) >> 1,
tp->t_rttmin, TCPTV_REXMTMAX);
}
if (metrics.rmx_ssthresh) {
/*
* There's some sort of gateway or interface
* buffer limit on the path. Use this to set
* the slow start threshhold, but set the
* threshold to no less than 2*mss.
*/
tp->snd_ssthresh = max(2 * mss, metrics.rmx_ssthresh);
TCPSTAT_INC(tcps_usedssthresh);
}
/*
* Set the slow-start flight size depending on whether this
* is a local network or not.
*
* Extend this so we cache the cwnd too and retrieve it here.
* Make cwnd even bigger than RFC3390 suggests but only if we
* have previous experience with the remote host. Be careful
* not make cwnd bigger than remote receive window or our own
* send socket buffer. Maybe put some additional upper bound
* on the retrieved cwnd. Should do incremental updates to
* hostcache when cwnd collapses so next connection doesn't
* overloads the path again.
*
* RFC3390 says only do this if SYN or SYN/ACK didn't got lost.
* We currently check only in syncache_socket for that.
*/
#define TCP_METRICS_CWND
#ifdef TCP_METRICS_CWND
if (metrics.rmx_cwnd)
tp->snd_cwnd = max(mss,
min(metrics.rmx_cwnd / 2,
min(tp->snd_wnd, so->so_snd.sb_hiwat)));
else
#endif
if (V_tcp_do_rfc3390)
tp->snd_cwnd = min(4 * mss, max(2 * mss, 4380));
#ifdef INET6
else if ((isipv6 && in6_localaddr(&inp->in6p_faddr)) ||
(!isipv6 && in_localaddr(inp->inp_faddr)))
#else
else if (in_localaddr(inp->inp_faddr))
#endif
tp->snd_cwnd = mss * V_ss_fltsz_local;
else
tp->snd_cwnd = mss * V_ss_fltsz;
/* Check the interface for TSO capabilities. */ /* Check the interface for TSO capabilities. */
if (mtuflags & CSUM_TSO) if (mtuflags & CSUM_TSO)
@ -3425,7 +3447,7 @@ tcp_newreno_partial_ack(struct tcpcb *tp, struct tcphdr *th)
* Set snd_cwnd to one segment beyond acknowledged offset. * Set snd_cwnd to one segment beyond acknowledged offset.
* (tp->snd_una has not yet been updated when this function is called.) * (tp->snd_una has not yet been updated when this function is called.)
*/ */
tp->snd_cwnd = tp->t_maxseg + (th->th_ack - tp->snd_una); tp->snd_cwnd = tp->t_maxseg + BYTES_THIS_ACK(tp, th);
tp->t_flags |= TF_ACKNOW; tp->t_flags |= TF_ACKNOW;
(void) tcp_output(tp); (void) tcp_output(tp);
tp->snd_cwnd = ocwnd; tp->snd_cwnd = ocwnd;
@ -3435,8 +3457,8 @@ tcp_newreno_partial_ack(struct tcpcb *tp, struct tcphdr *th)
* Partial window deflation. Relies on fact that tp->snd_una * Partial window deflation. Relies on fact that tp->snd_una
* not updated yet. * not updated yet.
*/ */
if (tp->snd_cwnd > th->th_ack - tp->snd_una) if (tp->snd_cwnd > BYTES_THIS_ACK(tp, th))
tp->snd_cwnd -= th->th_ack - tp->snd_una; tp->snd_cwnd -= BYTES_THIS_ACK(tp, th);
else else
tp->snd_cwnd = 0; tp->snd_cwnd = 0;
tp->snd_cwnd += tp->t_maxseg; tp->snd_cwnd += tp->t_maxseg;

View File

@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$");
#include <net/route.h> #include <net/route.h>
#include <net/vnet.h> #include <net/vnet.h>
#include <netinet/cc.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <netinet/in_systm.h> #include <netinet/in_systm.h>
#include <netinet/ip.h> #include <netinet/ip.h>
@ -64,7 +65,6 @@ __FBSDID("$FreeBSD$");
#include <netinet/ip6.h> #include <netinet/ip6.h>
#include <netinet6/ip6_var.h> #include <netinet6/ip6_var.h>
#endif #endif
#include <netinet/tcp.h>
#define TCPOUTFLAGS #define TCPOUTFLAGS
#include <netinet/tcp_fsm.h> #include <netinet/tcp_fsm.h>
#include <netinet/tcp_seq.h> #include <netinet/tcp_seq.h>
@ -102,11 +102,6 @@ SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, local_slowstart_flightsize,
CTLFLAG_RW, &VNET_NAME(ss_fltsz_local), 1, CTLFLAG_RW, &VNET_NAME(ss_fltsz_local), 1,
"Slow start flight size for local networks"); "Slow start flight size for local networks");
VNET_DEFINE(int, tcp_do_newreno) = 1;
SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, newreno, CTLFLAG_RW,
&VNET_NAME(tcp_do_newreno), 0,
"Enable NewReno Algorithms");
VNET_DEFINE(int, tcp_do_tso) = 1; VNET_DEFINE(int, tcp_do_tso) = 1;
#define V_tcp_do_tso VNET(tcp_do_tso) #define V_tcp_do_tso VNET(tcp_do_tso)
SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, tso, CTLFLAG_RW, SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, tso, CTLFLAG_RW,
@ -131,6 +126,19 @@ SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, sendbuf_max, CTLFLAG_RW,
&VNET_NAME(tcp_autosndbuf_max), 0, &VNET_NAME(tcp_autosndbuf_max), 0,
"Max size of automatic send buffer"); "Max size of automatic send buffer");
static void inline cc_after_idle(struct tcpcb *tp);
/*
* CC wrapper hook functions
*/
static void inline
cc_after_idle(struct tcpcb *tp)
{
INP_WLOCK_ASSERT(tp->t_inpcb);
if (CC_ALGO(tp)->after_idle != NULL)
CC_ALGO(tp)->after_idle(tp->ccv);
}
/* /*
* Tcp output routine: figure out what should be sent and send it. * Tcp output routine: figure out what should be sent and send it.
@ -241,7 +249,7 @@ tcp_output(struct tcpcb *tp)
sack_bytes_rxmt = 0; sack_bytes_rxmt = 0;
len = 0; len = 0;
p = NULL; p = NULL;
if ((tp->t_flags & TF_SACK_PERMIT) && IN_FASTRECOVERY(tp) && if ((tp->t_flags & TF_SACK_PERMIT) && IN_FASTRECOVERY(tp->t_flags) &&
(p = tcp_sack_output(tp, &sack_bytes_rxmt))) { (p = tcp_sack_output(tp, &sack_bytes_rxmt))) {
long cwin; long cwin;
@ -1315,7 +1323,7 @@ tcp_output(struct tcpcb *tp)
* on the transmitter effectively destroys the TCP window, forcing * on the transmitter effectively destroys the TCP window, forcing
* it to four packets (1.5Kx4 = 6K window). * it to four packets (1.5Kx4 = 6K window).
*/ */
if (sendalot && (!V_tcp_do_newreno || --maxburst)) if (sendalot && --maxburst)
goto again; goto again;
#endif #endif
if (sendalot) if (sendalot)

View File

@ -576,7 +576,7 @@ tcp_sack_partialack(struct tcpcb *tp, struct tcphdr *th)
tcp_timer_activate(tp, TT_REXMT, 0); tcp_timer_activate(tp, TT_REXMT, 0);
tp->t_rtttime = 0; tp->t_rtttime = 0;
/* Send one or 2 segments based on how much new data was acked. */ /* Send one or 2 segments based on how much new data was acked. */
if (((th->th_ack - tp->snd_una) / tp->t_maxseg) > 2) if ((BYTES_THIS_ACK(tp, th) / tp->t_maxseg) > 2)
num_segs = 2; num_segs = 2;
tp->snd_cwnd = (tp->sackhint.sack_bytes_rexmit + tp->snd_cwnd = (tp->sackhint.sack_bytes_rexmit +
(tp->snd_nxt - tp->sack_newdata) + num_segs * tp->t_maxseg); (tp->snd_nxt - tp->sack_newdata) + num_segs * tp->t_maxseg);

View File

@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$");
#include <net/if.h> #include <net/if.h>
#include <net/vnet.h> #include <net/vnet.h>
#include <netinet/cc.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <netinet/in_systm.h> #include <netinet/in_systm.h>
#include <netinet/ip.h> #include <netinet/ip.h>
@ -80,7 +81,6 @@ __FBSDID("$FreeBSD$");
#include <netinet6/nd6.h> #include <netinet6/nd6.h>
#endif #endif
#include <netinet/ip_icmp.h> #include <netinet/ip_icmp.h>
#include <netinet/tcp.h>
#include <netinet/tcp_fsm.h> #include <netinet/tcp_fsm.h>
#include <netinet/tcp_seq.h> #include <netinet/tcp_seq.h>
#include <netinet/tcp_timer.h> #include <netinet/tcp_timer.h>
@ -238,6 +238,7 @@ static char * tcp_log_addr(struct in_conninfo *inc, struct tcphdr *th,
struct tcpcb_mem { struct tcpcb_mem {
struct tcpcb tcb; struct tcpcb tcb;
struct tcp_timer tt; struct tcp_timer tt;
struct cc_var ccv;
}; };
static VNET_DEFINE(uma_zone_t, tcpcb_zone); static VNET_DEFINE(uma_zone_t, tcpcb_zone);
@ -277,6 +278,8 @@ tcp_init(void)
{ {
int hashsize; int hashsize;
cc_init();
hashsize = TCBHASHSIZE; hashsize = TCBHASHSIZE;
TUNABLE_INT_FETCH("net.inet.tcp.tcbhashsize", &hashsize); TUNABLE_INT_FETCH("net.inet.tcp.tcbhashsize", &hashsize);
if (!powerof2(hashsize)) { if (!powerof2(hashsize)) {
@ -640,6 +643,26 @@ tcp_newtcpcb(struct inpcb *inp)
if (tm == NULL) if (tm == NULL)
return (NULL); return (NULL);
tp = &tm->tcb; tp = &tm->tcb;
/* Initialise cc_var struct for this tcpcb. */
tp->ccv = &tm->ccv;
tp->ccv->type = IPPROTO_TCP;
tp->ccv->ccvc.tcp = tp;
/*
* Use the current system default CC algorithm.
*/
CC_LIST_RLOCK();
KASSERT(!STAILQ_EMPTY(&cc_list), ("cc_list is empty!"));
CC_ALGO(tp) = CC_DEFAULT();
CC_LIST_RUNLOCK();
if (CC_ALGO(tp)->cb_init != NULL)
if (CC_ALGO(tp)->cb_init(tp->ccv) > 0) {
uma_zfree(V_tcpcb_zone, tm);
return (NULL);
}
#ifdef VIMAGE #ifdef VIMAGE
tp->t_vnet = inp->inp_vnet; tp->t_vnet = inp->inp_vnet;
#endif #endif
@ -805,6 +828,12 @@ tcp_discardcb(struct tcpcb *tp)
tcp_offload_detach(tp); tcp_offload_detach(tp);
tcp_free_sackholes(tp); tcp_free_sackholes(tp);
/* Allow the CC algorithm to clean up after itself. */
if (CC_ALGO(tp)->cb_destroy != NULL)
CC_ALGO(tp)->cb_destroy(tp->ccv);
CC_ALGO(tp) = NULL;
inp->inp_ppcb = NULL; inp->inp_ppcb = NULL;
tp->t_inpcb = NULL; tp->t_inpcb = NULL;
uma_zfree(V_tcpcb_zone, tp); uma_zfree(V_tcpcb_zone, tp);
@ -1572,7 +1601,7 @@ tcp_mtudisc(struct inpcb *inp, int errno)
tcp_free_sackholes(tp); tcp_free_sackholes(tp);
tp->snd_recover = tp->snd_max; tp->snd_recover = tp->snd_max;
if (tp->t_flags & TF_SACK_PERMIT) if (tp->t_flags & TF_SACK_PERMIT)
EXIT_FASTRECOVERY(tp); EXIT_FASTRECOVERY(tp->t_flags);
tcp_output_send(tp); tcp_output_send(tp);
return (inp); return (inp);
} }

View File

@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$");
#include <net/route.h> #include <net/route.h>
#include <net/vnet.h> #include <net/vnet.h>
#include <netinet/cc.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <netinet/in_pcb.h> #include <netinet/in_pcb.h>
#include <netinet/in_systm.h> #include <netinet/in_systm.h>
@ -58,7 +59,6 @@ __FBSDID("$FreeBSD$");
#include <netinet6/in6_pcb.h> #include <netinet6/in6_pcb.h>
#endif #endif
#include <netinet/ip_var.h> #include <netinet/ip_var.h>
#include <netinet/tcp.h>
#include <netinet/tcp_fsm.h> #include <netinet/tcp_fsm.h>
#include <netinet/tcp_timer.h> #include <netinet/tcp_timer.h>
#include <netinet/tcp_var.h> #include <netinet/tcp_var.h>
@ -515,10 +515,14 @@ tcp_timer_rexmt(void * xtp)
tp->snd_cwnd_prev = tp->snd_cwnd; tp->snd_cwnd_prev = tp->snd_cwnd;
tp->snd_ssthresh_prev = tp->snd_ssthresh; tp->snd_ssthresh_prev = tp->snd_ssthresh;
tp->snd_recover_prev = tp->snd_recover; tp->snd_recover_prev = tp->snd_recover;
if (IN_FASTRECOVERY(tp)) if (IN_FASTRECOVERY(tp->t_flags))
tp->t_flags |= TF_WASFRECOVERY; tp->t_flags |= TF_WASFRECOVERY;
else else
tp->t_flags &= ~TF_WASFRECOVERY; tp->t_flags &= ~TF_WASFRECOVERY;
if (IN_CONGRECOVERY(tp->t_flags))
tp->t_flags |= TF_WASCRECOVERY;
else
tp->t_flags &= ~TF_WASCRECOVERY;
tp->t_badrxtwin = ticks + (tp->t_srtt >> (TCP_RTT_SHIFT + 1)); tp->t_badrxtwin = ticks + (tp->t_srtt >> (TCP_RTT_SHIFT + 1));
} }
TCPSTAT_INC(tcps_rexmttimeo); TCPSTAT_INC(tcps_rexmttimeo);
@ -562,40 +566,9 @@ tcp_timer_rexmt(void * xtp)
* If timing a segment in this window, stop the timer. * If timing a segment in this window, stop the timer.
*/ */
tp->t_rtttime = 0; tp->t_rtttime = 0;
/*
* Close the congestion window down to one segment cc_cong_signal(tp, 0, CC_RTO);
* (we'll open it by one segment for each ack we get).
* Since we probably have a window's worth of unacked
* data accumulated, this "slow start" keeps us from
* dumping all that data as back-to-back packets (which
* might overwhelm an intermediate gateway).
*
* There are two phases to the opening: Initially we
* open by one mss on each ack. This makes the window
* size increase exponentially with time. If the
* window is larger than the path can handle, this
* exponential growth results in dropped packet(s)
* almost immediately. To get more time between
* drops but still "push" the network to take advantage
* of improving conditions, we switch from exponential
* to linear window opening at some threshhold size.
* For a threshhold, we use half the current window
* size, truncated to a multiple of the mss.
*
* (the minimum cwnd that will give us exponential
* growth is 2 mss. We don't allow the threshhold
* to go below this.)
*/
{
u_int win = min(tp->snd_wnd, tp->snd_cwnd) / 2 / tp->t_maxseg;
if (win < 2)
win = 2;
tp->snd_cwnd = tp->t_maxseg;
tp->snd_ssthresh = win * tp->t_maxseg;
tp->t_dupacks = 0;
}
EXIT_FASTRECOVERY(tp);
tp->t_bytes_acked = 0;
(void) tcp_output(tp); (void) tcp_output(tp);
out: out:

View File

@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$");
#include <net/route.h> #include <net/route.h>
#include <net/vnet.h> #include <net/vnet.h>
#include <netinet/cc.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <netinet/in_systm.h> #include <netinet/in_systm.h>
#ifdef INET6 #ifdef INET6
@ -77,7 +78,6 @@ __FBSDID("$FreeBSD$");
#include <netinet6/ip6_var.h> #include <netinet6/ip6_var.h>
#include <netinet6/scope6_var.h> #include <netinet6/scope6_var.h>
#endif #endif
#include <netinet/tcp.h>
#include <netinet/tcp_fsm.h> #include <netinet/tcp_fsm.h>
#include <netinet/tcp_seq.h> #include <netinet/tcp_seq.h>
#include <netinet/tcp_timer.h> #include <netinet/tcp_timer.h>
@ -1242,6 +1242,8 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
struct inpcb *inp; struct inpcb *inp;
struct tcpcb *tp; struct tcpcb *tp;
struct tcp_info ti; struct tcp_info ti;
char buf[TCP_CA_NAME_MAX];
struct cc_algo *algo;
error = 0; error = 0;
inp = sotoinpcb(so); inp = sotoinpcb(so);
@ -1351,6 +1353,54 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
error = EINVAL; error = EINVAL;
break; break;
case TCP_CONGESTION:
INP_WUNLOCK(inp);
bzero(buf, sizeof(buf));
error = sooptcopyin(sopt, &buf, sizeof(buf), 1);
if (error)
break;
INP_WLOCK_RECHECK(inp);
/*
* Return EINVAL if we can't find the requested cc algo.
*/
error = EINVAL;
CC_LIST_RLOCK();
STAILQ_FOREACH(algo, &cc_list, entries) {
if (strncmp(buf, algo->name, TCP_CA_NAME_MAX)
== 0) {
/* We've found the requested algo. */
error = 0;
/*
* We hold a write lock over the tcb
* so it's safe to do these things
* without ordering concerns.
*/
if (CC_ALGO(tp)->cb_destroy != NULL)
CC_ALGO(tp)->cb_destroy(tp->ccv);
CC_ALGO(tp) = algo;
/*
* If something goes pear shaped
* initialising the new algo,
* fall back to newreno (which
* does not require initialisation).
*/
if (algo->cb_init != NULL)
if (algo->cb_init(tp->ccv) > 0) {
CC_ALGO(tp) = &newreno_cc_algo;
/*
* The only reason init
* should fail is
* because of malloc.
*/
error = ENOMEM;
}
break; /* Break the STAILQ_FOREACH. */
}
}
CC_LIST_RUNLOCK();
INP_WUNLOCK(inp);
break;
default: default:
INP_WUNLOCK(inp); INP_WUNLOCK(inp);
error = ENOPROTOOPT; error = ENOPROTOOPT;
@ -1394,6 +1444,12 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
INP_WUNLOCK(inp); INP_WUNLOCK(inp);
error = sooptcopyout(sopt, &ti, sizeof ti); error = sooptcopyout(sopt, &ti, sizeof ti);
break; break;
case TCP_CONGESTION:
bzero(buf, sizeof(buf));
strlcpy(buf, CC_ALGO(tp)->name, TCP_CA_NAME_MAX);
INP_WUNLOCK(inp);
error = sooptcopyout(sopt, buf, TCP_CA_NAME_MAX);
break;
default: default:
INP_WUNLOCK(inp); INP_WUNLOCK(inp);
error = ENOPROTOOPT; error = ENOPROTOOPT;
@ -1707,6 +1763,10 @@ db_print_tflags(u_int t_flags)
db_printf("%sTF_FASTRECOVERY", comma ? ", " : ""); db_printf("%sTF_FASTRECOVERY", comma ? ", " : "");
comma = 1; comma = 1;
} }
if (t_flags & TF_CONGRECOVERY) {
db_printf("%sTF_CONGRECOVERY", comma ? ", " : "");
comma = 1;
}
if (t_flags & TF_WASFRECOVERY) { if (t_flags & TF_WASFRECOVERY) {
db_printf("%sTF_WASFRECOVERY", comma ? ", " : ""); db_printf("%sTF_WASFRECOVERY", comma ? ", " : "");
comma = 1; comma = 1;

View File

@ -195,9 +195,11 @@ struct tcpcb {
struct toe_usrreqs *t_tu; /* offload operations vector */ struct toe_usrreqs *t_tu; /* offload operations vector */
void *t_toe; /* TOE pcb pointer */ void *t_toe; /* TOE pcb pointer */
int t_bytes_acked; /* # bytes acked during current RTT */ int t_bytes_acked; /* # bytes acked during current RTT */
struct cc_algo *cc_algo; /* congestion control algorithm */
struct cc_var *ccv;
int t_ispare; /* explicit pad for 64bit alignment */ int t_ispare; /* explicit pad for 64bit alignment */
void *t_pspare2[6]; /* 2 CC / 4 TBD */ void *t_pspare2[4]; /* 4 TBD */
uint64_t _pad[12]; /* 7 UTO, 5 TBD (1-2 CC/RTT?) */ uint64_t _pad[12]; /* 7 UTO, 5 TBD (1-2 CC/RTT?) */
}; };
@ -230,10 +232,22 @@ struct tcpcb {
#define TF_ECN_PERMIT 0x4000000 /* connection ECN-ready */ #define TF_ECN_PERMIT 0x4000000 /* connection ECN-ready */
#define TF_ECN_SND_CWR 0x8000000 /* ECN CWR in queue */ #define TF_ECN_SND_CWR 0x8000000 /* ECN CWR in queue */
#define TF_ECN_SND_ECE 0x10000000 /* ECN ECE in queue */ #define TF_ECN_SND_ECE 0x10000000 /* ECN ECE in queue */
#define TF_CONGRECOVERY 0x20000000 /* congestion recovery mode */
#define TF_WASCRECOVERY 0x40000000 /* was in congestion recovery */
#define IN_FASTRECOVERY(tp) (tp->t_flags & TF_FASTRECOVERY) #define IN_FASTRECOVERY(t_flags) (t_flags & TF_FASTRECOVERY)
#define ENTER_FASTRECOVERY(tp) tp->t_flags |= TF_FASTRECOVERY #define ENTER_FASTRECOVERY(t_flags) t_flags |= TF_FASTRECOVERY
#define EXIT_FASTRECOVERY(tp) tp->t_flags &= ~TF_FASTRECOVERY #define EXIT_FASTRECOVERY(t_flags) t_flags &= ~TF_FASTRECOVERY
#define IN_CONGRECOVERY(t_flags) (t_flags & TF_CONGRECOVERY)
#define ENTER_CONGRECOVERY(t_flags) t_flags |= TF_CONGRECOVERY
#define EXIT_CONGRECOVERY(t_flags) t_flags &= ~TF_CONGRECOVERY
#define IN_RECOVERY(t_flags) (t_flags & (TF_CONGRECOVERY | TF_FASTRECOVERY))
#define ENTER_RECOVERY(t_flags) t_flags |= (TF_CONGRECOVERY | TF_FASTRECOVERY)
#define EXIT_RECOVERY(t_flags) t_flags &= ~(TF_CONGRECOVERY | TF_FASTRECOVERY)
#define BYTES_THIS_ACK(tp, th) (th->th_ack - tp->snd_una)
/* /*
* Flags for the t_oobflags field. * Flags for the t_oobflags field.
@ -562,10 +576,11 @@ VNET_DECLARE(int, tcp_mssdflt); /* XXX */
VNET_DECLARE(int, tcp_minmss); VNET_DECLARE(int, tcp_minmss);
VNET_DECLARE(int, tcp_delack_enabled); VNET_DECLARE(int, tcp_delack_enabled);
VNET_DECLARE(int, tcp_do_rfc3390); VNET_DECLARE(int, tcp_do_rfc3390);
VNET_DECLARE(int, tcp_do_newreno);
VNET_DECLARE(int, path_mtu_discovery); VNET_DECLARE(int, path_mtu_discovery);
VNET_DECLARE(int, ss_fltsz); VNET_DECLARE(int, ss_fltsz);
VNET_DECLARE(int, ss_fltsz_local); VNET_DECLARE(int, ss_fltsz_local);
VNET_DECLARE(int, tcp_do_rfc3465);
VNET_DECLARE(int, tcp_abc_l_var);
#define V_tcb VNET(tcb) #define V_tcb VNET(tcb)
#define V_tcbinfo VNET(tcbinfo) #define V_tcbinfo VNET(tcbinfo)
#define V_tcpstat VNET(tcpstat) #define V_tcpstat VNET(tcpstat)
@ -573,10 +588,11 @@ VNET_DECLARE(int, ss_fltsz_local);
#define V_tcp_minmss VNET(tcp_minmss) #define V_tcp_minmss VNET(tcp_minmss)
#define V_tcp_delack_enabled VNET(tcp_delack_enabled) #define V_tcp_delack_enabled VNET(tcp_delack_enabled)
#define V_tcp_do_rfc3390 VNET(tcp_do_rfc3390) #define V_tcp_do_rfc3390 VNET(tcp_do_rfc3390)
#define V_tcp_do_newreno VNET(tcp_do_newreno)
#define V_path_mtu_discovery VNET(path_mtu_discovery) #define V_path_mtu_discovery VNET(path_mtu_discovery)
#define V_ss_fltsz VNET(ss_fltsz) #define V_ss_fltsz VNET(ss_fltsz)
#define V_ss_fltsz_local VNET(ss_fltsz_local) #define V_ss_fltsz_local VNET(ss_fltsz_local)
#define V_tcp_do_rfc3465 VNET(tcp_do_rfc3465)
#define V_tcp_abc_l_var VNET(tcp_abc_l_var)
VNET_DECLARE(int, tcp_do_sack); /* SACK enabled/disabled */ VNET_DECLARE(int, tcp_do_sack); /* SACK enabled/disabled */
VNET_DECLARE(int, tcp_sc_rst_sock_fail); /* RST on sock alloc failure */ VNET_DECLARE(int, tcp_sc_rst_sock_fail); /* RST on sock alloc failure */
@ -678,6 +694,8 @@ void tcp_free_sackholes(struct tcpcb *tp);
int tcp_newreno(struct tcpcb *, struct tcphdr *); int tcp_newreno(struct tcpcb *, struct tcphdr *);
u_long tcp_seq_subtract(u_long, u_long ); u_long tcp_seq_subtract(u_long, u_long );
void cc_cong_signal(struct tcpcb *tp, struct tcphdr *th, uint32_t type);
#endif /* _KERNEL */ #endif /* _KERNEL */
#endif /* _NETINET_TCP_VAR_H_ */ #endif /* _NETINET_TCP_VAR_H_ */

View File

@ -159,8 +159,6 @@ int setfault(faultbuf); /* defined in locore.S */
long Maxmem = 0; long Maxmem = 0;
long realmem = 0; long realmem = 0;
struct pmap ofw_pmap;
#ifndef __powerpc64__ #ifndef __powerpc64__
struct bat battable[16]; struct bat battable[16];
#endif #endif
@ -639,64 +637,6 @@ cpu_halt(void)
OF_exit(); OF_exit();
} }
void
cpu_idle(int busy)
{
register_t msr;
uint16_t vers;
msr = mfmsr();
vers = mfpvr() >> 16;
#ifdef INVARIANTS
if ((msr & PSL_EE) != PSL_EE) {
struct thread *td = curthread;
printf("td msr %#lx\n", (u_long)td->td_md.md_saved_msr);
panic("ints disabled in idleproc!");
}
#endif
CTR2(KTR_SPARE2, "cpu_idle(%d) at %d",
busy, curcpu);
if (powerpc_pow_enabled) {
if (!busy) {
critical_enter();
cpu_idleclock();
}
switch (vers) {
case IBM970:
case IBM970FX:
case IBM970MP:
case MPC7447A:
case MPC7448:
case MPC7450:
case MPC7455:
case MPC7457:
__asm __volatile("\
dssall; sync; mtmsr %0; isync"
:: "r"(msr | PSL_POW));
break;
default:
powerpc_sync();
mtmsr(msr | PSL_POW);
isync();
break;
}
if (!busy) {
cpu_activeclock();
critical_exit();
}
}
CTR2(KTR_SPARE2, "cpu_idle(%d) at %d done",
busy, curcpu);
}
int
cpu_idle_wakeup(int cpu)
{
return (0);
}
int int
ptrace_set_pc(struct thread *td, unsigned long addr) ptrace_set_pc(struct thread *td, unsigned long addr)
{ {

View File

@ -197,8 +197,6 @@ static u_int phys_avail_count;
static int regions_sz, pregions_sz; static int regions_sz, pregions_sz;
static struct ofw_map *translations; static struct ofw_map *translations;
extern struct pmap ofw_pmap;
/* /*
* Lock for the pteg and pvo tables. * Lock for the pteg and pvo tables.
*/ */
@ -669,10 +667,7 @@ moea_cpu_bootstrap(mmu_t mmup, int ap)
isync(); isync();
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
mtsrin(i << ADDR_SR_SHFT, EMPTY_SEGMENT); mtsrin(i << ADDR_SR_SHFT, kernel_pmap->pm_sr[i]);
__asm __volatile("mtsr %0,%1" :: "n"(KERNEL_SR), "r"(KERNEL_SEGMENT));
__asm __volatile("mtsr %0,%1" :: "n"(KERNEL2_SR), "r"(KERNEL2_SEGMENT));
powerpc_sync(); powerpc_sync();
sdr = (u_int)moea_pteg_table | (moea_pteg_mask >> 10); sdr = (u_int)moea_pteg_table | (moea_pteg_mask >> 10);
@ -859,11 +854,16 @@ moea_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend)
moea_vsid_bitmap[0] |= 1; moea_vsid_bitmap[0] |= 1;
/* /*
* Set up the Open Firmware pmap and add it's mappings. * Initialize the kernel pmap (which is statically allocated).
*/
PMAP_LOCK_INIT(kernel_pmap);
for (i = 0; i < 16; i++)
kernel_pmap->pm_sr[i] = EMPTY_SEGMENT + i;
kernel_pmap->pm_active = ~0;
/*
* Set up the Open Firmware mappings
*/ */
moea_pinit(mmup, &ofw_pmap);
ofw_pmap.pm_sr[KERNEL_SR] = KERNEL_SEGMENT;
ofw_pmap.pm_sr[KERNEL2_SR] = KERNEL2_SEGMENT;
if ((chosen = OF_finddevice("/chosen")) == -1) if ((chosen = OF_finddevice("/chosen")) == -1)
panic("moea_bootstrap: can't find /chosen"); panic("moea_bootstrap: can't find /chosen");
OF_getprop(chosen, "mmu", &mmui, 4); OF_getprop(chosen, "mmu", &mmui, 4);
@ -900,16 +900,8 @@ moea_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend)
/* Enter the pages */ /* Enter the pages */
for (off = 0; off < translations[i].om_len; off += PAGE_SIZE) { for (off = 0; off < translations[i].om_len; off += PAGE_SIZE) {
struct vm_page m; moea_kenter(mmup, translations[i].om_va + off,
translations[i].om_pa + off);
m.phys_addr = translations[i].om_pa + off;
m.md.mdpg_cache_attrs = VM_MEMATTR_DEFAULT;
m.oflags = VPO_BUSY;
PMAP_LOCK(&ofw_pmap);
moea_enter_locked(&ofw_pmap,
translations[i].om_va + off, &m,
VM_PROT_ALL, 1);
PMAP_UNLOCK(&ofw_pmap);
ofw_mappings++; ofw_mappings++;
} }
} }
@ -921,17 +913,6 @@ moea_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend)
; ;
Maxmem = powerpc_btop(phys_avail[i + 1]); Maxmem = powerpc_btop(phys_avail[i + 1]);
/*
* Initialize the kernel pmap (which is statically allocated).
*/
PMAP_LOCK_INIT(kernel_pmap);
for (i = 0; i < 16; i++) {
kernel_pmap->pm_sr[i] = EMPTY_SEGMENT;
}
kernel_pmap->pm_sr[KERNEL_SR] = KERNEL_SEGMENT;
kernel_pmap->pm_sr[KERNEL2_SR] = KERNEL2_SEGMENT;
kernel_pmap->pm_active = ~0;
moea_cpu_bootstrap(mmup,0); moea_cpu_bootstrap(mmup,0);
pmap_bootstrapped++; pmap_bootstrapped++;

View File

@ -275,8 +275,6 @@ static struct mem_region *pregions;
static u_int phys_avail_count; static u_int phys_avail_count;
static int regions_sz, pregions_sz; static int regions_sz, pregions_sz;
extern struct pmap ofw_pmap;
extern void bs_remap_earlyboot(void); extern void bs_remap_earlyboot(void);
@ -1119,27 +1117,16 @@ moea64_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend)
chosen = OF_finddevice("/chosen"); chosen = OF_finddevice("/chosen");
if (chosen != -1 && OF_getprop(chosen, "mmu", &mmui, 4) != -1) { if (chosen != -1 && OF_getprop(chosen, "mmu", &mmui, 4) != -1) {
#ifndef __powerpc64__ mmu = OF_instance_to_package(mmui);
moea64_pinit(mmup, &ofw_pmap); if (mmu == -1 || (sz = OF_getproplen(mmu, "translations")) == -1)
sz = 0;
for (i = 0; i < 16; i++)
ofw_pmap.pm_sr[i] = kernel_pmap->pm_sr[i];
#endif
if ((mmu = OF_instance_to_package(mmui)) == -1)
panic("moea64_bootstrap: can't get mmu package");
if ((sz = OF_getproplen(mmu, "translations")) == -1)
panic("moea64_bootstrap: can't get ofw translation count");
if (sz > 6144 /* tmpstksz - 2 KB headroom */) if (sz > 6144 /* tmpstksz - 2 KB headroom */)
panic("moea64_bootstrap: too many ofw translations"); panic("moea64_bootstrap: too many ofw translations");
moea64_add_ofw_mappings(mmup, mmu, sz); if (sz > 0)
moea64_add_ofw_mappings(mmup, mmu, sz);
} }
#ifdef SMP
TLBSYNC();
#endif
/* /*
* Calculate the last available physical address. * Calculate the last available physical address.
*/ */
@ -2385,6 +2372,9 @@ moea64_bootstrap_alloc(vm_size_t size, u_int align)
if (s < phys_avail[i] || e > phys_avail[i + 1]) if (s < phys_avail[i] || e > phys_avail[i + 1])
continue; continue;
if (s + size > platform_real_maxaddr())
continue;
if (s == phys_avail[i]) { if (s == phys_avail[i]) {
phys_avail[i] += size; phys_avail[i] += size;
} else if (e == phys_avail[i + 1]) { } else if (e == phys_avail[i + 1]) {

View File

@ -228,6 +228,21 @@ cpudep_save_config(void *dummy)
powerpc_sync(); powerpc_sync();
break; break;
#ifdef __powerpc64__
case IBMCELLBE:
if (mfmsr() & PSL_HV) {
bsp_state[0] = mfspr(SPR_HID0);
bsp_state[1] = mfspr(SPR_HID1);
bsp_state[2] = mfspr(SPR_HID4);
bsp_state[3] = mfspr(SPR_HID6);
bsp_state[4] = mfspr(SPR_CELL_TSCR);
}
bsp_state[5] = mfspr(SPR_CELL_TSRL);
break;
#endif
case MPC7450: case MPC7450:
case MPC7455: case MPC7455:
case MPC7457: case MPC7457:
@ -288,6 +303,21 @@ cpudep_ap_setup()
powerpc_sync(); powerpc_sync();
break; break;
#ifdef __powerpc64__
case IBMCELLBE:
if (mfmsr() & PSL_HV) {
mtspr(SPR_HID0, bsp_state[0]);
mtspr(SPR_HID1, bsp_state[1]);
mtspr(SPR_HID4, bsp_state[2]);
mtspr(SPR_HID6, bsp_state[3]);
mtspr(SPR_CELL_TSCR, bsp_state[4]);
}
mtspr(SPR_CELL_TSRL, bsp_state[5]);
break;
#endif
case MPC7450: case MPC7450:
case MPC7455: case MPC7455:
case MPC7457: case MPC7457:

View File

@ -36,9 +36,14 @@
#include <vm/vm.h> #include <vm/vm.h>
#include <vm/pmap.h> #include <vm/pmap.h>
#include <vm/uma.h> #include <vm/uma.h>
#include <vm/vm.h>
#include <vm/vm_map.h> #include <vm/vm_map.h>
#include <vm/vm_page.h>
#include <vm/vm_pageout.h>
#include <vm/vm_phys.h>
#include <machine/md_var.h> #include <machine/md_var.h>
#include <machine/platform.h>
#include <machine/pmap.h> #include <machine/pmap.h>
#include <machine/vmparam.h> #include <machine/vmparam.h>
@ -474,6 +479,51 @@ slb_insert_user(pmap_t pm, struct slb *slb)
pm->pm_slb[i] = slb; pm->pm_slb[i] = slb;
} }
static void *
slb_uma_real_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait)
{
static vm_offset_t realmax = 0;
void *va;
vm_page_t m;
int pflags;
if (realmax == 0)
realmax = platform_real_maxaddr();
*flags = UMA_SLAB_PRIV;
if ((wait & (M_NOWAIT|M_USE_RESERVE)) == M_NOWAIT)
pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED;
else
pflags = VM_ALLOC_SYSTEM | VM_ALLOC_WIRED;
if (wait & M_ZERO)
pflags |= VM_ALLOC_ZERO;
for (;;) {
m = vm_phys_alloc_contig(1, 0, realmax, PAGE_SIZE,
PAGE_SIZE);
if (m == NULL) {
if (wait & M_NOWAIT)
return (NULL);
VM_WAIT;
} else
break;
}
va = (void *) VM_PAGE_TO_PHYS(m);
if (!hw_direct_map)
pmap_kenter((vm_offset_t)va, VM_PAGE_TO_PHYS(m));
if ((wait & M_ZERO) && (m->flags & PG_ZERO) == 0)
bzero(va, PAGE_SIZE);
/* vm_phys_alloc_contig does not track wiring */
atomic_add_int(&cnt.v_wire_count, 1);
m->wire_count = 1;
return (va);
}
static void static void
slb_zone_init(void *dummy) slb_zone_init(void *dummy)
{ {
@ -482,6 +532,11 @@ slb_zone_init(void *dummy)
NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_VM); NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_VM);
slb_cache_zone = uma_zcreate("SLB cache", 64*sizeof(struct slb *), slb_cache_zone = uma_zcreate("SLB cache", 64*sizeof(struct slb *),
NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_VM); NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_VM);
if (platform_real_maxaddr() != VM_MAX_ADDRESS) {
uma_zone_set_allocf(slb_cache_zone, slb_uma_real_alloc);
uma_zone_set_allocf(slbt_zone, slb_uma_real_alloc);
}
} }
struct slb ** struct slb **

View File

@ -468,50 +468,6 @@ cpu_flush_dcache(void *ptr, size_t len)
/* TBD */ /* TBD */
} }
/*
* cpu_idle
*
* Set Wait state enable.
*/
void
cpu_idle (int busy)
{
register_t msr;
msr = mfmsr();
#ifdef INVARIANTS
if ((msr & PSL_EE) != PSL_EE) {
struct thread *td = curthread;
printf("td msr %x\n", td->td_md.md_saved_msr);
panic("ints disabled in idleproc!");
}
#endif
CTR2(KTR_SPARE2, "cpu_idle(%d) at %d",
busy, curcpu);
if (!busy) {
critical_enter();
cpu_idleclock();
}
/* Freescale E500 core RM section 6.4.1. */
msr = msr | PSL_WE;
__asm __volatile("msync; mtmsr %0; isync" :: "r" (msr));
if (!busy) {
cpu_activeclock();
critical_exit();
}
CTR2(KTR_SPARE2, "cpu_idle(%d) at %d done",
busy, curcpu);
}
int
cpu_idle_wakeup(int cpu)
{
return (0);
}
void void
spinlock_enter(void) spinlock_enter(void)
{ {
@ -641,12 +597,3 @@ bzero(void *buf, size_t len)
} }
} }
/*
* XXX what is the better/proper place for this routine?
*/
int
mem_valid(vm_offset_t addr, int len)
{
return (1);
}

View File

@ -106,6 +106,17 @@ mfsrin(vm_offset_t va)
} }
#endif #endif
static __inline register_t
mfctrl(void)
{
register_t value;
__asm __volatile ("mfspr %0,136" : "=r"(value));
return (value);
}
static __inline void static __inline void
mtdec(register_t value) mtdec(register_t value)
{ {

View File

@ -44,6 +44,7 @@ struct mem_region {
}; };
void mem_regions(struct mem_region **, int *, struct mem_region **, int *); void mem_regions(struct mem_region **, int *, struct mem_region **, int *);
vm_offset_t platform_real_maxaddr(void);
u_long platform_timebase_freq(struct cpuref *); u_long platform_timebase_freq(struct cpuref *);

View File

@ -420,6 +420,10 @@
#define SPR_HID1 0x3f1 /* ..8 Hardware Implementation Register 1 */ #define SPR_HID1 0x3f1 /* ..8 Hardware Implementation Register 1 */
#define SPR_HID4 0x3f4 /* ..8 Hardware Implementation Register 4 */ #define SPR_HID4 0x3f4 /* ..8 Hardware Implementation Register 4 */
#define SPR_HID5 0x3f6 /* ..8 Hardware Implementation Register 5 */ #define SPR_HID5 0x3f6 /* ..8 Hardware Implementation Register 5 */
#define SPR_HID6 0x3f9 /* ..8 Hardware Implementation Register 6 */
#define SPR_CELL_TSRL 0x380 /* ... Cell BE Thread Status Register */
#define SPR_CELL_TSCR 0x399 /* ... Cell BE Thread Switch Register */
#if defined(AIM) #if defined(AIM)
#define SPR_DBSR 0x3f0 /* 4.. Debug Status Register */ #define SPR_DBSR 0x3f0 /* 4.. Debug Status Register */

View File

@ -66,7 +66,6 @@ static struct mem_region OFfree[OFMEM_REGIONS + 3];
static int nOFmem; static int nOFmem;
extern register_t ofmsr[5]; extern register_t ofmsr[5];
extern struct pmap ofw_pmap;
static int (*ofwcall)(void *); static int (*ofwcall)(void *);
static void *fdt; static void *fdt;
int ofw_real_mode; int ofw_real_mode;
@ -417,59 +416,27 @@ openfirmware_core(void *args)
{ {
int result; int result;
register_t oldmsr; register_t oldmsr;
#ifndef __powerpc64__
register_t srsave[16];
u_int i;
#endif
/* /*
* Turn off exceptions - we really don't want to end up * Turn off exceptions - we really don't want to end up
* anywhere unexpected with PCPU set to something strange, * anywhere unexpected with PCPU set to something strange
* the stack pointer wrong, or the OFW mapping enabled. * or the stack pointer wrong.
*/ */
oldmsr = intr_disable(); oldmsr = intr_disable();
ofw_sprg_prepare(); ofw_sprg_prepare();
#ifndef __powerpc64__ #if defined(AIM) && !defined(__powerpc64__)
if (pmap_bootstrapped && !ofw_real_mode) { /*
/* * Clear battable[] translations
* Swap the kernel's address space with Open Firmware's */
*/ if (!(cpu_features & PPC_FEATURE_64))
__asm __volatile("mtdbatu 2, %0\n"
for (i = 0; i < 16; i++) { "mtdbatu 3, %0" : : "r" (0));
srsave[i] = mfsrin(i << ADDR_SR_SHFT); isync();
mtsrin(i << ADDR_SR_SHFT, ofw_pmap.pm_sr[i]); #endif
}
/*
* Clear battable[] translations
*/
if (!(cpu_features & PPC_FEATURE_64)) {
__asm __volatile("mtdbatu 2, %0\n"
"mtdbatu 3, %0" : : "r" (0));
}
isync();
}
#endif
result = ofwcall(args); result = ofwcall(args);
#ifndef __powerpc64__
if (pmap_bootstrapped && !ofw_real_mode) {
/*
* Restore the kernel's addr space. The isync() doesn;t
* work outside the loop unless mtsrin() is open-coded
* in an asm statement :(
*/
for (i = 0; i < 16; i++) {
mtsrin(i << ADDR_SR_SHFT, srsave[i]);
isync();
}
}
#endif
ofw_sprg_restore(); ofw_sprg_restore();
intr_restore(oldmsr); intr_restore(oldmsr);
@ -692,16 +659,3 @@ OF_decode_addr(phandle_t dev, int regno, bus_space_tag_t *tag,
return (bus_space_map(*tag, addr, size, 0, handle)); return (bus_space_map(*tag, addr, size, 0, handle));
} }
int
mem_valid(vm_offset_t addr, int len)
{
int i;
for (i = 0; i < nOFmem; i++)
if ((addr >= OFmem[i].mr_start)
&& (addr + len < OFmem[i].mr_start + OFmem[i].mr_size))
return (0);
return (EFAULT);
}

View File

@ -64,6 +64,7 @@
#include <sys/conf.h> #include <sys/conf.h>
#include <sys/cpu.h> #include <sys/cpu.h>
#include <sys/kernel.h> #include <sys/kernel.h>
#include <sys/proc.h>
#include <sys/sysctl.h> #include <sys/sysctl.h>
#include <machine/bus.h> #include <machine/bus.h>
@ -73,12 +74,15 @@
#include <machine/smp.h> #include <machine/smp.h>
#include <machine/spr.h> #include <machine/spr.h>
int powerpc_pow_enabled;
static void cpu_6xx_setup(int cpuid, uint16_t vers); static void cpu_6xx_setup(int cpuid, uint16_t vers);
static void cpu_e500_setup(int cpuid, uint16_t vers); static void cpu_e500_setup(int cpuid, uint16_t vers);
static void cpu_970_setup(int cpuid, uint16_t vers); static void cpu_970_setup(int cpuid, uint16_t vers);
int powerpc_pow_enabled;
void (*cpu_idle_hook)(void) = NULL;
static void cpu_idle_60x(void);
static void cpu_idle_e500(void);
struct cputab { struct cputab {
const char *name; const char *name;
uint16_t version; uint16_t version;
@ -145,6 +149,9 @@ static const struct cputab models[] = {
0, cpu_e500_setup }, 0, cpu_e500_setup },
{ "Freescale e500v2 core", FSL_E500v2, REVFMT_MAJMIN, { "Freescale e500v2 core", FSL_E500v2, REVFMT_MAJMIN,
0, cpu_e500_setup }, 0, cpu_e500_setup },
{ "IBM Cell Broadband Engine", IBMCELLBE, REVFMT_MAJMIN,
PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU,
NULL},
{ "Unknown PowerPC CPU", 0, REVFMT_HEX, 0, NULL }, { "Unknown PowerPC CPU", 0, REVFMT_HEX, 0, NULL },
}; };
@ -374,6 +381,9 @@ cpu_6xx_setup(int cpuid, uint16_t vers)
} }
printf("cpu%d: HID0 %b\n", cpuid, (int)hid0, bitmask); printf("cpu%d: HID0 %b\n", cpuid, (int)hid0, bitmask);
if (cpu_idle_hook == NULL)
cpu_idle_hook = cpu_idle_60x;
} }
@ -441,6 +451,9 @@ cpu_e500_setup(int cpuid, uint16_t vers)
mtspr(SPR_HID0, hid0); mtspr(SPR_HID0, hid0);
printf("cpu%d: HID0 %b\n", cpuid, (int)hid0, HID0_E500_BITMASK); printf("cpu%d: HID0 %b\n", cpuid, (int)hid0, HID0_E500_BITMASK);
if (cpu_idle_hook == NULL)
cpu_idle_hook = cpu_idle_e500;
} }
static void static void
@ -478,6 +491,8 @@ cpu_970_setup(int cpuid, uint16_t vers)
: "=r" (hid0_hi) : "K" (SPR_HID0)); : "=r" (hid0_hi) : "K" (SPR_HID0));
printf("cpu%d: HID0 %b\n", cpuid, (int)(hid0_hi), HID0_970_BITMASK); printf("cpu%d: HID0 %b\n", cpuid, (int)(hid0_hi), HID0_970_BITMASK);
#endif #endif
cpu_idle_hook = cpu_idle_60x;
} }
static int static int
@ -490,3 +505,87 @@ cpu_feature_bit(SYSCTL_HANDLER_ARGS)
return (sysctl_handle_int(oidp, &result, 0, req)); return (sysctl_handle_int(oidp, &result, 0, req));
} }
void
cpu_idle(int busy)
{
#ifdef INVARIANTS
if ((mfmsr() & PSL_EE) != PSL_EE) {
struct thread *td = curthread;
printf("td msr %#lx\n", (u_long)td->td_md.md_saved_msr);
panic("ints disabled in idleproc!");
}
#endif
CTR2(KTR_SPARE2, "cpu_idle(%d) at %d",
busy, curcpu);
if (cpu_idle_hook != NULL) {
if (!busy) {
critical_enter();
cpu_idleclock();
}
cpu_idle_hook();
if (!busy) {
cpu_activeclock();
critical_exit();
}
}
CTR2(KTR_SPARE2, "cpu_idle(%d) at %d done",
busy, curcpu);
}
int
cpu_idle_wakeup(int cpu)
{
return (0);
}
static void
cpu_idle_60x(void)
{
register_t msr;
uint16_t vers;
if (!powerpc_pow_enabled)
return;
msr = mfmsr();
vers = mfpvr() >> 16;
#ifdef AIM
switch (vers) {
case IBM970:
case IBM970FX:
case IBM970MP:
case MPC7447A:
case MPC7448:
case MPC7450:
case MPC7455:
case MPC7457:
__asm __volatile("\
dssall; sync; mtmsr %0; isync"
:: "r"(msr | PSL_POW));
break;
default:
powerpc_sync();
mtmsr(msr | PSL_POW);
isync();
break;
}
#endif
}
static void
cpu_idle_e500(void)
{
register_t msr;
msr = mfmsr();
#ifdef E500
/* Freescale E500 core RM section 6.4.1. */
__asm __volatile("msync; mtmsr %0; isync" ::
"r" (msr | PSL_WE));
#endif
}

View File

@ -78,7 +78,13 @@ machdep_ap_bootstrap(void)
; ;
/* Initialize DEC and TB, sync with the BSP values */ /* Initialize DEC and TB, sync with the BSP values */
#ifdef __powerpc64__
/* Writing to the time base register is hypervisor-privileged */
if (mfmsr() & PSL_HV)
mttb(ap_timebase);
#else
mttb(ap_timebase); mttb(ap_timebase);
#endif
decr_ap_init(); decr_ap_init();
/* Serialize console output and AP count increment */ /* Serialize console output and AP count increment */
@ -98,13 +104,6 @@ machdep_ap_bootstrap(void)
sched_throw(NULL); sched_throw(NULL);
} }
struct cpu_group *
cpu_topo(void)
{
return (smp_topo_none());
}
void void
cpu_mp_setmaxid(void) cpu_mp_setmaxid(void)
{ {
@ -247,7 +246,13 @@ cpu_mp_unleash(void *dummy)
/* Let APs continue */ /* Let APs continue */
atomic_store_rel_int(&ap_letgo, 1); atomic_store_rel_int(&ap_letgo, 1);
#ifdef __powerpc64__
/* Writing to the time base register is hypervisor-privileged */
if (mfmsr() & PSL_HV)
mttb(ap_timebase);
#else
mttb(ap_timebase); mttb(ap_timebase);
#endif
while (ap_awake < smp_cpus) while (ap_awake < smp_cpus)
; ;

View File

@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$");
#include <sys/ktr.h> #include <sys/ktr.h>
#include <sys/mutex.h> #include <sys/mutex.h>
#include <sys/systm.h> #include <sys/systm.h>
#include <sys/smp.h>
#include <sys/sysctl.h> #include <sys/sysctl.h>
#include <sys/types.h> #include <sys/types.h>
@ -47,6 +48,7 @@ __FBSDID("$FreeBSD$");
#include <vm/vm_page.h> #include <vm/vm_page.h>
#include <machine/cpu.h> #include <machine/cpu.h>
#include <machine/md_var.h>
#include <machine/platform.h> #include <machine/platform.h>
#include <machine/platformvar.h> #include <machine/platformvar.h>
#include <machine/smp.h> #include <machine/smp.h>
@ -62,11 +64,45 @@ static char plat_name[64] = "";
SYSCTL_STRING(_hw, OID_AUTO, platform, CTLFLAG_RD | CTLFLAG_TUN, SYSCTL_STRING(_hw, OID_AUTO, platform, CTLFLAG_RD | CTLFLAG_TUN,
plat_name, 0, "Platform currently in use"); plat_name, 0, "Platform currently in use");
static struct mem_region *pregions = NULL;
static struct mem_region *aregions = NULL;
static int npregions, naregions;
void void
mem_regions(struct mem_region **phys, int *physsz, struct mem_region **avail, mem_regions(struct mem_region **phys, int *physsz, struct mem_region **avail,
int *availsz) int *availsz)
{ {
PLATFORM_MEM_REGIONS(plat_obj, phys, physsz, avail, availsz); if (pregions == NULL)
PLATFORM_MEM_REGIONS(plat_obj, &pregions, &npregions,
&aregions, &naregions);
*phys = pregions;
*avail = aregions;
*physsz = npregions;
*availsz = naregions;
}
int
mem_valid(vm_offset_t addr, int len)
{
int i;
if (pregions == NULL)
PLATFORM_MEM_REGIONS(plat_obj, &pregions, &npregions,
&aregions, &naregions);
for (i = 0; i < npregions; i++)
if ((addr >= pregions[i].mr_start)
&& (addr + len < pregions[i].mr_start + pregions[i].mr_size))
return (0);
return (EFAULT);
}
vm_offset_t
platform_real_maxaddr(void)
{
return (PLATFORM_REAL_MAXADDR(plat_obj));
} }
const char * const char *
@ -105,6 +141,14 @@ platform_smp_start_cpu(struct pcpu *cpu)
return (PLATFORM_SMP_START_CPU(plat_obj, cpu)); return (PLATFORM_SMP_START_CPU(plat_obj, cpu));
} }
#ifdef SMP
struct cpu_group *
cpu_topo(void)
{
return (PLATFORM_SMP_TOPO(plat_obj));
}
#endif
/* /*
* Reset back to firmware. * Reset back to firmware.
*/ */
@ -164,9 +208,10 @@ platform_probe_and_attach()
} }
/* /*
* We can't free the KOBJ, since it is static. Luckily, * We can't free the KOBJ, since it is static. Reset the ops
* this has no ill effects since it gets reset every time. * member of this class so that we can come back later.
*/ */
platp->ops = NULL;
} }
if (plat_def_impl == NULL) if (plat_def_impl == NULL)

View File

@ -30,10 +30,12 @@
#include <sys/lock.h> #include <sys/lock.h>
#include <sys/mutex.h> #include <sys/mutex.h>
#include <sys/systm.h> #include <sys/systm.h>
#include <sys/smp.h>
#include <machine/platform.h> #include <machine/platform.h>
#include <machine/platformvar.h> #include <machine/platformvar.h>
#include <machine/smp.h> #include <machine/smp.h>
#include <machine/vmparam.h>
/** /**
* @defgroup PLATFORM platform - KObj methods for PowerPC platform * @defgroup PLATFORM platform - KObj methods for PowerPC platform
@ -66,6 +68,18 @@ CODE {
{ {
return (ENOENT); return (ENOENT);
} }
static struct cpu_group *platform_null_smp_topo(platform_t plat)
{
#ifdef SMP
return (smp_topo_none());
#else
return (NULL);
#endif
}
static vm_offset_t platform_null_real_maxaddr(platform_t plat)
{
return (VM_MAX_ADDRESS);
}
}; };
/** /**
@ -108,6 +122,15 @@ METHOD void mem_regions {
int *_availsz; int *_availsz;
}; };
/**
* @brief Return the maximum address accessible in real mode
* (for use with hypervisors)
*/
METHOD vm_offset_t real_maxaddr {
platform_t _plat;
} DEFAULT platform_null_real_maxaddr;
/** /**
* @brief Get the CPU's timebase frequency, in ticks per second. * @brief Get the CPU's timebase frequency, in ticks per second.
* *
@ -161,6 +184,13 @@ METHOD int smp_start_cpu {
struct pcpu *_cpu; struct pcpu *_cpu;
}; };
/**
* @brief Return SMP topology
*/
METHOD cpu_group_t smp_topo {
platform_t _plat;
} DEFAULT platform_null_smp_topo;
/** /**
* @brief Reset system * @brief Reset system
*/ */

View File

@ -58,7 +58,7 @@
* in the range 5 to 9. * in the range 5 to 9.
*/ */
#undef __FreeBSD_version #undef __FreeBSD_version
#define __FreeBSD_version 900024 /* Master, propagated to newvers */ #define __FreeBSD_version 900025 /* Master, propagated to newvers */
#ifndef LOCORE #ifndef LOCORE
#include <sys/types.h> #include <sys/types.h>

View File

@ -284,7 +284,7 @@ typedef struct __siginfo {
#define POLL_MSG 3 /* Input message available */ #define POLL_MSG 3 /* Input message available */
#define POLL_ERR 4 /* I/O Error */ #define POLL_ERR 4 /* I/O Error */
#define POLL_PRI 5 /* High priority input available */ #define POLL_PRI 5 /* High priority input available */
#define POLL_HUP 4 /* Device disconnected */ #define POLL_HUP 6 /* Device disconnected */
#endif #endif

View File

@ -16,8 +16,6 @@
#ifndef LOCORE #ifndef LOCORE
#ifdef SMP
/* /*
* Topology of a NUMA or HTT system. * Topology of a NUMA or HTT system.
* *
@ -41,6 +39,8 @@ struct cpu_group {
int8_t cg_flags; /* Traversal modifiers. */ int8_t cg_flags; /* Traversal modifiers. */
}; };
typedef struct cpu_group *cpu_group_t;
/* /*
* Defines common resources for CPUs in the group. The highest level * Defines common resources for CPUs in the group. The highest level
* resource should be used when multiple are shared. * resource should be used when multiple are shared.
@ -60,6 +60,7 @@ struct cpu_group {
/* /*
* Convenience routines for building topologies. * Convenience routines for building topologies.
*/ */
#ifdef SMP
struct cpu_group *smp_topo(void); struct cpu_group *smp_topo(void);
struct cpu_group *smp_topo_none(void); struct cpu_group *smp_topo_none(void);
struct cpu_group *smp_topo_1level(int l1share, int l1count, int l1flags); struct cpu_group *smp_topo_1level(int l1share, int l1count, int l1flags);

View File

@ -137,6 +137,7 @@ typedef __uid_t uid_t;
#define SO_LISTENQLEN 0x1012 /* socket's complete queue length */ #define SO_LISTENQLEN 0x1012 /* socket's complete queue length */
#define SO_LISTENINCQLEN 0x1013 /* socket's incomplete queue length */ #define SO_LISTENINCQLEN 0x1013 /* socket's incomplete queue length */
#define SO_SETFIB 0x1014 /* use this FIB to route */ #define SO_SETFIB 0x1014 /* use this FIB to route */
#define SO_USER_COOKIE 0x1015 /* user cookie (dummynet etc.) */
#endif #endif
/* /*

View File

@ -117,7 +117,14 @@ struct socket {
void *so_accept_filter_arg; /* saved filter args */ void *so_accept_filter_arg; /* saved filter args */
char *so_accept_filter_str; /* saved user args */ char *so_accept_filter_str; /* saved user args */
} *so_accf; } *so_accf;
/*
* so_fibnum, so_user_cookie and friends can be used to attach
* some user-specified metadata to a socket, which then can be
* used by the kernel for various actions.
* so_user_cookie is used by ipfw/dummynet.
*/
int so_fibnum; /* routing domain for this socket */ int so_fibnum; /* routing domain for this socket */
uint32_t so_user_cookie;
}; };
/* /*