blob: ec98eacf16d2598c86bac10b082a071f50392c63 (
plain) (
blame)
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
|
#ifndef NETLIB_H
#define NETLIB_H
/* SLIP (RFC 1055) framing over the link port. Header-only so each program gets
its own copy (the C build links one translation unit per program). */
#include "gbos.h"
#define SLIP_END 0xC0
#define SLIP_ESC 0xDB
#define SLIP_ESC_END 0xDC
#define SLIP_ESC_ESC 0xDD
/* send a framed packet (len up to 255) */
static void slip_send(const char *buf, unsigned char len) {
unsigned char i, c;
ssend(SLIP_END);
for (i = 0; i < len; i++) {
c = (unsigned char)buf[i];
if (c == SLIP_END) { ssend(SLIP_ESC); ssend(SLIP_ESC_END); }
else if (c == SLIP_ESC) { ssend(SLIP_ESC); ssend(SLIP_ESC_ESC); }
else ssend(c);
}
ssend(SLIP_END);
}
/* receive one framed packet into buf (max), returns its length */
static unsigned char slip_recv(char *buf, unsigned char max) {
unsigned char len = 0, c;
for (;;) {
c = srecv();
if (c == SLIP_END) { if (len) return len; continue; }
if (c == SLIP_ESC) {
c = srecv();
if (c == SLIP_ESC_END) c = SLIP_END;
else if (c == SLIP_ESC_ESC) c = SLIP_ESC;
}
if (len < max) buf[len++] = (char)c;
}
}
#endif
|