Пример #1
0
def test_ints():
    """Test integer attributes."""
    msg = nlmsg_alloc()
    assert 0 == libnl.attr.nla_put_u8(msg, 2, 10)
    assert 0 == libnl.attr.nla_put_u16(msg, 3, 11)
    assert 0 == libnl.attr.nla_put_u32(msg, 4, 12)
    assert 0 == libnl.attr.nla_put_u64(msg, 5, 13195)

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 2)
    assert 2 == libnl.attr.nla_type(attr)
    assert 10 == libnl.attr.nla_get_u8(attr)
    assert 5 == attr.nla_len
    assert b"BQACAAo=" == base64.b64encode(buffer(attr.bytearray[: attr.nla_len]))

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 3)
    assert 3 == libnl.attr.nla_type(attr)
    assert 11 == libnl.attr.nla_get_u16(attr)
    assert 6 == attr.nla_len
    assert b"BgADAAsA" == base64.b64encode(buffer(attr.bytearray[: attr.nla_len]))

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 4)
    assert 4 == libnl.attr.nla_type(attr)
    assert 12 == libnl.attr.nla_get_u32(attr)
    assert 8 == attr.nla_len
    assert b"CAAEAAwAAAA=" == base64.b64encode(buffer(attr.bytearray[: attr.nla_len]))

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 5)
    assert 5 == libnl.attr.nla_type(attr)
    assert 13195 == libnl.attr.nla_get_u64(attr)  # printf("%llu\n", nla_get_u64(attr));
    assert 12 == attr.nla_len
    assert b"DAAFAIszAAAAAAAA" == base64.b64encode(buffer(attr.bytearray[: attr.nla_len]))
Пример #2
0
def test_msecs():
    """Test milliseconds."""
    msg = nlmsg_alloc()
    assert 0 == libnl.attr.nla_put_msecs(msg, 12, 99)

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 12)
    assert 12 == libnl.attr.nla_type(attr)
    assert 99 == libnl.attr.nla_get_msecs(attr)
    assert 12 == attr.nla_len
    assert b"DAAMAGMAAAAAAAAA" == base64.b64encode(buffer(attr.bytearray[: attr.nla_len]))
Пример #3
0
def test_flag():
    """Test flags."""
    msg = nlmsg_alloc()
    assert 0 == libnl.attr.nla_put_flag(msg, 7)

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 7)
    assert 7 == libnl.attr.nla_type(attr)
    assert libnl.attr.nla_get_flag(attr) is True  # printf("%s\n", nla_get_flag(attr) ? "True" : "False");
    assert 4 == attr.nla_len
    assert b"BAAHAA==" == base64.b64encode(buffer(attr.bytearray[: attr.nla_len]))
Пример #4
0
def test_msecs():
    """Test milliseconds."""
    msg = nlmsg_alloc()
    assert 0 == libnl.attr.nla_put_msecs(msg, 12, 99)

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 12)
    assert 12 == libnl.attr.nla_type(attr)
    assert 99 == libnl.attr.nla_get_msecs(attr)
    assert 12 == attr.nla_len
    assert b'DAAMAGMAAAAAAAAA' == base64.b64encode(
        buffer(attr.bytearray[:attr.nla_len]))
Пример #5
0
def test_string_short():
    """Test string attributes with a short string."""
    payload = bytes("test".encode("ascii"))
    msg = nlmsg_alloc()
    assert 0 == libnl.attr.nla_put_string(msg, 6, payload)

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 6)
    assert 6 == libnl.attr.nla_type(attr)
    assert payload == libnl.attr.nla_get_string(attr)
    assert 9 == attr.nla_len
    assert b"CQAGAHRlc3QA" == base64.b64encode(buffer(attr.bytearray[: attr.nla_len]))
Пример #6
0
def test_string_short():
    """Test string attributes with a short string."""
    payload = bytes('test'.encode('ascii'))
    msg = nlmsg_alloc()
    assert 0 == libnl.attr.nla_put_string(msg, 6, payload)

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 6)
    assert 6 == libnl.attr.nla_type(attr)
    assert payload == libnl.attr.nla_get_string(attr)
    assert 9 == attr.nla_len
    assert b'CQAGAHRlc3QA' == base64.b64encode(
        buffer(attr.bytearray[:attr.nla_len]))
