aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/drivers/slip_proto.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/drivers/slip_proto.h')
-rw-r--r--arch/um/drivers/slip_proto.h93
1 files changed, 93 insertions, 0 deletions
diff --git a/arch/um/drivers/slip_proto.h b/arch/um/drivers/slip_proto.h
new file mode 100644
index 000000000000..7206361ace45
--- /dev/null
+++ b/arch/um/drivers/slip_proto.h
@@ -0,0 +1,93 @@
1/*
2 * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
3 * Licensed under the GPL
4 */
5
6#ifndef __UM_SLIP_PROTO_H__
7#define __UM_SLIP_PROTO_H__
8
9/* SLIP protocol characters. */
10#define SLIP_END 0300 /* indicates end of frame */
11#define SLIP_ESC 0333 /* indicates byte stuffing */
12#define SLIP_ESC_END 0334 /* ESC ESC_END means END 'data' */
13#define SLIP_ESC_ESC 0335 /* ESC ESC_ESC means ESC 'data' */
14
15static inline int slip_unesc(unsigned char c,char *buf,int *pos, int *esc)
16{
17 int ret;
18
19 switch(c){
20 case SLIP_END:
21 *esc = 0;
22 ret=*pos;
23 *pos=0;
24 return(ret);
25 case SLIP_ESC:
26 *esc = 1;
27 return(0);
28 case SLIP_ESC_ESC:
29 if(*esc){
30 *esc = 0;
31 c = SLIP_ESC;
32 }
33 break;
34 case SLIP_ESC_END:
35 if(*esc){
36 *esc = 0;
37 c = SLIP_END;
38 }
39 break;
40 }
41 buf[(*pos)++] = c;
42 return(0);
43}
44
45static inline int slip_esc(unsigned char *s, unsigned char *d, int len)
46{
47 unsigned char *ptr = d;
48 unsigned char c;
49
50 /*
51 * Send an initial END character to flush out any
52 * data that may have accumulated in the receiver
53 * due to line noise.
54 */
55
56 *ptr++ = SLIP_END;
57
58 /*
59 * For each byte in the packet, send the appropriate
60 * character sequence, according to the SLIP protocol.
61 */
62
63 while (len-- > 0) {
64 switch(c = *s++) {
65 case SLIP_END:
66 *ptr++ = SLIP_ESC;
67 *ptr++ = SLIP_ESC_END;
68 break;
69 case SLIP_ESC:
70 *ptr++ = SLIP_ESC;
71 *ptr++ = SLIP_ESC_ESC;
72 break;
73 default:
74 *ptr++ = c;
75 break;
76 }
77 }
78 *ptr++ = SLIP_END;
79 return (ptr - d);
80}
81
82#endif
83
84/*
85 * Overrides for Emacs so that we follow Linus's tabbing style.
86 * Emacs will notice this stuff at the end of the file and automatically
87 * adjust the settings for this buffer only. This must remain at the end
88 * of the file.
89 * ---------------------------------------------------------------------------
90 * Local variables:
91 * c-file-style: "linux"
92 * End:
93 */