aboutsummaryrefslogtreecommitdiffstats
path: root/ncpd/link.h
blob: e8b2386d781d2b1b7307165e84d3e55655424b69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/*-*-c++-*-
 * $Id$
 *
 * This file is part of plptools.
 *
 *  Copyright (C) 1999  Philip Proudman <philip.proudman@btinternet.com>
 *  Copyright (C) 1999-2002 Fritz Elfert <felfert@to.com>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */
#ifndef _link_h_
#define _link_h_

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <pthread.h>
#include <sys/time.h>

#include "bufferstore.h"
#include "bufferarray.h"
#include "Enum.h"
#include <vector>

#define LNK_DEBUG_LOG  4
#define LNK_DEBUG_DUMP 8

class ncp;
class packet;

/**
 * Describes a transmitted packet which has not yet
 * been acknowledged by the peer.
 */
typedef struct {
    /**
     * Original sequence number.
     */
    int seq;
    /**
     * Number of remaining transmit retries.
     */
    int txcount;
    /**
     * Time of last transmit.
     */
    struct timeval stamp;
    /**
     * Packet content.
     */
    bufferStore data;
} ackWaitQueueElement;

extern "C" {
    static void *expire_check(void *);
}

class Link {
public:

    enum link_type {
	LINK_TYPE_UNKNOWN = 0,
	LINK_TYPE_SIBO    = 1,
	LINK_TYPE_EPOC    = 2,
    };

    /**
     * Construct a new link instance.
     *
     * @param fname Name of serial device.
     * @param baud  Speed of serial device.
     * @param ncp   The calling ncp instance.
     * @_verbose    Verbosity (for debugging/troubleshooting)
     */
    Link(const char *fname, int baud, ncp *_ncp, unsigned short _verbose = 0);

    /**
     * Disconnects from device and destroys instance.
     */
    ~Link();

    /**
     * Send a PLP packet to the Peer.
     *
     * @param buff The contents of the PLP packet.
     */
    void send(const bufferStore &buff);

    /**
     * Query outstanding packets.
     *
     * @returns true, if packets are outstanding (not yet acknowledged), false
     *  otherwise.
     */
    bool stuffToSend();

    /**
     * Query connection failure.
     *
     * @returns true, if the peer could not be contacted or did not response,
     *  false if everything is ok.
     */
    bool hasFailed();

    /**
     * Reset connection and attempt to reconnect to the peer.
     */
    void reset();

    /**
     * Wait, until all outstanding packets are acknowledged or timed out.
     */
    void flush();

    /**
     * Purge all outstanding packets for a specified remote channel.
     *
     * @param channel The of the channel for which to remove outstanding
     *  packets.
     */
    void purgeQueue(int channel);

    /**
     * Set verbosity of Link and underlying packet instance.
     *
     * @param _verbose Verbosity (a bitmapped value, see LINK_DEBUG_.. constants)
     */
    void setVerbose(unsigned short _verbose);

    /**
     * Get current verbosity of Link.
     *
     * @returns The verbosity, specified at construction or last call to
     *  setVerbosity();
     */
    unsigned short getVerbose();

    /**
     * Get the current link type.
     *
     * @returns One of LINK_TYPE_... values.
     */
    Enum<link_type> getLinkType();

    /**
     * Get current speed of the serial device
     *
     * @returns The current speed in baud.
     */
    int getSpeed();

private:
    friend class packet;
    friend void * expire_check(void *);

    void receive(bufferStore buf);
    void transmit(bufferStore buf);
    void sendAck(int seq);
    void sendReqReq();
    void sendReqCon();
    void sendReq();
    void multiAck(struct timeval);
    void retransmit();
    void transmitHoldQueue(int channel);
    void transmitWaitQueue();
    void purgeAllQueues();
    unsigned long retransTimeout();

    pthread_t checkthread;
    pthread_mutex_t queueMutex;

    ncp *theNCP;
    packet *p;
    int txSequence;
    int rxSequence;
    int seqMask;
    int maxOutstanding;
    unsigned long conMagic;
    unsigned short verbose;
    bool failed;
    Enum<link_type> linkType;

    std::vector<ackWaitQueueElement> ackWaitQueue;
    std::vector<bufferStore> holdQueue;
    std::vector<bufferStore> waitQueue;
    bool xoff[256];
};

#endif

/*
 * Local variables:
 * c-basic-offset: 4
 * End:
 */