/* dnsmasq is Copyright (c) 2000-2024 Simon Kelley This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991, or (at your option) version 3 dated 29 June, 2007. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "dnsmasq.h" #ifdef HAVE_DHCP6 static size_t outpacket_counter; void end_opt6(int container) { void *p = daemon->outpacket.iov_base + container + 2; u16 len = outpacket_counter - container - 4 ; PUTSHORT(len, p); } void reset_counter(void) { /* Clear out buffer when starting from beginning */ if (daemon->outpacket.iov_base) memset(daemon->outpacket.iov_base, 0, daemon->outpacket.iov_len); save_counter(0); } int save_counter(int newval) { int ret = outpacket_counter; if (newval != -1) outpacket_counter = newval; return ret; } void *expand(size_t headroom) { void *ret; if (expand_buf(&daemon->outpacket, outpacket_counter + headroom)) { ret = daemon->outpacket.iov_base + outpacket_counter; outpacket_counter += headroom; return ret; } return NULL; } int new_opt6(int opt) { int ret = outpacket_counter; void *p; if ((p = expand(4))) { PUTSHORT(opt, p); PUTSHORT(0, p); } return ret; } void *put_opt6(void *data, size_t len) { void *p; if ((p = expand(len)) && data) memcpy(p, data, len); return p; } void put_opt6_long(unsigned int val) { void *p; if ((p = expand(4))) PUTLONG(val, p); } void put_opt6_short(unsigned int val) { void *p; if ((p = expand(2))) PUTSHORT(val, p); } void put_opt6_char(unsigned int val) { unsigned char *p; if ((p = expand(1))) *p = val; } void put_opt6_string(char *s) { put_opt6(s, strlen(s)); } #endif