Пример #7
0
def test_flag():
    """Test flags."""
    msg = nlmsg_alloc()
    assert 0 == libnl.attr.nla_put_flag(msg, 7)

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 7)
    assert 7 == libnl.attr.nla_type(attr)
    assert libnl.attr.nla_get_flag(
        attr) is True  # printf("%s\n", nla_get_flag(attr) ? "True" : "False");
    assert 4 == attr.nla_len
    assert b'BAAHAA==' == base64.b64encode(
        buffer(attr.bytearray[:attr.nla_len]))
Пример #8
0
def test_string_medium():
    """Test string attributes with a longer string."""
    payload = bytes("The quick br()wn f0x jumps over the l@zy dog!".encode("ascii"))
    msg = nlmsg_alloc()
    assert 0 == libnl.attr.nla_put_string(msg, 6, payload)

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 6)
    assert 6 == libnl.attr.nla_type(attr)
    assert payload == libnl.attr.nla_get_string(attr)
    assert 50 == attr.nla_len
    expected = b"MgAGAFRoZSBxdWljayBicigpd24gZjB4IGp1bXBzIG92ZXIgdGhlIGxAenkgZG9nIQA="
    assert expected == base64.b64encode(buffer(attr.bytearray[: attr.nla_len]))
Пример #9
0
def test_string_medium():
    """Test string attributes with a longer string."""
    payload = bytes(
        'The quick br()wn f0x jumps over the l@zy dog!'.encode('ascii'))
    msg = nlmsg_alloc()
    assert 0 == libnl.attr.nla_put_string(msg, 6, payload)

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 6)
    assert 6 == libnl.attr.nla_type(attr)
    assert payload == libnl.attr.nla_get_string(attr)
    assert 50 == attr.nla_len
    expected = b'MgAGAFRoZSBxdWljayBicigpd24gZjB4IGp1bXBzIG92ZXIgdGhlIGxAenkgZG9nIQA='
    assert expected == base64.b64encode(buffer(attr.bytearray[:attr.nla_len]))
Пример #10
0
def test_string_long():
    """Test string attributes with a long string."""
    payload = bytes(string.printable[:-2].encode('ascii'))
    msg = nlmsg_alloc()
    assert 0 == libnl.attr.nla_put_string(msg, 6, payload)

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 6)
    assert 6 == libnl.attr.nla_type(attr)
    assert payload == libnl.attr.nla_get_string(attr)
    assert 103 == attr.nla_len
    expected = (
        b'ZwAGADAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaISIjJCUmJygp'
        b'KissLS4vOjs8PT4/QFtcXV5fYHt8fX4gCQoNAA==')
    assert expected == base64.b64encode(buffer(attr.bytearray[:attr.nla_len]))
Пример #11
0
def test_ints():
    """Test integer attributes."""
    msg = nlmsg_alloc()
    assert 0 == libnl.attr.nla_put_u8(msg, 2, 10)
    assert 0 == libnl.attr.nla_put_u16(msg, 3, 11)
    assert 0 == libnl.attr.nla_put_u32(msg, 4, 12)
    assert 0 == libnl.attr.nla_put_u64(msg, 5, 13195)

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 2)
    assert 2 == libnl.attr.nla_type(attr)
    assert 10 == libnl.attr.nla_get_u8(attr)
    assert 5 == attr.nla_len
    assert b'BQACAAo=' == base64.b64encode(
        buffer(attr.bytearray[:attr.nla_len]))

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 3)
    assert 3 == libnl.attr.nla_type(attr)
    assert 11 == libnl.attr.nla_get_u16(attr)
    assert 6 == attr.nla_len
    assert b'BgADAAsA' == base64.b64encode(
        buffer(attr.bytearray[:attr.nla_len]))

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 4)
    assert 4 == libnl.attr.nla_type(attr)
    assert 12 == libnl.attr.nla_get_u32(attr)
    assert 8 == attr.nla_len
    assert b'CAAEAAwAAAA=' == base64.b64encode(
        buffer(attr.bytearray[:attr.nla_len]))

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 5)
    assert 5 == libnl.attr.nla_type(attr)
    assert 13195 == libnl.attr.nla_get_u64(
        attr)  # printf("%llu\n", nla_get_u64(attr));
    assert 12 == attr.nla_len
    assert b'DAAFAIszAAAAAAAA' == base64.b64encode(
        buffer(attr.bytearray[:attr.nla_len]))
