177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes/* 277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * Copyright (c) 2017 JingPiao Chen <chenjingpiao@gmail.com> 377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * Copyright (c) 2017 The strace developers. 477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * All rights reserved. 577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * 677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * Redistribution and use in source and binary forms, with or without 777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * modification, are permitted provided that the following conditions 877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * are met: 977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * 1. Redistributions of source code must retain the above copyright 1077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * notice, this list of conditions and the following disclaimer. 1177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * 2. Redistributions in binary form must reproduce the above copyright 1277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * notice, this list of conditions and the following disclaimer in the 1377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * documentation and/or other materials provided with the distribution. 1477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * 3. The name of the author may not be used to endorse or promote products 1577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * derived from this software without specific prior written permission. 1677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * 1777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes */ 2877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 2977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes#include "tests.h" 3077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 3177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes#ifdef HAVE_STRUCT_DCBMSG 3277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 3377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes# include <stdio.h> 3477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes# include "test_nlattr.h" 3577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes# include <linux/dcbnl.h> 3677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes# include <linux/rtnetlink.h> 3777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 3877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesstatic void 3977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesinit_dcbmsg(struct nlmsghdr *const nlh, const unsigned int msg_len) 4077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes{ 4177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes SET_STRUCT(struct nlmsghdr, nlh, 4277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes .nlmsg_len = msg_len, 4377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes .nlmsg_type = RTM_GETDCB, 4477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes .nlmsg_flags = NLM_F_DUMP 4577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes ); 4677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 4777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes struct dcbmsg *const msg = NLMSG_DATA(nlh); 4877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes SET_STRUCT(struct dcbmsg, msg, 4977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes .dcb_family = AF_UNIX, 5077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes .cmd = DCB_CMD_UNDEFINED 5177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes ); 5277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes} 5377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 5477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesstatic void 5577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesprint_dcbmsg(const unsigned int msg_len) 5677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes{ 5777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes printf("{len=%u, type=RTM_GETDCB, flags=NLM_F_DUMP" 5877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes ", seq=0, pid=0}, {dcb_family=AF_UNIX" 5977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes ", cmd=DCB_CMD_UNDEFINED}", 6077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes msg_len); 6177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes} 6277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 6377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesint 6477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughesmain(void) 6577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes{ 6677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes skip_if_unavailable("/proc/self/fd/"); 6777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 6877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes const int fd = create_nl_socket(NETLINK_ROUTE); 6977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes const unsigned int hdrlen = sizeof(struct dcbmsg); 7077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes void *nlh0 = tail_alloc(NLMSG_SPACE(hdrlen)); 7177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 7277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes static char pattern[4096]; 7377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes fill_memory_ex(pattern, sizeof(pattern), 'a', 'z' - 'a' + 1); 7477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 7577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes const unsigned int nla_type = 0xffff & NLA_TYPE_MASK; 7677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes char nla_type_str[256]; 7777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes sprintf(nla_type_str, "%#x /* DCB_ATTR_??? */", nla_type); 7877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes TEST_NLATTR_(fd, nlh0, hdrlen, 7977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes init_dcbmsg, print_dcbmsg, 8077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes nla_type, nla_type_str, 8177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 4, pattern, 4, 8277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes print_quoted_hex(pattern, 4)); 8377c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 8477c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes puts("+++ exited with 0 +++"); 8577c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes return 0; 8677c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes} 8777c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 8877c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes#else 8977c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 9077c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott HughesSKIP_MAIN_UNDEFINED("HAVE_STRUCT_DCBMSG") 9177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes 9277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes#endif 93