diff options
-rw-r--r-- | net/ipv4/cipso_ipv4.c | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c index 2ce5b693a8bd..d466bd5186a1 100644 --- a/net/ipv4/cipso_ipv4.c +++ b/net/ipv4/cipso_ipv4.c | |||
@@ -92,6 +92,33 @@ int cipso_v4_rbm_optfmt = 0; | |||
92 | int cipso_v4_rbm_strictvalid = 1; | 92 | int cipso_v4_rbm_strictvalid = 1; |
93 | 93 | ||
94 | /* | 94 | /* |
95 | * Protocol Constants | ||
96 | */ | ||
97 | |||
98 | /* Maximum size of the CIPSO IP option, derived from the fact that the maximum | ||
99 | * IPv4 header size is 60 bytes and the base IPv4 header is 20 bytes long. */ | ||
100 | #define CIPSO_V4_OPT_LEN_MAX 40 | ||
101 | |||
102 | /* Length of the base CIPSO option, this includes the option type (1 byte), the | ||
103 | * option length (1 byte), and the DOI (4 bytes). */ | ||
104 | #define CIPSO_V4_HDR_LEN 6 | ||
105 | |||
106 | /* Base length of the restrictive category bitmap tag (tag #1). */ | ||
107 | #define CIPSO_V4_TAG_RBM_BLEN 4 | ||
108 | |||
109 | /* Base length of the enumerated category tag (tag #2). */ | ||
110 | #define CIPSO_V4_TAG_ENUM_BLEN 4 | ||
111 | |||
112 | /* Base length of the ranged categories bitmap tag (tag #5). */ | ||
113 | #define CIPSO_V4_TAG_RNG_BLEN 4 | ||
114 | /* The maximum number of category ranges permitted in the ranged category tag | ||
115 | * (tag #5). You may note that the IETF draft states that the maximum number | ||
116 | * of category ranges is 7, but if the low end of the last category range is | ||
117 | * zero then it is possibile to fit 8 category ranges because the zero should | ||
118 | * be omitted. */ | ||
119 | #define CIPSO_V4_TAG_RNG_CAT_MAX 8 | ||
120 | |||
121 | /* | ||
95 | * Helper Functions | 122 | * Helper Functions |
96 | */ | 123 | */ |
97 | 124 | ||
@@ -1109,15 +1136,12 @@ static int cipso_v4_map_cat_rng_hton(const struct cipso_v4_doi *doi_def, | |||
1109 | unsigned char *net_cat, | 1136 | unsigned char *net_cat, |
1110 | u32 net_cat_len) | 1137 | u32 net_cat_len) |
1111 | { | 1138 | { |
1112 | /* The constant '16' is not random, it is the maximum number of | ||
1113 | * high/low category range pairs as permitted by the CIPSO draft based | ||
1114 | * on a maximum IPv4 header length of 60 bytes - the BUG_ON() assertion | ||
1115 | * does a sanity check to make sure we don't overflow the array. */ | ||
1116 | int iter = -1; | 1139 | int iter = -1; |
1117 | u16 array[16]; | 1140 | u16 array[CIPSO_V4_TAG_RNG_CAT_MAX * 2]; |
1118 | u32 array_cnt = 0; | 1141 | u32 array_cnt = 0; |
1119 | u32 cat_size = 0; | 1142 | u32 cat_size = 0; |
1120 | 1143 | ||
1144 | /* make sure we don't overflow the 'array[]' variable */ | ||
1121 | BUG_ON(net_cat_len > 30); | 1145 | BUG_ON(net_cat_len > 30); |
1122 | 1146 | ||
1123 | for (;;) { | 1147 | for (;;) { |
@@ -1196,9 +1220,6 @@ static int cipso_v4_map_cat_rng_ntoh(const struct cipso_v4_doi *doi_def, | |||
1196 | * Protocol Handling Functions | 1220 | * Protocol Handling Functions |
1197 | */ | 1221 | */ |
1198 | 1222 | ||
1199 | #define CIPSO_V4_OPT_LEN_MAX 40 | ||
1200 | #define CIPSO_V4_HDR_LEN 6 | ||
1201 | |||
1202 | /** | 1223 | /** |
1203 | * cipso_v4_gentag_hdr - Generate a CIPSO option header | 1224 | * cipso_v4_gentag_hdr - Generate a CIPSO option header |
1204 | * @doi_def: the DOI definition | 1225 | * @doi_def: the DOI definition |