Linux Audio

Check our new training course

Loading...
v3.5.6
 
  1#ifndef __UM_SLIP_COMMON_H
  2#define __UM_SLIP_COMMON_H
  3
  4#define BUF_SIZE 1500
  5 /* two bytes each for a (pathological) max packet of escaped chars +  *
  6  * terminating END char + initial END char                            */
  7#define ENC_BUF_SIZE (2 * BUF_SIZE + 2)
  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, unsigned char *buf, int *pos,
 16                             int *esc)
 17{
 18	int ret;
 19
 20	switch(c){
 21	case SLIP_END:
 22		*esc = 0;
 23		ret=*pos;
 24		*pos=0;
 25		return(ret);
 26	case SLIP_ESC:
 27		*esc = 1;
 28		return(0);
 29	case SLIP_ESC_ESC:
 30		if(*esc){
 31			*esc = 0;
 32			c = SLIP_ESC;
 33		}
 34		break;
 35	case SLIP_ESC_END:
 36		if(*esc){
 37			*esc = 0;
 38			c = SLIP_END;
 39		}
 40		break;
 41	}
 42	buf[(*pos)++] = c;
 43	return(0);
 44}
 45
 46static inline int slip_esc(unsigned char *s, unsigned char *d, int len)
 47{
 48	unsigned char *ptr = d;
 49	unsigned char c;
 50
 51	/*
 52	 * Send an initial END character to flush out any
 53	 * data that may have accumulated in the receiver
 54	 * due to line noise.
 55	 */
 56
 57	*ptr++ = SLIP_END;
 58
 59	/*
 60	 * For each byte in the packet, send the appropriate
 61	 * character sequence, according to the SLIP protocol.
 62	 */
 63
 64	while (len-- > 0) {
 65		switch(c = *s++) {
 66		case SLIP_END:
 67			*ptr++ = SLIP_ESC;
 68			*ptr++ = SLIP_ESC_END;
 69			break;
 70		case SLIP_ESC:
 71			*ptr++ = SLIP_ESC;
 72			*ptr++ = SLIP_ESC_ESC;
 73			break;
 74		default:
 75			*ptr++ = c;
 76			break;
 77		}
 78	}
 79	*ptr++ = SLIP_END;
 80	return (ptr - d);
 81}
 82
 83struct slip_proto {
 84	unsigned char ibuf[ENC_BUF_SIZE];
 85	unsigned char obuf[ENC_BUF_SIZE];
 86	int more; /* more data: do not read fd until ibuf has been drained */
 87	int pos;
 88	int esc;
 89};
 90
 91static inline void slip_proto_init(struct slip_proto * slip)
 92{
 93	memset(slip->ibuf, 0, sizeof(slip->ibuf));
 94	memset(slip->obuf, 0, sizeof(slip->obuf));
 95	slip->more = 0;
 96	slip->pos = 0;
 97	slip->esc = 0;
 98}
 99
100extern int slip_proto_read(int fd, void *buf, int len,
101			   struct slip_proto *slip);
102extern int slip_proto_write(int fd, void *buf, int len,
103			    struct slip_proto *slip);
104
105#endif
v6.2
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef __UM_SLIP_COMMON_H
  3#define __UM_SLIP_COMMON_H
  4
  5#define BUF_SIZE 1500
  6 /* two bytes each for a (pathological) max packet of escaped chars +  *
  7  * terminating END char + initial END char                            */
  8#define ENC_BUF_SIZE (2 * BUF_SIZE + 2)
  9
 10/* SLIP protocol characters. */
 11#define SLIP_END             0300	/* indicates end of frame	*/
 12#define SLIP_ESC             0333	/* indicates byte stuffing	*/
 13#define SLIP_ESC_END         0334	/* ESC ESC_END means END 'data'	*/
 14#define SLIP_ESC_ESC         0335	/* ESC ESC_ESC means ESC 'data'	*/
 15
 16static inline int slip_unesc(unsigned char c, unsigned char *buf, int *pos,
 17                             int *esc)
 18{
 19	int ret;
 20
 21	switch(c){
 22	case SLIP_END:
 23		*esc = 0;
 24		ret=*pos;
 25		*pos=0;
 26		return(ret);
 27	case SLIP_ESC:
 28		*esc = 1;
 29		return(0);
 30	case SLIP_ESC_ESC:
 31		if(*esc){
 32			*esc = 0;
 33			c = SLIP_ESC;
 34		}
 35		break;
 36	case SLIP_ESC_END:
 37		if(*esc){
 38			*esc = 0;
 39			c = SLIP_END;
 40		}
 41		break;
 42	}
 43	buf[(*pos)++] = c;
 44	return(0);
 45}
 46
 47static inline int slip_esc(unsigned char *s, unsigned char *d, int len)
 48{
 49	unsigned char *ptr = d;
 50	unsigned char c;
 51
 52	/*
 53	 * Send an initial END character to flush out any
 54	 * data that may have accumulated in the receiver
 55	 * due to line noise.
 56	 */
 57
 58	*ptr++ = SLIP_END;
 59
 60	/*
 61	 * For each byte in the packet, send the appropriate
 62	 * character sequence, according to the SLIP protocol.
 63	 */
 64
 65	while (len-- > 0) {
 66		switch(c = *s++) {
 67		case SLIP_END:
 68			*ptr++ = SLIP_ESC;
 69			*ptr++ = SLIP_ESC_END;
 70			break;
 71		case SLIP_ESC:
 72			*ptr++ = SLIP_ESC;
 73			*ptr++ = SLIP_ESC_ESC;
 74			break;
 75		default:
 76			*ptr++ = c;
 77			break;
 78		}
 79	}
 80	*ptr++ = SLIP_END;
 81	return (ptr - d);
 82}
 83
 84struct slip_proto {
 85	unsigned char ibuf[ENC_BUF_SIZE];
 86	unsigned char obuf[ENC_BUF_SIZE];
 87	int more; /* more data: do not read fd until ibuf has been drained */
 88	int pos;
 89	int esc;
 90};
 91
 92static inline void slip_proto_init(struct slip_proto * slip)
 93{
 94	memset(slip->ibuf, 0, sizeof(slip->ibuf));
 95	memset(slip->obuf, 0, sizeof(slip->obuf));
 96	slip->more = 0;
 97	slip->pos = 0;
 98	slip->esc = 0;
 99}
100
101extern int slip_proto_read(int fd, void *buf, int len,
102			   struct slip_proto *slip);
103extern int slip_proto_write(int fd, void *buf, int len,
104			    struct slip_proto *slip);
105
106#endif