OZ++ Class: NetlinkRouteAttributeRequest |
/****************************************************************************** * * Copyright (c) 2015 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer. * * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * NetlinkRouteAttributeRequest.h * *****************************************************************************/ #pragma once #include <oz++/CommonObject.h> #include <oz++/netlink/NetlinkMsgHeader.h> #include <oz++/netlink/RouteAttributeRequest.h> namespace OZ { template <typename T> class NetlinkRouteAttributeRequest :public CommonObject { private: RouteAttributeRequest<T> rta_request; size_t buffer_size; size_t buffer_pos; public: NetlinkRouteAttributeRequest() :buffer_size(sizeof(rta_request.attribute)), buffer_pos(0) { bzero(&rta_request, sizeof(rta_request)); } public: struct nlmsghdr* head() { return &rta_request.head; } T* body() { return &rta_request.body; } RouteAttributeRequest<T>& request() { return this -> rta_request; } size_t length() { return this -> rta_request.head.nlmsg_len; } char* buffer(size_t size) { char* buff = NULL; if ((this -> buffer_pos + size) < this -> buffer_size) { buff = this -> rta_request.attribute; buff += this -> buffer_pos; } return buff; } bool addAttribute(unsigned short type, void* data, unsigned short data_size) { bool rc = false; struct rtattr attr; memset(&attr, 0, sizeof(attr)); attr.rta_type = type; //2015/01/02attr.rta_len = RTA_LENGTH(data_size); attr.rta_len = RTA_SPACE(data_size); int buffsize = attr.rta_len; char* buff = buffer(buffsize); if (buff) { memcpy(buff, &attr, sizeof(attr)); memcpy(buff + sizeof(attr), data, data_size); this -> buffer_pos += buffsize; this -> rta_request.head.nlmsg_len += buffsize; rc = true; } return rc; } }; }