1145519Sdarrenr/* $FreeBSD$ */ 2145510Sdarrenr 3145510Sdarrenr/* 4255332Scy * Copyright (C) 2012 by Darren Reed. 5145510Sdarrenr * 6145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing. 7145510Sdarrenr * 8255332Scy * $Id$ 9145510Sdarrenr */ 10145510Sdarrenr 11145510Sdarrenr#include "ipf.h" 12145510Sdarrenr 13145510Sdarrenr 14145510Sdarrenrint addipopt(op, io, len, class) 15255332Scy char *op; 16255332Scy struct ipopt_names *io; 17255332Scy int len; 18255332Scy char *class; 19145510Sdarrenr{ 20145510Sdarrenr int olen = len; 21145510Sdarrenr struct in_addr ipadr; 22145510Sdarrenr u_short val; 23145510Sdarrenr u_char lvl; 24145510Sdarrenr char *s; 25145510Sdarrenr 26145510Sdarrenr if ((len + io->on_siz) > 48) { 27145510Sdarrenr fprintf(stderr, "options too long\n"); 28145510Sdarrenr return 0; 29145510Sdarrenr } 30145510Sdarrenr len += io->on_siz; 31145510Sdarrenr *op++ = io->on_value; 32145510Sdarrenr if (io->on_siz > 1) { 33145510Sdarrenr s = op; 34145510Sdarrenr *op++ = io->on_siz; 35145510Sdarrenr *op++ = IPOPT_MINOFF; 36145510Sdarrenr 37145510Sdarrenr if (class) { 38145510Sdarrenr switch (io->on_value) 39145510Sdarrenr { 40145510Sdarrenr case IPOPT_SECURITY : 41145510Sdarrenr lvl = seclevel(class); 42145510Sdarrenr *(op - 1) = lvl; 43145510Sdarrenr break; 44255332Scy case IPOPT_RR : 45255332Scy case IPOPT_TS : 46255332Scy s[IPOPT_OLEN] = IPOPT_MINOFF - 1 + 4; 47255332Scy break; 48145510Sdarrenr case IPOPT_LSRR : 49145510Sdarrenr case IPOPT_SSRR : 50145510Sdarrenr ipadr.s_addr = inet_addr(class); 51145510Sdarrenr s[IPOPT_OLEN] = IPOPT_MINOFF - 1 + 4; 52145510Sdarrenr bcopy((char *)&ipadr, op, sizeof(ipadr)); 53145510Sdarrenr break; 54145510Sdarrenr case IPOPT_SATID : 55145510Sdarrenr val = atoi(class); 56145510Sdarrenr bcopy((char *)&val, op, 2); 57145510Sdarrenr break; 58145510Sdarrenr } 59145510Sdarrenr } 60145510Sdarrenr } 61145510Sdarrenr if (opts & OPT_DEBUG) 62145510Sdarrenr fprintf(stderr, "bo: %s %d %#x: %d\n", 63145510Sdarrenr io->on_name, io->on_value, io->on_bit, len); 64145510Sdarrenr return len - olen; 65145510Sdarrenr} 66