diff -r 000000000000 -r 2b3e5ec03512 servlib/conv_layers/SerialConvergenceLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servlib/conv_layers/SerialConvergenceLayer.h Thu Apr 21 14:57:45 2011 +0100 @@ -0,0 +1,154 @@ +/* + * Copyright 2004-2006 Intel Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SERIAL_CONVERGENCE_LAYER_H_ +#define _SERIAL_CONVERGENCE_LAYER_H_ + +#include +#include + +#include "StreamConvergenceLayer.h" + +namespace dtn { + +/** + * The Serial Convergence Layer. + */ +class SerialConvergenceLayer : public StreamConvergenceLayer { +public: + /** + * Current version of the protocol. + */ + static const u_int8_t SERIALCL_VERSION = 0x01; + + /** + * Byte sent on the wire to synchronize the two ends. + */ + static const u_char SYNC = '.'; + + /** + * Constructor. + */ + SerialConvergenceLayer(); + + /** + * Tunable link parameter structure. + */ + class SerialLinkParams : public StreamLinkParams { + public: + bool hexdump_; ///< Log a hexdump of all traffic + std::string initstr_; ///< String to initialize the tty + u_int ispeed_; ///< Input speed on the tty + u_int ospeed_; ///< Output speed on the tty + u_int sync_interval_; ///< Interval to send initial sync bits + + protected: + // See comment in LinkParams for why this is protected + SerialLinkParams(bool init_defaults); + friend class SerialConvergenceLayer; + }; + + /** + * Default link parameters. + */ + static SerialLinkParams default_link_params_; + +protected: + /// @{ Virtual from ConvergenceLayer + bool set_link_defaults(int argc, const char* argv[], + const char** invalidp); + void dump_link(const LinkRef& link, oasys::StringBuffer* buf); + /// @} + + /// @{ Virtual from ConnectionConvergenceLayer + virtual LinkParams* new_link_params(); + virtual bool parse_link_params(LinkParams* params, + int argc, const char** argv, + const char** invalidp); + virtual bool parse_nexthop(const LinkRef& link, LinkParams* params); + virtual CLConnection* new_connection(const LinkRef& link, + LinkParams* params); + /// @} + + /** + * Helper class (and thread) that manages an established + * connection with a peer daemon. + * + * Although the same class is used in both cases, a particular + * Connection is either a receiver or a sender, as indicated by + * the direction variable. Note that to deal with NAT, the side + * which does the active connect is not necessarily the sender. + */ + class Connection : public StreamConvergenceLayer::Connection { + public: + /** + * Constructor for a connection. + */ + Connection(SerialConvergenceLayer* cl, + const LinkRef& link, + SerialLinkParams* params); + + /** + * Destructor. + */ + virtual ~Connection(); + + /** + * Virtual from SerializableObject + */ + virtual void serialize(oasys::SerializeAction *a); + + protected: + friend class SerialConvergenceLayer; + + /// @{ Virtual from CLConnection + virtual void connect(); + virtual void disconnect(); + virtual void initialize_pollfds(); + virtual void handle_poll_timeout(); + virtual void handle_poll_activity(); + /// @} + + /// @{ virtual from StreamConvergenceLayer::Connection + void send_data(); + /// @} + + /// Hook for handle_poll_activity to receive data + void recv_data(); + + /// Send a sync byte + void send_sync(); + + /** + * Utility function to downcast the params_ pointer that's + * stored in the CLConnection parent class. + */ + SerialLinkParams* serial_lparams() + { + SerialLinkParams* ret = dynamic_cast(params_); + ASSERT(ret != NULL); + return ret; + } + + oasys::TTY* tty_; ///< The tty + struct pollfd* tty_pollfd_; ///< Poll structure for the tty + bool synced_; ///< Whether the SYNC has completed + }; +}; + +} // namespace dtn + +#endif /* _SERIAL_CONVERGENCE_LAYER_H_ */