added sample configuration
This commit is contained in:
parent
bde0ea9f70
commit
5ab09e78b2
3 changed files with 57 additions and 270 deletions
53
LAYOUT
53
LAYOUT
|
@ -1,53 +0,0 @@
|
||||||
Component directory layout:
|
|
||||||
|
|
||||||
Directory Description
|
|
||||||
============= =============================================================
|
|
||||||
common Non-specific functionality that is of general interest, e.g.
|
|
||||||
the logging system, test infrastructure and Buffer class.
|
|
||||||
common/thread Threading infrastructure.
|
|
||||||
common/timer Time sampling infrastructure.
|
|
||||||
common/uuid UUID API.
|
|
||||||
config General-purpose configuration system infrastructure and some
|
|
||||||
essential types and classes.
|
|
||||||
crypto Cryptographic API and implementations, including hashes, MACs
|
|
||||||
and encryption algorithms.
|
|
||||||
event The event system and infrastructure to support it, such as
|
|
||||||
the various implementations of the poll interface.
|
|
||||||
http HTTP protocol implementation and utility functions.
|
|
||||||
io IO system, namely file descriptors interfaces.
|
|
||||||
io/net Networking abstractions for the IO system, utility functions and
|
|
||||||
protocols.
|
|
||||||
io/pipe Pipe infrastructure; abstractions and useful types.
|
|
||||||
io/socket Sockets interface to the IO system.
|
|
||||||
network Low-level networking, e.g. packet capture.
|
|
||||||
network/uinet User-space TCP/IP stack (see network/uinet/LAYOUT for futher
|
|
||||||
layout info).
|
|
||||||
programs Stand-alone programs, organized into sub-directories named by
|
|
||||||
program.
|
|
||||||
programs/diskdup
|
|
||||||
Block storage demonstration program, for making two block
|
|
||||||
devices or files have identical contents with a minimal number
|
|
||||||
of writes.
|
|
||||||
programs/fwdproxy
|
|
||||||
Simple file-driven port-forwarding proxy.
|
|
||||||
programs/tack File-oriented dictionary compression using XCodec.
|
|
||||||
programs/wanproxy
|
|
||||||
WANProxy.
|
|
||||||
programs/websplat
|
|
||||||
Simple web server.
|
|
||||||
programs/xcdump XCodec stream decoder and pretty-printer.
|
|
||||||
ssh SSH protocol implementation.
|
|
||||||
xcodec The XCodec codec, which performs deduplication, and its
|
|
||||||
internal interfaces.
|
|
||||||
xml Trivial XML functions.
|
|
||||||
zlib Wrappers around zlib, providing Pipes that do inflate and
|
|
||||||
deflate.
|
|
||||||
|
|
||||||
Standard sub-directories:
|
|
||||||
|
|
||||||
Directory Description
|
|
||||||
============= =============================================================
|
|
||||||
test Unit tests.
|
|
||||||
example Example programs which may test functionality in a
|
|
||||||
non-automated fashion or merely provide example usage of a
|
|
||||||
complex interface.
|
|
217
TODO
217
TODO
|
@ -1,217 +0,0 @@
|
||||||
High-priority:
|
|
||||||
Add a mechanism for forwarding callbacks between EventThread instances,
|
|
||||||
or even just between thread instances. Have a callback queue and an
|
|
||||||
fd to poll on, and when a remote thread adds something to an empty
|
|
||||||
callback queue, it writes something to the fd so as to wake up its
|
|
||||||
peer thread. NB: Even better if the poll-compatible wakeups (note,
|
|
||||||
that's the real point here: don't want to mix fd polling and cv waiting,
|
|
||||||
for instance) were dependent on the EventPoll implementation. That way
|
|
||||||
we could use kqueue's user types, etc., rather than needing to use a
|
|
||||||
pipe.
|
|
||||||
|
|
||||||
Alternately, move fd polling to its own thread and use condvars and
|
|
||||||
callback queues for everything else.
|
|
||||||
|
|
||||||
As part of testing/enabling/proofing that work, split EventThread into
|
|
||||||
two threads, and add one more. One thread which does FD polling. One
|
|
||||||
thread which does callback / timeout dispatch. And then move the I/O
|
|
||||||
system into its own thread. Does that sound about right? Easy then to
|
|
||||||
start to move other things to their own threads, because the threading
|
|
||||||
concerns of each of those subsystems would be covered. So we could
|
|
||||||
have some number of XCodec threads or whatever. A work submission
|
|
||||||
model that's fairly generic would be nice. So you could submit
|
|
||||||
callbacks or timeouts to the callback thread, fd registration and
|
|
||||||
deregestration to the poll thread, and I/O requests to the I/O thread.
|
|
||||||
|
|
||||||
Adds some latency, but probably worth it?
|
|
||||||
|
|
||||||
And for threads which need a specialized work submission process, we
|
|
||||||
could just override some method from Thread. Have a simple base class
|
|
||||||
for work items, let each type of thread do a dynamic_cast from there
|
|
||||||
up? Or provide more specific interfaces, do queueing in each thread's
|
|
||||||
class, and just provide a common alert() / biff() / ping() / wakeup()
|
|
||||||
method which alerts that an empty mailbox has become non-empty. So
|
|
||||||
the poll thread doesn't have to use condvars AND fds somehow. And let
|
|
||||||
each thread specify a timeout for sleeping, mostly useful for the
|
|
||||||
callback thread.
|
|
||||||
|
|
||||||
Make it so that Actions can be given a callback after they are created, and
|
|
||||||
then the source of the Action from that gets the hint to start and where to
|
|
||||||
continue after the asynchronous action. This has the nice benefit of getting
|
|
||||||
rid of the callback parameter to async methods, e.g.
|
|
||||||
handler_.wait(socket_->read(0, handler_.callback()));
|
|
||||||
Becomes:
|
|
||||||
handler_.wait(socket_->read(0));
|
|
||||||
Where handler_.wait is like:
|
|
||||||
void wait(Action *a)
|
|
||||||
{
|
|
||||||
a->callback(this, &EventHandler::handle_callback);
|
|
||||||
action_ = a;
|
|
||||||
}
|
|
||||||
Alternately, it would be nice to make asynchronous interfaces move to taking
|
|
||||||
CallbackHandler or EventHandler instances, e.g.
|
|
||||||
socket_->read(0, &handler_);
|
|
||||||
And then socket_->read is like:
|
|
||||||
void read(size_t amt, EventHandler *handler)
|
|
||||||
{
|
|
||||||
read_callback_ = handler->callback();
|
|
||||||
handler->wait(cancellation(this, Socket::read_cancel));
|
|
||||||
|
|
||||||
start_read();
|
|
||||||
}
|
|
||||||
|
|
||||||
I feel like continuing to live with these possibilities may make clear how the
|
|
||||||
various APIs may best change, e.g. perhaps read should be:
|
|
||||||
void read(size_t amt, EventHandler *handler)
|
|
||||||
{
|
|
||||||
read_handler_ = handler;
|
|
||||||
read_handler_->cancellation(this, Socket::read_cancel);
|
|
||||||
|
|
||||||
start_read();
|
|
||||||
}
|
|
||||||
...
|
|
||||||
void read_complete(Event e)
|
|
||||||
{
|
|
||||||
read_handler_->consume(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
%%%
|
|
||||||
|
|
||||||
o) Do a pass with Log taking a LogHandle& not a const LogHandle& so I can
|
|
||||||
find places using hard-coded strings to move into LogHandles. Using a
|
|
||||||
LogHandle is vastly superior since it probably means doing the right
|
|
||||||
thing in virtual classes so that errors in the base class caused by the
|
|
||||||
subclass make it clear where the problem might be.
|
|
||||||
|
|
||||||
o) PipeProducer::input_do; PipeProducer::input_cork(), partial consume() ->
|
|
||||||
require input_cork().
|
|
||||||
|
|
||||||
Note:
|
|
||||||
o) Callbacks are going through a period of major change. For now, except for
|
|
||||||
the CallbackSchedulers, it is assumed that all callbacks will need to be
|
|
||||||
strongly typed, that is that most interfaces will take a SimpleCallback or
|
|
||||||
an EventCallback or similar, and use it directly. This will mostly be a
|
|
||||||
problem in the TimeoutQueue. If some class feels that it ought to be able
|
|
||||||
to schedule a timeout to handle a callback for, say, an EventCallback that
|
|
||||||
has already had its parameter set, we'll have problems.
|
|
||||||
|
|
||||||
NB: Once all extant code is converted in this manner, the CallbackBase
|
|
||||||
class could be named back to Callback, but since few things should be
|
|
||||||
using it directly, the more obtuse name may be desirable as an aid in
|
|
||||||
avoiding foot-shooting. Or just rename CallbackBase to Schedulable
|
|
||||||
and have done with it.
|
|
||||||
|
|
||||||
XXX Eventually the schedule function could be moved into SimpleCallback,
|
|
||||||
TypedCallback, etc., so that we can in the latter case blow up badly
|
|
||||||
if someone asks to schedule a function whose parameter has not been
|
|
||||||
set.
|
|
||||||
|
|
||||||
o) Make tack use the EventSystem and IOSystem now that the performance of
|
|
||||||
the latter is substantially better than the hand-rolled I/O of tack.
|
|
||||||
o) Replace singletons with thread-local storage.
|
|
||||||
o) Get simple packet capture/injection stuff working, enough to do some trivial
|
|
||||||
packet tunneling / deduplication stuff.
|
|
||||||
o) Packet framing, so we can divide incoming Buffers up into protocol control
|
|
||||||
and data fields, so that we deduplicate at useful boundaries and don't do
|
|
||||||
things like include ephemeral fields or sensitive information.
|
|
||||||
o) Begin introducing locking.
|
|
||||||
o) Split polling across multiple threads, or do callbacks in one thread and
|
|
||||||
run the IOSystem on another (IOThread?)
|
|
||||||
o) Find ways to reduce the cost of the EventThread abstraction, possibly by
|
|
||||||
decomposing it into several things and running timeouts and polling in
|
|
||||||
separate threads, so the inner loops are tighter. callback-speed1 has
|
|
||||||
gotten quite painful on Mac OS X (though little impact on FreeBSD, perhaps
|
|
||||||
thread-local storage is faster on FreeBSD?)
|
|
||||||
o) Add centralized implementations of Catenate and other patterns in lots of
|
|
||||||
the tests.
|
|
||||||
o) When splitting things into different threads, add a pipe-oriented condition
|
|
||||||
variable facility or something, at least for threads which need to poll,
|
|
||||||
rather than just use condition variabls. Or perhaps we should just use an
|
|
||||||
inter-thread messaging paradigm to handle different queues for each thread,
|
|
||||||
which is slow but we can probably batch updates through a scheduler.
|
|
||||||
|
|
||||||
For 0.7.1:
|
|
||||||
o) Add an ActionCache which classes can use to dole out Actions and which at
|
|
||||||
destruction time will assert that there are no outstanding actions. This
|
|
||||||
will make debugging code involving Actions easier and give better Action
|
|
||||||
allocation performance, done properly.
|
|
||||||
|
|
||||||
For 0.7.2:
|
|
||||||
o) Test error handling in epoll.
|
|
||||||
o) Test error handling with port(3C).
|
|
||||||
o) Make UnixClient and UnixServer take the SocketType as an argument to make
|
|
||||||
it possible to support both stream-orientation and datagram-orientation?
|
|
||||||
Would need to update UnixServer's API to support both models.
|
|
||||||
o) Something higher-level than Pipe which supports various disciplines and
|
|
||||||
makes it easier to write stream processing modules.
|
|
||||||
o) Make *Client::connect() work like TCPClient::connect().
|
|
||||||
o) Move to the getrusage-based Timer class and make it clear that that is what
|
|
||||||
it is for. Perhaps create a Timer base class and a UserTimer and WallTimer
|
|
||||||
for real use?
|
|
||||||
o) Add a flush token for Pipe::input() ?
|
|
||||||
o) Add a flush Event type for Pipe::output() ?
|
|
||||||
XXX It's unclear, but I think a flush method or similar may be needed to
|
|
||||||
implement buffer limiting? A flush method being like input(), except
|
|
||||||
that it only returns once the last Pipe in the Pipeline has returned
|
|
||||||
flush complete, or error if data cannot be flushed because there is not
|
|
||||||
enough to finish processing the data that is pending, at which point
|
|
||||||
you at least know that everything else has been flushed?
|
|
||||||
o) Make Pipe::input take a parameter to send EOS along with data.
|
|
||||||
o) How do we find out if remote has shut down read channel so we can stop
|
|
||||||
writing and shut down a Splice?
|
|
||||||
o) Make interface/listener objects automatically start listening.
|
|
||||||
o) Clean up address configuration objects to be more sensible, being either
|
|
||||||
specific components of addresses (e.g. to specify an IP address) or socket
|
|
||||||
addresses (e.g. AF_UNIX paths, IP+port pairs for TCP or UDP or SCTP.)
|
|
||||||
o) Connector abstraction: connection pooling / connecting via a SOCKS server.
|
|
||||||
|
|
||||||
For 0.8.0:
|
|
||||||
o) Cache hierarchy, including persistent storage.
|
|
||||||
o) TLS.
|
|
||||||
|
|
||||||
For 0.9.0:
|
|
||||||
o) Handle TCP OOB data.
|
|
||||||
|
|
||||||
After 1.0.0:
|
|
||||||
o) A CLI program for management. Remember to USE_POLL=select since Mac OS X can
|
|
||||||
only use select(2) for stdin and stdout.
|
|
||||||
o) Make it possible to detect when we are sending to a socket that is also
|
|
||||||
within WANProxy and avoid a system call -- just copy directly to the
|
|
||||||
appropriate buffer. It should be pretty easy to do this with the IO queueing
|
|
||||||
system if we getpeername/getsockname to identify this occurring.
|
|
||||||
o) Add an IO queueing system that will make it possible to use lio_listio on
|
|
||||||
systems that support it.
|
|
||||||
o) Make the XCodec encoder and decoder asynchronous.
|
|
||||||
o) Connection table. Database.
|
|
||||||
o) HTTP termination and reinitiation good enough to support an HTTP proxy mode.
|
|
||||||
|
|
||||||
Ongoing:
|
|
||||||
o) Add lots of comments.
|
|
||||||
o) Fix bugs.
|
|
||||||
o) Audit log levels.
|
|
||||||
o) Try to remove HALTs and NOTREACHEDs that aren't legitimate.
|
|
||||||
o) Give better debug information from configuration system.
|
|
||||||
|
|
||||||
Maybe:
|
|
||||||
o) A resolver that's less fragile than the OS-supplied ones. Mac OS X, at
|
|
||||||
minimum, neither keeps a pool of file descriptors nor errors out gracefully
|
|
||||||
when the OS is out of them, leading to hangs.
|
|
||||||
o) Send definitions out-of-band, too, so that QoS and backpressure on one
|
|
||||||
connection can't delay other connections.
|
|
||||||
o) In-path forwarding using BPF and a tiny network stack.
|
|
||||||
o) Run-length-encoding.
|
|
||||||
o) Many compression algorithms.
|
|
||||||
o) Allow chaining codecs.
|
|
||||||
o) SOCKS IPv6 support.
|
|
||||||
o) Some decent way to configure Pipelines.
|
|
||||||
o) Figure out a good name for a Pipeline, since Pipeline seems rubbish.
|
|
||||||
o) Merge two Pipelines.
|
|
||||||
o) Convert the SOCKS proxy server to a PipeEndpoint that merges the Pipeline
|
|
||||||
that it is connected to with a newly-created one.
|
|
||||||
o) Be less protocol-ignorant; add protocol-aware framing to WANProxy. For
|
|
||||||
example, HTTP response headers are likely to include some amount of changing
|
|
||||||
data (timestamps, etc.) so perhaps it's better to take a clean shot at the
|
|
||||||
start of the content. And perhaps it's better to convert to large chunks in
|
|
||||||
chunked encoding mode to get bigger windows of data to encode. No need to
|
|
||||||
remember the last 3 bytes of a chunk, the chunk header, and the next N bytes,
|
|
||||||
if the chunks won't be laid out the same every time. Right?
|
|
57
sample.conf
Normal file
57
sample.conf
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# Sample configuration file for WANProxy XTech v3.0
|
||||||
|
#
|
||||||
|
# Codec definition must include following cache directives:
|
||||||
|
# - cache: Memory (default) or COSS (use persistent cache in disk)
|
||||||
|
# - cache_path: location for the cache files (if using COSS)
|
||||||
|
# - local_size: size in MB for the local cache of the encoder. The decoder
|
||||||
|
# will receive this value on the other side and use it for
|
||||||
|
# its own cache, so the old parameter remote_size is no
|
||||||
|
# longer needed and should not be used any more.
|
||||||
|
#
|
||||||
|
# Proxy definition can include an additional informative parameter:
|
||||||
|
# - role: Client (originates requests) or Server. When not specified,
|
||||||
|
# a proxy taking unencoded input and writing encoded output
|
||||||
|
# is considered to be a client.
|
||||||
|
#
|
||||||
|
# Only one proxy may be defined per instance. To host several proxies
|
||||||
|
# on the same node different processes must be launched each one with
|
||||||
|
# its own configuration.
|
||||||
|
#
|
||||||
|
# Upon reception of SIGHUP the daemon will reread this file and apply the
|
||||||
|
# new values to any subsequent connections.
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
create codec codec0
|
||||||
|
set codec0.codec XCodec
|
||||||
|
set codec0.cache COSS
|
||||||
|
set codec0.cache_path "/var/lib/wanproxy"
|
||||||
|
set codec0.local_size 2048
|
||||||
|
set codec0.compressor zlib
|
||||||
|
set codec0.compressor_level 6
|
||||||
|
activate codec0
|
||||||
|
|
||||||
|
create interface if0
|
||||||
|
set if0.family IPv4
|
||||||
|
set if0.host "192.168.1.23"
|
||||||
|
set if0.port "3301"
|
||||||
|
set if0.proto TCP
|
||||||
|
activate if0
|
||||||
|
|
||||||
|
create peer peer0
|
||||||
|
set peer0.family IPv4
|
||||||
|
set peer0.host "localhost"
|
||||||
|
set peer0.port "3128"
|
||||||
|
set peer0.proto TCP
|
||||||
|
activate peer0
|
||||||
|
|
||||||
|
create proxy proxy0
|
||||||
|
set proxy0.interface if0
|
||||||
|
set proxy0.interface_codec codec0
|
||||||
|
set proxy0.peer peer0
|
||||||
|
set proxy0.peer_codec None
|
||||||
|
set proxy0.role Server
|
||||||
|
activate proxy0
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue