]>
Commit | Line | Data |
---|---|---|
12e41d03 | 1 | /* |
896014f4 DL |
2 | * PIM for Quagga |
3 | * Copyright (C) 2008 Everton da Silva Marques | |
4 | * | |
5 | * This program is free software; you can redistribute it and/or modify | |
6 | * it under the terms of the GNU General Public License as published by | |
7 | * the Free Software Foundation; either version 2 of the License, or | |
8 | * (at your option) any later version. | |
9 | * | |
10 | * This program is distributed in the hope that it will be useful, but | |
11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | * General Public License for more details. | |
14 | * | |
15 | * You should have received a copy of the GNU General Public License along | |
16 | * with this program; see the file COPYING; if not, write to the Free Software | |
17 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
18 | */ | |
12e41d03 DL |
19 | |
20 | #ifndef PIM_MSG_H | |
21 | #define PIM_MSG_H | |
22 | ||
23 | #include <netinet/in.h> | |
24 | ||
982bff89 | 25 | #include "pim_jp_agg.h" |
d57a8bbf | 26 | |
27 | #define PIM_HDR_LEN sizeof(struct pim_msg_header) | |
12e41d03 | 28 | /* |
d62a17ae | 29 | Number Description |
12e41d03 DL |
30 | ---------- ------------------ |
31 | 0 Reserved | |
32 | 1 IP (IP version 4) | |
33 | 2 IP6 (IP version 6) | |
34 | ||
35 | From: | |
36 | http://www.iana.org/assignments/address-family-numbers | |
37 | */ | |
34687162 | 38 | enum pim_msg_address_family { |
d62a17ae | 39 | PIM_MSG_ADDRESS_FAMILY_RESERVED, |
40 | PIM_MSG_ADDRESS_FAMILY_IPV4, | |
41 | PIM_MSG_ADDRESS_FAMILY_IPV6, | |
34687162 | 42 | }; |
12e41d03 | 43 | |
70ce34ae | 44 | /* |
be6a3245 | 45 | * pim_msg_hdr |
d57a8bbf | 46 | * ========================= |
47 | * PIM Header definition as per RFC 5059. N bit introduced to indicate | |
48 | * do-not-forward option in PIM Boot strap Message. | |
49 | * 0 1 2 3 | |
50 | * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |
51 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
52 | * |PIM Ver| Type |N| Reserved | Checksum | | |
53 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
70ce34ae DS |
54 | */ |
55 | struct pim_msg_header { | |
be6a3245 | 56 | #if (BYTE_ORDER == LITTLE_ENDIAN) |
d62a17ae | 57 | uint8_t type : 4; |
58 | uint8_t ver : 4; | |
be6a3245 BA |
59 | uint8_t reserved : 7; |
60 | uint8_t Nbit : 1; /* No Fwd Bit */ | |
61 | #elif (BYTE_ORDER == BIG_ENDIAN) | |
62 | uint8_t ver : 4; | |
63 | uint8_t type : 4; | |
d57a8bbf | 64 | uint8_t Nbit : 1; /* No Fwd Bit */ |
65 | uint8_t reserved : 7; | |
be6a3245 BA |
66 | #else |
67 | #error"Please set byte order" | |
68 | #endif | |
d62a17ae | 69 | uint16_t checksum; |
70 | } __attribute__((packed)); | |
70ce34ae | 71 | |
74ac496f | 72 | struct pim_encoded_ipv4_unicast { |
d62a17ae | 73 | uint8_t family; |
74 | uint8_t reserved; | |
75 | struct in_addr addr; | |
76 | } __attribute__((packed)); | |
74ac496f | 77 | |
71361a2c | 78 | /* |
79 | * Encoded Group format. RFC 4601 Sec 4.9.1 | |
80 | * 0 1 2 3 | |
81 | * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |
82 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
83 | * | Addr Family | Encoding Type |B| Reserved |Z| Mask Len | | |
84 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
85 | * | Group multicast Address | |
86 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+... | |
87 | */ | |
74ac496f | 88 | struct pim_encoded_group_ipv4 { |
d62a17ae | 89 | uint8_t family; |
71361a2c | 90 | uint8_t ne; |
be6a3245 BA |
91 | #if (BYTE_ORDER == LITTLE_ENDIAN) |
92 | uint8_t sz : 1; /* scope zone bit */ | |
93 | uint8_t reserved : 6; /* Reserved */ | |
94 | uint8_t bidir : 1; /* Bidir bit */ | |
95 | #elif (BYTE_ORDER == BIG_ENDIAN) | |
d57a8bbf | 96 | uint8_t bidir : 1; /* Bidir bit */ |
97 | uint8_t reserved : 6; /* Reserved */ | |
98 | uint8_t sz : 1; /* scope zone bit */ | |
be6a3245 BA |
99 | #else |
100 | #error"Please set byte order" | |
101 | #endif | |
d62a17ae | 102 | uint8_t mask; |
103 | struct in_addr addr; | |
104 | } __attribute__((packed)); | |
74ac496f | 105 | |
71361a2c | 106 | |
107 | /* | |
108 | * Encoded Source format. RFC 4601 Sec 4.9.1 | |
109 | * 0 1 2 3 | |
110 | * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |
111 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
112 | * | Addr Family | Encoding Type | Rsrvd |S|W|R| Mask Len | | |
113 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
114 | * | Source Address | |
115 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-... | |
116 | */ | |
74ac496f | 117 | struct pim_encoded_source_ipv4 { |
d62a17ae | 118 | uint8_t family; |
71361a2c | 119 | uint8_t ne; |
d62a17ae | 120 | uint8_t bits; |
121 | uint8_t mask; | |
122 | struct in_addr addr; | |
123 | } __attribute__((packed)); | |
74ac496f DS |
124 | |
125 | struct pim_jp_groups { | |
d62a17ae | 126 | struct pim_encoded_group_ipv4 g; |
127 | uint16_t joins; | |
128 | uint16_t prunes; | |
129 | struct pim_encoded_source_ipv4 s[1]; | |
130 | } __attribute__((packed)); | |
74ac496f DS |
131 | |
132 | struct pim_jp { | |
d62a17ae | 133 | struct pim_msg_header header; |
134 | struct pim_encoded_ipv4_unicast addr; | |
135 | uint8_t reserved; | |
136 | uint8_t num_groups; | |
137 | uint16_t holdtime; | |
138 | struct pim_jp_groups groups[1]; | |
139 | } __attribute__((packed)); | |
74ac496f | 140 | |
d62a17ae | 141 | void pim_msg_build_header(uint8_t *pim_msg, size_t pim_msg_size, |
d57a8bbf | 142 | uint8_t pim_msg_type, bool no_fwd); |
f8e7d799 DS |
143 | uint8_t *pim_msg_addr_encode_ipv4_ucast(uint8_t *buf, struct in_addr addr); |
144 | uint8_t *pim_msg_addr_encode_ipv4_group(uint8_t *buf, struct in_addr addr); | |
984c84f4 DS |
145 | |
146 | #define PIM_ENCODE_SPARSE_BIT 0x04 | |
147 | #define PIM_ENCODE_WC_BIT 0x02 | |
148 | #define PIM_ENCODE_RPT_BIT 0x01 | |
d62a17ae | 149 | uint8_t *pim_msg_addr_encode_ipv4_source(uint8_t *buf, struct in_addr addr, |
150 | uint8_t bits); | |
12e41d03 | 151 | |
346cffe3 | 152 | |
d62a17ae | 153 | size_t pim_msg_get_jp_group_size(struct list *sources); |
154 | size_t pim_msg_build_jp_groups(struct pim_jp_groups *grp, | |
155 | struct pim_jp_agg_group *sgs, size_t size); | |
12e41d03 | 156 | #endif /* PIM_MSG_H */ |