1054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart/* 2054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * tests/check-attr.c nla_attr unit tests 3054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * 4054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * This library is free software; you can redistribute it and/or 5054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * modify it under the terms of the GNU Lesser General Public 6054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * License as published by the Free Software Foundation version 2.1 7054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * of the License. 8054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * 9054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * Copyright (c) 2013 Thomas Graf <tgraf@suug.ch> 10054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart */ 11054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 12054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include "util.h" 13054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/attr.h> 14054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/msg.h> 15054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 16054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul StewartSTART_TEST(attr_size) 17054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart{ 18054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_attr_size(0) != NLA_HDRLEN, 19054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart "Length of empty attribute should match header size"); 20054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_attr_size(1) != NLA_HDRLEN + 1, 21054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart "Length of 1 bytes payload should be NLA_HDRLEN + 1"); 22054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_attr_size(2) != NLA_HDRLEN + 2, 23054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart "Length of 2 bytes payload should be NLA_HDRLEN + 2"); 24054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_attr_size(3) != NLA_HDRLEN + 3, 25054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart "Length of 3 bytes payload should be NLA_HDRLEN + 3"); 26054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_attr_size(4) != NLA_HDRLEN + 4, 27054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart "Length of 4 bytes payload should be NLA_HDRLEN + 4"); 28054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 29054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_total_size(1) != NLA_HDRLEN + 4, 30054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart "Total size of 1 bytes payload should result in 8 bytes"); 31054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_total_size(2) != NLA_HDRLEN + 4, 32054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart "Total size of 2 bytes payload should result in 8 bytes"); 33054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_total_size(3) != NLA_HDRLEN + 4, 34054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart "Total size of 3 bytes payload should result in 8 bytes"); 35054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_total_size(4) != NLA_HDRLEN + 4, 36054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart "Total size of 4 bytes payload should result in 8 bytes"); 37054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 38054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_padlen(1) != 3, 39054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart "2 bytes of payload should result in 3 padding bytes"); 40054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_padlen(2) != 2, 41054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart "2 bytes of payload should result in 2 padding bytes"); 42054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_padlen(3) != 1, 43054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart "3 bytes of payload should result in 1 padding bytes"); 44054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_padlen(4) != 0, 45054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart "4 bytes of payload should result in 0 padding bytes"); 46054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_padlen(5) != 3, 47054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart "5 bytes of payload should result in 3 padding bytes"); 48054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart} 49054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul StewartEND_TEST 50054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 51054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul StewartSTART_TEST(msg_construct) 52054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart{ 53054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart struct nl_msg *msg; 54054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart struct nlmsghdr *nlh; 55054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart struct nlattr *a; 56054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart int i, rem; 57054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 58054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart msg = nlmsg_alloc(); 59054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(!msg, "Unable to allocate netlink message"); 60054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 61054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart for (i = 1; i < 256; i++) { 62054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_put_u32(msg, i, i+1) != 0, 63054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart "Unable to add attribute %d", i); 64054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart } 65054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 66054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nlh = nlmsg_hdr(msg); 67054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart i = 1; 68054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nlmsg_for_each_attr(a, nlh, 0, rem) { 69054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_type(a) != i, "Expected attribute %d", i); 70054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart i++; 71054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart fail_if(nla_get_u32(a) != i, "Expected attribute value %d", i); 72054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart } 73054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 74054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nlmsg_free(msg); 75054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart} 76054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul StewartEND_TEST 77054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 78054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul StewartSuite *make_nl_attr_suite(void) 79054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart{ 80054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart Suite *suite = suite_create("Netlink attributes"); 81054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 82054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart TCase *nl_attr = tcase_create("Core"); 83054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart tcase_add_test(nl_attr, attr_size); 84054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart tcase_add_test(nl_attr, msg_construct); 85054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart suite_add_tcase(suite, nl_attr); 86054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 87054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart return suite; 88054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart} 89