@@ -276,29 +276,28 @@ dhcp6_makeuser(void *data, const struct interface *ifp)
276276 return sizeof (o ) + olen ;
277277}
278278
279+ #ifndef SMALL
280+ /* DHCPv6 Option 16 (Vendor Class Option) */
279281static size_t
280282dhcp6_makevendor (void * data , const struct interface * ifp )
281283{
282284 const struct if_options * ifo ;
283- size_t len , vlen , i ;
285+ size_t len = 0 , optlen , vlen , i ;
284286 uint8_t * p ;
285287 const struct vivco * vivco ;
286288 struct dhcp6_option o ;
287289
288290 ifo = ifp -> options ;
289- len = sizeof (uint32_t ); /* IANA PEN */
290- if (ifo -> vivco_en ) {
291- vlen = 0 ;
291+ if (ifo -> vivco_len > 0 ) {
292292 for (i = 0 , vivco = ifo -> vivco ;
293293 i < ifo -> vivco_len ;
294294 i ++ , vivco ++ )
295- vlen += sizeof (uint16_t ) + vivco -> len ;
296- len += vlen ;
295+ len += sizeof (o ) + sizeof (uint32_t ) + sizeof (uint16_t ) + vivco -> len ;
297296 } else if (ifo -> vendorclassid [0 ] != '\0' ) {
298297 /* dhcpcd owns DHCPCD_IANA_PEN.
299298 * If you need your own string, get your own IANA PEN. */
300299 vlen = strlen (ifp -> ctx -> vendor );
301- len += sizeof (uint16_t ) + vlen ;
300+ len += sizeof (o ) + sizeof ( uint32_t ) + sizeof ( uint16_t ) + vlen ;
302301 } else
303302 return 0 ;
304303
@@ -312,37 +311,42 @@ dhcp6_makevendor(void *data, const struct interface *ifp)
312311 uint16_t hvlen ;
313312
314313 p = data ;
315- o .code = htons (D6_OPTION_VENDOR_CLASS );
316- o .len = htons ((uint16_t )len );
317- memcpy (p , & o , sizeof (o ));
318- p += sizeof (o );
319- pen = htonl (ifo -> vivco_en ? ifo -> vivco_en : DHCPCD_IANA_PEN );
320- memcpy (p , & pen , sizeof (pen ));
321- p += sizeof (pen );
322314
323- if (ifo -> vivco_en ) {
315+ if (ifo -> vivco_len > 0 ) {
324316 for (i = 0 , vivco = ifo -> vivco ;
325317 i < ifo -> vivco_len ;
326- i ++ , vivco ++ )
327- {
318+ i ++ , vivco ++ ) {
319+ optlen = sizeof (uint32_t ) + sizeof (uint16_t ) + vivco -> len ;
320+ o .code = htons (D6_OPTION_VENDOR_CLASS );
321+ o .len = htons ((uint16_t )optlen );
322+ memcpy (p , & o , sizeof (o ));
323+ p += sizeof (o );
324+ pen = htonl (vivco -> en );
325+ memcpy (p , & pen , sizeof (pen ));
326+ p += sizeof (pen );
328327 hvlen = htons ((uint16_t )vivco -> len );
329328 memcpy (p , & hvlen , sizeof (hvlen ));
330329 p += sizeof (hvlen );
331330 memcpy (p , vivco -> data , vivco -> len );
332331 p += vivco -> len ;
333332 }
334333 } else if (ifo -> vendorclassid [0 ] != '\0' ) {
334+ o .code = htons (D6_OPTION_VENDOR_CLASS );
335+ o .len = htons ((uint16_t )len );
336+ memcpy (p , & o , sizeof (o ));
337+ p += sizeof (o );
338+ pen = htonl (DHCPCD_IANA_PEN );
339+ memcpy (p , & pen , sizeof (pen ));
340+ p += sizeof (pen );
335341 hvlen = htons ((uint16_t )vlen );
336342 memcpy (p , & hvlen , sizeof (hvlen ));
337343 p += sizeof (hvlen );
338344 memcpy (p , ifp -> ctx -> vendor , vlen );
339345 }
340346 }
341-
342- return sizeof (o ) + len ;
347+ return len ;
343348}
344349
345- #ifndef SMALL
346350/* DHCPv6 Option 17 (Vendor-Specific Information Option) */
347351static size_t
348352dhcp6_makevendoropts (void * data , const struct interface * ifp )
@@ -875,10 +879,10 @@ dhcp6_makemessage(struct interface *ifp)
875879
876880 if (!has_option_mask (ifo -> nomask6 , D6_OPTION_USER_CLASS ))
877881 len += dhcp6_makeuser (NULL , ifp );
878- if (!has_option_mask (ifo -> nomask6 , D6_OPTION_VENDOR_CLASS ))
879- len += dhcp6_makevendor (NULL , ifp );
880882
881883#ifndef SMALL
884+ if (!has_option_mask (ifo -> nomask6 , D6_OPTION_VENDOR_CLASS ))
885+ len += dhcp6_makevendor (NULL , ifp );
882886 if (!has_option_mask (ifo -> nomask6 , D6_OPTION_VENDOR_OPTS ))
883887 len += dhcp6_makevendoropts (NULL , ifp );
884888#endif
@@ -1199,10 +1203,10 @@ dhcp6_makemessage(struct interface *ifp)
11991203
12001204 if (!has_option_mask (ifo -> nomask6 , D6_OPTION_USER_CLASS ))
12011205 p += dhcp6_makeuser (p , ifp );
1202- if (!has_option_mask (ifo -> nomask6 , D6_OPTION_VENDOR_CLASS ))
1203- p += dhcp6_makevendor (p , ifp );
12041206
12051207#ifndef SMALL
1208+ if (!has_option_mask (ifo -> nomask6 , D6_OPTION_VENDOR_CLASS ))
1209+ p += dhcp6_makevendor (p , ifp );
12061210 if (!has_option_mask (ifo -> nomask6 , D6_OPTION_VENDOR_OPTS ))
12071211 p += dhcp6_makevendoropts (p , ifp );
12081212#endif
0 commit comments