summaryrefslogtreecommitdiffstats
path: root/net/lapb/lapb_subr.c
blob: b827f47ac133c64f71e9934b5acc086505a88a79 (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
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
/*
 *	LAPB release 002
 *
 *	This code REQUIRES 2.1.15 or higher/ NET3.038
 *
 *	This module:
 *		This module 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.
 *
 *	History
 *	LAPB 001	Jonathan Naylor	Started Coding
 */

#include <linux/errno.h>
#include <linux/types.h>
#include <linux/socket.h>
#include <linux/in.h>
#include <linux/kernel.h>
#include <linux/timer.h>
#include <linux/string.h>
#include <linux/sockios.h>
#include <linux/net.h>
#include <linux/inet.h>
#include <linux/skbuff.h>
#include <net/sock.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include <linux/fcntl.h>
#include <linux/mm.h>
#include <linux/interrupt.h>
#include <net/lapb.h>

/*
 *	This routine purges all the queues of frames.
 */
void lapb_clear_queues(struct lapb_cb *lapb)
{
	skb_queue_purge(&lapb->write_queue);
	skb_queue_purge(&lapb->ack_queue);
}

/*
 * This routine purges the input queue of those frames that have been
 * acknowledged. This replaces the boxes labelled "V(a) <- N(r)" on the
 * SDL diagram.
 */
void lapb_frames_acked(struct lapb_cb *lapb, unsigned short nr)
{
	struct sk_buff *skb;
	int modulus;

	modulus = (lapb->mode & LAPB_EXTENDED) ? LAPB_EMODULUS : LAPB_SMODULUS;

	/*
	 * Remove all the ack-ed frames from the ack queue.
	 */
	if (lapb->va != nr)
		while (skb_peek(&lapb->ack_queue) && lapb->va != nr) {
			skb = skb_dequeue(&lapb->ack_queue);
			kfree_skb(skb);
			lapb->va = (lapb->va + 1) % modulus;
		}
}

void lapb_requeue_frames(struct lapb_cb *lapb)
{
	struct sk_buff *skb, *skb_prev = NULL;

	/*
	 * Requeue all the un-ack-ed frames on the output queue to be picked
	 * up by lapb_kick called from the timer. This arrangement handles the
	 * possibility of an empty output queue.
	 */
	while ((skb = skb_dequeue(&lapb->ack_queue)) != NULL) {
		if (!skb_prev)
			skb_queue_head(&lapb->write_queue, skb);
		else
			skb_append(skb_prev, skb, &lapb->write_queue);
		skb_prev = skb;
	}
}

/*
 *	Validate that the value of nr is between va and vs. Return true or
 *	false for testing.
 */
int lapb_validate_nr(struct lapb_cb *lapb, unsigned short nr)
{
	unsigned short vc = lapb->va;
	int modulus;

	modulus = (lapb->mode & LAPB_EXTENDED) ? LAPB_EMODULUS : LAPB_SMODULUS;

	while (vc != lapb->vs) {
		if (nr == vc)
			return 1;
		vc = (vc + 1) % modulus;
	}

	return nr == lapb->vs;
}

/*
 *	This routine is the centralised routine for parsing the control
 *	information for the different frame formats.
 */
int lapb_decode(struct lapb_cb *lapb, struct sk_buff *skb,
		struct lapb_frame *frame)
{
	frame->type = LAPB_ILLEGAL;

#if LAPB_DEBUG > 2
	printk(KERN_DEBUG "lapb: (%p) S%d RX %02X %02X %02X\n",
	       lapb->dev, lapb->state,
	       skb->data[0], skb->data[1], skb->data[2]);
#endif

	/* We always need to look at 2 bytes, sometimes we need
	 * to look at 3 and those cases are handled below.
	 */
	if (!pskb_may_pull(skb, 2))
		return -1;

	if (lapb->mode & LAPB_MLP) {
		if (lapb->mode & LAPB_DCE) {
			if (skb->data[0] == LAPB_ADDR_D)
				frame->cr = LAPB_COMMAND;
			if (skb->data[0] == LAPB_ADDR_C)
				frame->cr = LAPB_RESPONSE;
		} else {
			if (skb->data[0] == LAPB_ADDR_C)
				frame->cr = LAPB_COMMAND;
			if (skb->data[0] == LAPB_ADDR_D)
				frame->cr = LAPB_RESPONSE;
		}
	} else {
		if (lapb->mode & LAPB_DCE) {
			if (skb->data[0] == LAPB_ADDR_B)
				frame->cr = LAPB_COMMAND;
			if (skb->data[0] == LAPB_ADDR_A)
				frame->cr = LAPB_RESPONSE;
		} else {
			if (skb->data[0] == LAPB_ADDR_A)
				frame->cr = LAPB_COMMAND;
			if (skb->data[0] == LAPB_ADDR_B)
				frame->cr = LAPB_RESPONSE;
		}
	}

	skb_pull(skb, 1);

	if (lapb->mode & LAPB_EXTENDED) {
		if (!(skb->data[0] & LAPB_S)) {
			if (!pskb_may_pull(skb, 2))
				return -1;
			/*
			 * I frame - carries NR/NS/PF
			 */
			frame->type       = LAPB_I;
			frame->ns         = (skb->data[0] >> 1) & 0x7F;
			frame->nr         = (skb->data[1] >> 1) & 0x7F;
			frame->pf         = skb->data[1] & LAPB_EPF;
			frame->control[0] = skb->data[0];
			frame->control[1] = skb->data[1];
			skb_pull(skb, 2);
		} else if ((skb->data[0] & LAPB_U) == 1) {
			if (!pskb_may_pull(skb, 2))
				return -1;
			/*
			 * S frame - take out PF/NR
			 */
			frame->type       = skb->data[0] & 0x0F;
			frame->nr         = (skb->data[1] >> 1) & 0x7F;
			frame->pf         = skb->data[1] & LAPB_EPF;
			frame->control[0] = skb->data[0];
			frame->control[1] = skb->data[1];
			skb_pull(skb, 2);
		} else if ((skb->data[0] & LAPB_U) == 3) {
			/*
			 * U frame - take out PF
			 */
			frame->type       = skb->data[0] & ~LAPB_SPF;
			frame->pf         = skb->data[0] & LAPB_SPF;
			frame->control[0] = skb->data[0];
			frame->control[1] = 0x00;
			skb_pull(skb, 1);
		}
	} else {
		if (!(skb->data[0] & LAPB_S)) {
			/*
			 * I frame - carries NR/NS/PF
			 */
			frame->type = LAPB_I;
			frame->ns   = (skb->data[0] >> 1) & 0x07;
			frame->nr   = (skb->data[0] >> 5) & 0x07;
			frame->pf   = skb->data[0] & LAPB_SPF;
		} else if ((skb->data[0] & LAPB_U) == 1) {
			/*
			 * S frame - take out PF/NR
			 */
			frame->type = skb->data[0] & 0x0F;
			frame->nr   = (skb->data[0] >> 5) & 0x07;
			frame->pf   = skb->data[0] & LAPB_SPF;
		} else if ((skb->data[0] & LAPB_U) == 3) {
			/*
			 * U frame - take out PF
			 */
			frame->type = skb->data[0] & ~LAPB_SPF;
			frame->pf   = skb->data[0] & LAPB_SPF;
		}

		frame->control[0] = skb->data[0];

		skb_pull(skb, 1);
	}

	return 0;
}

/*
 *	This routine is called when the HDLC layer internally  generates a
 *	command or  response  for  the remote machine ( eg. RR, UA etc. ).
 *	Only supervisory or unnumbered frames are processed, FRMRs are handled
 *	by lapb_transmit_frmr below.
 */
void lapb_send_control(struct lapb_cb *lapb, int frametype,
		       int poll_bit, int type)
{
	struct sk_buff *skb;
	unsigned char  *dptr;

	if ((skb = alloc_skb(LAPB_HEADER_LEN + 3, GFP_ATOMIC)) == NULL)
		return;

	skb_reserve(skb, LAPB_HEADER_LEN + 1);

	if (lapb->mode & LAPB_EXTENDED) {
		if ((frametype & LAPB_U) == LAPB_U) {
			dptr   = skb_put(skb, 1);
			*dptr  = frametype;
			*dptr |= poll_bit ? LAPB_SPF : 0;
		} else {
			dptr     = skb_put(skb, 2);
			dptr[0]  = frametype;
			dptr[1]  = (lapb->vr << 1);
			dptr[1] |= poll_bit ? LAPB_EPF : 0;
		}
	} else {
		dptr   = skb_put(skb, 1);
		*dptr  = frametype;
		*dptr |= poll_bit ? LAPB_SPF : 0;
		if ((frametype & LAPB_U) == LAPB_S)	/* S frames carry NR */
			*dptr |= (lapb->vr << 5);
	}

	lapb_transmit_buffer(lapb, skb, type);
}

/*
 *	This routine generates FRMRs based on information previously stored in
 *	the LAPB control block.
 */
void lapb_transmit_frmr(struct lapb_cb *lapb)
{
	struct sk_buff *skb;
	unsigned char  *dptr;

	if ((skb = alloc_skb(LAPB_HEADER_LEN + 7, GFP_ATOMIC)) == NULL)
		return;

	skb_reserve(skb, LAPB_HEADER_LEN + 1);

	if (lapb->mode & LAPB_EXTENDED) {
		dptr    = skb_put(skb, 6);
		*dptr++ = LAPB_FRMR;
		*dptr++ = lapb->frmr_data.control[0];
		*dptr++ = lapb->frmr_data.control[1];
		*dptr++ = (lapb->vs << 1) & 0xFE;
		*dptr   = (lapb->vr << 1) & 0xFE;
		if (lapb->frmr_data.cr == LAPB_RESPONSE)
			*dptr |= 0x01;
		dptr++;
		*dptr++ = lapb->frmr_type;

#if LAPB_DEBUG > 1
	printk(KERN_DEBUG "lapb: (%p) S%d TX FRMR %02X %02X %02X %02X %02X\n",
	       lapb->dev, lapb->state,
	       skb->data[1], skb->data[2], skb->data[3],
	       skb->data[4], skb->data[5]);
#endif
	} else {
		dptr    = skb_put(skb, 4);
		*dptr++ = LAPB_FRMR;
		*dptr++ = lapb->frmr_data.control[0];
		*dptr   = (lapb->vs << 1) & 0x0E;
		*dptr  |= (lapb->vr << 5) & 0xE0;
		if (lapb->frmr_data.cr == LAPB_RESPONSE)
			*dptr |= 0x10;
		dptr++;
		*dptr++ = lapb->frmr_type;

#if LAPB_DEBUG > 1
	printk(KERN_DEBUG "lapb: (%p) S%d TX FRMR %02X %02X %02X\n",
	       lapb->dev, lapb->state, skb->data[1],
	       skb->data[2], skb->data[3]);
#endif
	}

	lapb_transmit_buffer(lapb, skb, LAPB_RESPONSE);
}
pan class="hl opt">(SECURITY_DOMAIN_TYPE); securityDomainUri = form.getFirst(SECURITY_DOMAIN_URI); securityDomainName = form.getFirst(SECURITY_DOMAIN_NAME); securityDomainUser = form.getFirst(SECURITY_DOMAIN_USER); securityDomainPassword = form.getFirst(SECURITY_DOMAIN_PASSWORD); isClone = form.getFirst(IS_CLONE); cloneUri = form.getFirst(CLONE_URI); subsystemName = form.getFirst(SUBSYSTEM_NAME); p12File = form.getFirst(P12_FILE); p12Password = form.getFirst(P12_PASSWORD); hierarchy = form.getFirst(HIERARCHY); dsHost = form.getFirst(DSHOST); dsPort = form.getFirst(DSPORT); baseDN = form.getFirst(BASEDN); bindDN = form.getFirst(BINDDN); database = form.getFirst(DATABASE); secureConn = form.getFirst(SECURECONN); removeData = form.getFirst(REMOVEDATA); masterReplicationPort = form.getFirst(MASTER_REPLICATION_PORT); cloneReplicationPort = form.getFirst(CLONE_REPLICATION_PORT); replicationSecurity = form.getFirst(REPLICATION_SECURITY); //TODO - figure out how to get the cert requests issuingCA = form.getFirst(ISSUING_CA); backupFile = form.getFirst(BACKUP_FILE); backupPassword = form.getFirst(BACKUP_PASSWORD); backupKeys = form.getFirst(BACKUP_KEYS); adminUID = form.getFirst(ADMIN_UID); adminEmail = form.getFirst(ADMIN_EMAIL); adminPassword = form.getFirst(ADMIN_PASSWORD); adminCertRequest = form.getFirst(ADMIN_CERT_REQUEST); adminCertRequestType = form.getFirst(ADMIN_CERT_REQUEST_TYPE); adminSubjectDN = form.getFirst(ADMIN_SUBJECT_DN); adminName = form.getFirst(ADMIN_NAME); adminProfileID = form.getFirst(ADMIN_PROFILE_ID); stepTwo = form.getFirst(STEP_TWO); } public String getSubsystemName() { return subsystemName; } public void setSubsystemName(String subsystemName) { this.subsystemName = subsystemName; } public String getPin() { return pin; } public void setPin(String pin) { this.pin = pin; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public String getSecurityDomainType() { return securityDomainType; } public void setSecurityDomainType(String securityDomainType) { this.securityDomainType = securityDomainType; } public String getSecurityDomainUri() { return securityDomainUri; } public void setSecurityDomainUri(String securityDomainUri) { this.securityDomainUri = securityDomainUri; } public String getSecurityDomainName() { return securityDomainName; } public void setSecurityDomainName(String securityDomainName) { this.securityDomainName = securityDomainName; } public String getSecurityDomainUser() { return securityDomainUser; } public void setSecurityDomainUser(String securityDomainUser) { this.securityDomainUser = securityDomainUser; } public String getSecurityDomainPassword() { return securityDomainPassword; } public void setSecurityDomainPassword(String securityDomainPassword) { this.securityDomainPassword = securityDomainPassword; } public String getIsClone() { return isClone; } public void setIsClone(String isClone) { this.isClone = isClone; } public String getCloneUri() { return cloneUri; } public void setCloneUri(String cloneUri) { this.cloneUri = cloneUri; } /** * @return the p12File */ public String getP12File() { return p12File; } /** * @param p12File the p12File to set */ public void setP12File(String p12File) { this.p12File = p12File; } /** * @return the p12Password */ public String getP12Password() { return p12Password; } /** * @param p12Password the p12Password to set */ public void setP12Password(String p12Password) { this.p12Password = p12Password; } /** * @return the tokenPassword */ public String getTokenPassword() { return tokenPassword; } /** * @param tokenPassword the tokenPassword to set */ public void setTokenPassword(String tokenPassword) { this.tokenPassword = tokenPassword; } /** * @return the hierarchy */ public String getHierarchy() { return hierarchy; } /** * @param hierarchy the hierarchy to set */ public void setHierarchy(String hierarchy) { this.hierarchy = hierarchy; } /** * @return the dsHost */ public String getDsHost() { return dsHost; } /** * @param dsHost the dsHost to set */ public void setDsHost(String dsHost) { this.dsHost = dsHost; } /** * @return the dsPort */ public String getDsPort() { return dsPort; } /** * @param dsPort the dsPort to set */ public void setDsPort(String dsPort) { this.dsPort = dsPort; } /** * @return the baseDN */ public String getBaseDN() { return baseDN; } /** * @param baseDN the baseDN to set */ public void setBaseDN(String baseDN) { this.baseDN = baseDN; } /** * @return the bindDN */ public String getBindDN() { return bindDN; } /** * @param bindDN the bindDN to set */ public void setBindDN(String bindDN) { this.bindDN = bindDN; } /** * @return the bindpwd */ public String getBindpwd() { return bindpwd; } /** * @param bindpwd the bindpwd to set */ public void setBindpwd(String bindpwd) { this.bindpwd = bindpwd; } /** * @return the secureConn */ public String getSecureConn() { return secureConn; } /** * @param secureConn the secureConn to set */ public void setSecureConn(String secureConn) { this.secureConn = secureConn; } /** * @return the removeData */ public String getRemoveData() { return removeData; } /** * @param removeData the removeData to set */ public void setRemoveData(String removeData) { this.removeData = removeData; } /** * @return the masterReplicationPort */ public String getMasterReplicationPort() { return masterReplicationPort; } /** * @param masterReplicationPort the masterReplicationPort to set */ public void setMasterReplicationPort(String masterReplicationPort) { this.masterReplicationPort = masterReplicationPort; } /** * @return the cloneReplicationPort */ public String getCloneReplicationPort() { return cloneReplicationPort; } /** * @param cloneReplicationPort the cloneReplicationPort to set */ public void setCloneReplicationPort(String cloneReplicationPort) { this.cloneReplicationPort = cloneReplicationPort; } /** * @return the replicationSecurity */ public String getReplicationSecurity() { return replicationSecurity; } /** * @param replicationSecurity the replicationSecurity to set */ public void setReplicationSecurity(String replicationSecurity) { this.replicationSecurity = replicationSecurity; } /** * @return the database */ public String getDatabase() { return database; } /** * @param database the database to set */ public void setDatabase(String database) { this.database = database; } /** * * @return systemCerts */ public Collection<SystemCertData> getSystemCerts() { return systemCerts; } /** * * @param systemCerts */ public void setSystemCerts(Collection<SystemCertData> systemCerts) { this.systemCerts = systemCerts; } /** * @return the issuingCA */ public String getIssuingCA() { return issuingCA; } /** * @param issuingCA the issuingCA to set */ public void setIssuingCA(String issuingCA) { this.issuingCA = issuingCA; } /** * @return the backupKeys */ public String getBackupKeys() { return backupKeys; } /** * @param backupKeys the backupKeys to set */ public void setBackupKeys(String backupKeys) { this.backupKeys = backupKeys; } /** * @return the backupFile */ public String getBackupFile() { return backupFile; } /** * @param backupFile the backupFile to set */ public void setBackupFile(String backupFile) { this.backupFile = backupFile; } /** * @return the backupPassword */ public String getBackupPassword() { return backupPassword; } /** * @param backupPassword the backupPassword to set */ public void setBackupPassword(String backupPassword) { this.backupPassword = backupPassword; } /** * @return the adminUID */ public String getAdminUID() { return adminUID; } /** * @param adminUID the adminUID to set */ public void setAdminUID(String adminUID) { this.adminUID = adminUID; } /** * @return the adminPassword */ public String getAdminPassword() { return adminPassword; } /** * @param adminPassword the adminPassword to set */ public void setAdminPassword(String adminPassword) { this.adminPassword = adminPassword; } /** * @return the adminEmail */ public String getAdminEmail() { return adminEmail; } /** * @param adminEmail the adminEmail to set */ public void setAdminEmail(String adminEmail) { this.adminEmail = adminEmail; } /** * @return the adminCertRequest */ public String getAdminCertRequest() { return adminCertRequest; } /** * @param adminCertRequest the adminCertRequest to set */ public void setAdminCertRequest(String adminCertRequest) { this.adminCertRequest = adminCertRequest; } /** * @return the adminCertRequestType */ public String getAdminCertRequestType() { return adminCertRequestType; } /** * @param adminCertRequestType the adminCertRequestType to set */ public void setAdminCertRequestType(String adminCertRequestType) { this.adminCertRequestType = adminCertRequestType; } /** * @return the adminSubjectDN */ public String getAdminSubjectDN() { return adminSubjectDN; } /** * @param adminSubjectDN the adminSubjectDN to set */ public void setAdminSubjectDN(String adminSubjectDN) { this.adminSubjectDN = adminSubjectDN; } /** * @return the adminName */ public String getAdminName() { return adminName; } /** * @param adminName the adminName to set */ public void setAdminName(String adminName) { this.adminName = adminName; } /** * @return the adminProfileID */ public String getAdminProfileID() { return adminProfileID; } /** * @param adminProfileID the adminProfileID to set */ public void setAdminProfileID(String adminProfileID) { this.adminProfileID = adminProfileID; } public String getStepTwo() { return stepTwo; } public void setStepTwo(String stepTwo) { this.stepTwo = stepTwo; } }