Пример #12
0
def test_string_long():
    """Test string attributes with a long string."""
    payload = bytes(string.printable[:-2].encode("ascii"))
    msg = nlmsg_alloc()
    assert 0 == libnl.attr.nla_put_string(msg, 6, payload)

    attr = nlmsg_find_attr(nlmsg_hdr(msg), 0, 6)
    assert 6 == libnl.attr.nla_type(attr)
    assert payload == libnl.attr.nla_get_string(attr)
    assert 103 == attr.nla_len
    expected = (
        b"ZwAGADAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaISIjJCUmJygp"
        b"KissLS4vOjs8PT4/QFtcXV5fYHt8fX4gCQoNAA=="
    )
    assert expected == base64.b64encode(buffer(attr.bytearray[: attr.nla_len]))
Пример #13
0
def test_socket(tcp_server):
    r"""C code to test against.

    // gcc a.c $(pkg-config --cflags --libs libnl-genl-3.0) && (nc -l 2000 |base64 &) && sleep 0.1 && ./a.out
    #include <netlink/msg.h>
    struct nl_sock {
        struct sockaddr_nl s_local; struct sockaddr_nl s_peer; int s_fd; int s_proto; unsigned int s_seq_next;
        unsigned int s_seq_expect; int s_flags; struct nl_cb *s_cb; size_t s_bufsize;
    };
    int main() {
        struct nl_msg *msg = nlmsg_alloc();
        printf("%d == nla_put_u32()\n", nla_put_u32(msg, 4, 8));
        struct nlmsghdr *nlh = nlmsg_hdr(msg);
        struct nlattr *attr = nlmsg_find_attr(nlh, 0, 4);
        printf("%d == nla_type(attr)\n", nla_type(attr));
        printf("%d == nla_get_u32(attr)\n", nla_get_u32(attr));
        printf("%d == attr->nla_len\n", attr->nla_len);

        struct sockaddr_in sin = { .sin_port = htons(2000), .sin_family = AF_INET, };
        sin.sin_addr.s_addr = inet_addr("127.0.0.1");
        int fd = socket(AF_INET, SOCK_STREAM, 0);
        connect(fd, (struct sockaddr *) &sin, sizeof(sin));

        struct nl_sock *sk = nl_socket_alloc();
        nl_connect(sk, NETLINK_ROUTE);
        sk->s_fd = fd;
        sk->s_local.nl_pid = 0;
        nl_complete_msg(sk, msg);

        struct iovec iov = { .iov_base = attr, .iov_len = attr->nla_len };
        struct msghdr hdr = { .msg_iov = &iov, .msg_iovlen = 1, };

        int ret = nl_sendmsg(sk, msg, &hdr);
        printf("Bytes: %d\n", ret);  // 14
        return 0;
    }
    // Expected bash output:
    // 0 == nla_put_u32()
    // 4 == nla_type(attr)
    // 8 == nla_get_u32(attr)
    // 8 == attr->nla_len
    // Bytes: 8
    // CAAEAAgAAAA=
    """
    msg = nlmsg_alloc()
    assert 0 == libnl.attr.nla_put_u32(msg, 4, 8)
    nlh = nlmsg_hdr(msg)
    attr = nlmsg_find_attr(nlh, 0, 4)
    assert 4 == libnl.attr.nla_type(attr)
    assert 8 == libnl.attr.nla_get_u32(attr)
    assert 8 == attr.nla_len

    sk = nl_socket_alloc()
    nl_connect(sk, NETLINK_ROUTE)
    sk.socket_instance.close()
    sk.socket_instance = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sk.socket_instance.connect(tcp_server.server.server_address)
    sk.s_local.nl_pid = 0
    nl_complete_msg(sk, msg)

    iov = attr.bytearray[:attr.nla_len]
    hdr = msghdr(msg_iov=iov)

    assert 8 == nl_sendmsg(sk, msg, hdr)
    assert 1 == len(tcp_server.data)
    assert b'CAAEAAgAAAA=' == base64.b64encode(buffer(iov))
    assert b'CAAEAAgAAAA=' == base64.b64encode(buffer(tcp_server.data[0]))
    nl_socket_free(sk)
