+int findvendorsubattr(uint32_t *attrs, uint32_t vendor, uint8_t subattr) {
+ if (!attrs)
+ return 0;
+
+ for (; attrs[0]; attrs += 2)
+ if (attrs[0] == vendor && attrs[1] == subattr)
+ return 1;
+ return 0;
+}
+
+int dovendorrewrite(uint8_t *attrs, uint16_t length, uint32_t *removevendorattrs) {
+ uint8_t alen, sublen, rmlen = 0;
+ uint32_t vendor = *(uint32_t *)ATTRVAL(attrs);
+ uint8_t *subattrs;
+
+ if (!removevendorattrs)
+ return 0;
+
+ while (*removevendorattrs && *removevendorattrs != vendor)
+ removevendorattrs += 2;
+ if (!*removevendorattrs)
+ return 0;
+
+ alen = ATTRLEN(attrs);
+
+ if (findvendorsubattr(removevendorattrs, vendor, -1)) {
+ /* remove entire vendor attribute */
+ memmove(attrs, attrs + alen, length - alen);
+ return alen;
+ }
+
+ sublen = alen - 4;
+ subattrs = ATTRVAL(attrs) + 4;
+
+ if (!attrvalidate(subattrs, sublen)) {
+ debug(DBG_WARN, "dovendorrewrite: vendor attribute validation failed, no rewrite");
+ return 0;
+ }
+
+ length -= 6;
+ while (sublen > 1) {
+ alen = ATTRLEN(subattrs);
+ sublen -= alen;
+ length -= alen;
+ if (findvendorsubattr(removevendorattrs, vendor, ATTRTYPE(subattrs))) {
+ memmove(subattrs, subattrs + alen, length);
+ rmlen += alen;
+ } else
+ subattrs += alen;
+ }
+
+ ATTRLEN(attrs) -= rmlen;
+ return rmlen;
+}
+
+void dorewrite(uint8_t *buf, struct rewrite *rewrite) {