GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.sbin/npppd/npppd/../l2tp/l2tp_subr.h Lines: 0 11 0.0 %
Date: 2017-11-07 Branches: 0 0 0.0 %

Line Branch Exec Source
1
/*	$OpenBSD: l2tp_subr.h,v 1.6 2013/09/20 07:26:23 yasuoka Exp $	*/
2
3
/*-
4
 * Copyright (c) 2009 Internet Initiative Japan Inc.
5
 * All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions
9
 * are met:
10
 * 1. Redistributions of source code must retain the above copyright
11
 *    notice, this list of conditions and the following disclaimer.
12
 * 2. Redistributions in binary form must reproduce the above copyright
13
 *    notice, this list of conditions and the following disclaimer in the
14
 *    documentation and/or other materials provided with the distribution.
15
 *
16
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26
 * SUCH DAMAGE.
27
 */
28
#ifndef	L2TP_SUBR_H
29
#define	L2TP_SUBR_H	1
30
/* $Id: l2tp_subr.h,v 1.6 2013/09/20 07:26:23 yasuoka Exp $ */
31
32
/**
33
 * structure of L2TP Attribute Value Pair (AVP) packet header
34
 */
35
struct l2tp_avp
36
{
37
#if	BYTE_ORDER == LITTLE_ENDIAN
38
	uint16_t	length:10,
39
			rsvd:4,
40
			is_hidden:1,
41
			is_mandatory:1;
42
#else
43
	uint16_t	is_mandatory:1,
44
			is_hidden:1,
45
			rsvd:4,
46
			length:10;
47
#endif
48
	uint16_t	vendor_id;
49
	uint16_t	attr_type;
50
	u_char 		attr_value[0];
51
} __attribute__((__packed__)) ;
52
53
#define	avp_attr_length(avp)	((avp)->length - 6)
54
55
static inline uint16_t
56
avp_get_val16(struct l2tp_avp *avp)
57
{
58
	return (avp->attr_value[0] << 8) | avp->attr_value[1];
59
}
60
static inline uint32_t
61
avp_get_val32(struct l2tp_avp *avp)
62
{
63
	return (avp->attr_value[0] << 24) | (avp->attr_value[1] << 16) |
64
		(avp->attr_value[2] << 8) | avp->attr_value[3];
65
}
66
67
static inline void
68
avp_set_val16(struct l2tp_avp *avp, uint16_t val)
69
{
70
	avp->attr_value[0] = val >> 8;
71
	avp->attr_value[1] = val & 0xff;
72
}
73
74
static inline void
75
avp_set_val32(struct l2tp_avp *avp, uint32_t val)
76
{
77
	avp->attr_value[0] = val >> 24;
78
	avp->attr_value[1] = val >> 16;
79
	avp->attr_value[2] = val >> 8;
80
	avp->attr_value[3] = val & 0xff;
81
}
82
83
static inline int
84
short_cmp(const void *m, const void *n)
85
{
86
	return ((intptr_t)m - (intptr_t)n);
87
}
88
89
static inline uint32_t
90
short_hash(const void *v, int sz)
91
{
92
	return ((uintptr_t)v % sz);
93
}
94
95
/*
96
 * macro to check AVP size.
97
 * Prepare 1) char array `emes' for error message, 2) size_check_failed label
98
 * before use this macro.
99
 */
100
#define	AVP_SIZE_CHECK(_avp, _op, _exp)					\
101
	do {								\
102
		if (!((_avp)->length _op (_exp))) {			\
103
			snprintf(emes, sizeof(emes),			\
104
			    "invalid packet size %s %d" #_op "%d)",	\
105
			    avp_attr_type_string((_avp)->attr_type),	\
106
			    (_avp)->length, (_exp));			\
107
			goto size_check_failed;				\
108
		}							\
109
	} while (/* CONSTCOND */0)
110
#define AVP_MAXLEN_CHECK(_avp, _maxlen)					\
111
	do {								\
112
		if ((_avp)->length > (_maxlen) + 6) {			\
113
			snprintf(emes, sizeof(emes),			\
114
			    "Attribute value is too long %s %d > %d",	\
115
			    avp_attr_type_string((_avp)->attr_type),	\
116
			    (_avp)->length - 6, (int)(_maxlen));	\
117
			goto size_check_failed;				\
118
		}							\
119
	} while (/* CONSTCOND */0)
120
121
#ifdef __cplusplus
122
extern "C" {
123
#endif
124
125
int              avp_enum (struct l2tp_avp *, const u_char *, int, int);
126
const char       *avp_attr_type_string (int);
127
struct l2tp_avp  *avp_find_message_type_avp(struct l2tp_avp *, const u_char *, int);
128
struct l2tp_avp  *avp_find(struct l2tp_avp *, const u_char *, int, uint16_t, uint16_t, int);
129
int              bytebuf_add_avp (bytebuffer *, struct l2tp_avp *, int);
130
const char       *avp_mes_type_string (int);
131
const char *     l2tp_cdn_rcode_string(int);
132
const char *     l2tp_stopccn_rcode_string(int);
133
const char *     l2tp_ecode_string(int);
134
135
#ifdef __cplusplus
136
}
137
#endif
138
139
#endif