Пример #14
0
def test_socket(tcp_server):
    r"""C code to test against.

    // gcc a.c $(pkg-config --cflags --libs libnl-genl-3.0) && (nc -l 2000 |base64 &) && sleep 0.1 && ./a.out
    #include <netlink/msg.h>
    struct nl_sock {
        struct sockaddr_nl s_local; struct sockaddr_nl s_peer; int s_fd; int s_proto; unsigned int s_seq_next;
        unsigned int s_seq_expect; int s_flags; struct nl_cb *s_cb; size_t s_bufsize;
    };
    int main() {
        struct nl_msg *msg = nlmsg_alloc();
        printf("%d == nla_put_u32()\n", nla_put_u32(msg, 4, 8));
        struct nlmsghdr *nlh = nlmsg_hdr(msg);
        struct nlattr *attr = nlmsg_find_attr(nlh, 0, 4);
        printf("%d == nla_type(attr)\n", nla_type(attr));
        printf("%d == nla_get_u32(attr)\n", nla_get_u32(attr));
        printf("%d == attr->nla_len\n", attr->nla_len);

        struct sockaddr_in sin = { .sin_port = htons(2000), .sin_family = AF_INET, };
        sin.sin_addr.s_addr = inet_addr("127.0.0.1");
        int fd = socket(AF_INET, SOCK_STREAM, 0);
        connect(fd, (struct sockaddr *) &sin, sizeof(sin));

        struct nl_sock *sk = nl_socket_alloc();
        nl_connect(sk, NETLINK_ROUTE);
        sk->s_fd = fd;
        sk->s_local.nl_pid = 0;
        nl_complete_msg(sk, msg);

        struct iovec iov = { .iov_base = attr, .iov_len = attr->nla_len };
        struct msghdr hdr = { .msg_iov = &iov, .msg_iovlen = 1, };

        int ret = nl_sendmsg(sk, msg, &hdr);
        printf("Bytes: %d\n", ret);  // 14
        return 0;
    }
    // Expected bash output:
    // 0 == nla_put_u32()
    // 4 == nla_type(attr)
    // 8 == nla_get_u32(attr)
    // 8 == attr->nla_len
    // Bytes: 8
    // CAAEAAgAAAA=
    """
    msg = nlmsg_alloc()
    assert 0 == libnl.attr.nla_put_u32(msg, 4, 8)
    nlh = nlmsg_hdr(msg)
    attr = nlmsg_find_attr(nlh, 0, 4)
    assert 4 == libnl.attr.nla_type(attr)
    assert 8 == libnl.attr.nla_get_u32(attr)
    assert 8 == attr.nla_len

    sk = nl_socket_alloc()
    nl_connect(sk, NETLINK_ROUTE)
    sk.socket_instance.close()
    sk.socket_instance = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sk.socket_instance.connect(tcp_server.server.server_address)
    sk.s_local.nl_pid = 0
    nl_complete_msg(sk, msg)

    iov = attr.bytearray[: attr.nla_len]
    hdr = msghdr(msg_iov=iov)

    assert 8 == nl_sendmsg(sk, msg, hdr)
    assert 1 == len(tcp_server.data)
    assert b"CAAEAAgAAAA=" == base64.b64encode(buffer(iov))
    assert b"CAAEAAgAAAA=" == base64.b64encode(buffer(tcp_server.data[0]))
    nl_socket_free(sk)