diff options
author | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2010-03-30 10:27:21 +0200 |
---|---|---|
committer | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2010-03-30 10:27:21 +0200 |
commit | 7f4dc168b6cfa82682a0235c4e426e43950ed1a9 (patch) | |
tree | 9f011a381024a3c19f9bd367b5468fbc545e6b1a /src/trans-libnl.c | |
parent | b19b72eebbe375efe062c47468155d986db57c1f (diff) | |
download | tsnif-7f4dc168b6cfa82682a0235c4e426e43950ed1a9.tar.gz tsnif-7f4dc168b6cfa82682a0235c4e426e43950ed1a9.tar.xz tsnif-7f4dc168b6cfa82682a0235c4e426e43950ed1a9.zip |
added ack processing
Diffstat (limited to 'src/trans-libnl.c')
-rw-r--r-- | src/trans-libnl.c | 101 |
1 files changed, 41 insertions, 60 deletions
diff --git a/src/trans-libnl.c b/src/trans-libnl.c index e49407d..d4b814b 100644 --- a/src/trans-libnl.c +++ b/src/trans-libnl.c @@ -15,11 +15,6 @@ TSNIF_POLICY(gnl_policy); -static int ack_cb(struct nl_msg *msg, void *arg) -{ - return NL_OK; -} - static int seq_cb(struct nl_msg *msg, void *arg) { /* FIXME Our sequence numbers of DATA packets are zero, @@ -27,82 +22,69 @@ static int seq_cb(struct nl_msg *msg, void *arg) return NL_OK; } -#define CB_RET(err) (err ? NL_STOP : NL_OK) - -int err_cb(struct sockaddr_nl *nla, struct nlmsgerr *nlerr, void *arg) +static int process_cb(struct trans_handle *h, struct trans_msg *m, + struct nlmsghdr *nlh) { - struct nlmsghdr *nlh = &nlerr->msg; struct genlmsghdr *ghdr = nlmsg_data(nlh); struct nlattr *attrs[TSNIF_ATTR_MAX + 1]; - struct trans_handle *h = arg; - struct trans_msg m; genlmsg_parse(nlh, 0, attrs, TSNIF_ATTR_MAX, gnl_policy); - memset(&m, 0x0, sizeof(m)); + /* parse the message and get all the attributes we can */ if (attrs[TSNIF_ATTR_IDX]) - m.idx = nla_get_u32(attrs[TSNIF_ATTR_IDX]); + m->idx = nla_get_u32(attrs[TSNIF_ATTR_IDX]); if (attrs[TSNIF_ATTR_TYPE]) - m.type = nla_get_u32(attrs[TSNIF_ATTR_TYPE]); + m->type = nla_get_u32(attrs[TSNIF_ATTR_TYPE]); - m.cmd = ghdr->cmd; - m.err = 1; - m.error = nlerr->error; + if (attrs[TSNIF_ATTR_GROUP]) + m->group = nla_get_u32(attrs[TSNIF_ATTR_GROUP]); - TSNIF_DEBUG("got err %d for cmd %d, type %d, idx %d\n", - nlerr->error, m.cmd, m.idx, m.type); + if (attrs[TSNIF_ATTR_DATA]) { + m->data.ptr = nla_data(attrs[TSNIF_ATTR_DATA]); + m->data.len = nla_len(attrs[TSNIF_ATTR_DATA]); + } + + if (attrs[TSNIF_ATTR_FLAGS]) + m->data.flags = nla_get_u32(attrs[TSNIF_ATTR_FLAGS]); + + m->cmd = ghdr->cmd; + + TSNIF_DEBUG("got cmd %d, type %d, idx %d, " + "ack %d, err %d\n", + m->cmd, m->idx, m->type, + m->ack, m->err); - return CB_RET(h->cb(h, &m)); + return h->cb(h, m) ? NL_STOP : NL_OK; } -static int parse_cb(struct nl_msg *msg, void *arg) +static int err_cb(struct sockaddr_nl *nla, struct nlmsgerr *nlerr, void *arg) { - struct nlmsghdr *nlh = nlmsg_hdr(msg); - struct genlmsghdr *ghdr = nlmsg_data(nlh); - struct nlattr *attrs[TSNIF_ATTR_MAX + 1]; - struct trans_handle *h = arg; struct trans_msg m; - genlmsg_parse(nlh, 0, attrs, TSNIF_ATTR_MAX, gnl_policy); - memset(&m, 0x0, sizeof(m)); + TSNIF_DEBUG("got error cb\n"); - if (attrs[TSNIF_ATTR_IDX]) - m.idx = nla_get_u32(attrs[TSNIF_ATTR_IDX]); + memset(&m, 0x0, sizeof(m)); - if (attrs[TSNIF_ATTR_TYPE]) - m.type = nla_get_u32(attrs[TSNIF_ATTR_TYPE]); - - m.cmd = ghdr->cmd; - - TSNIF_DEBUG("got cmd %d\n", m.cmd); - - switch(ghdr->cmd) { - case TSNIF_CMD_RELEASE: - case TSNIF_CMD_TTY_CREATE: - case TSNIF_CMD_TTY_RELEASE: - /* nothing to do, but not an error */ - break; - - case TSNIF_CMD_MGROUP: - case TSNIF_CMD_TGROUP: - m.group = nla_get_u32(attrs[TSNIF_ATTR_GROUP]); - break; - - case TSNIF_CMD_DATA: - { - m.data.ptr = nla_data(attrs[TSNIF_ATTR_DATA]); - m.data.len = nla_len(attrs[TSNIF_ATTR_DATA]); - m.data.flags = nla_get_u32(attrs[TSNIF_ATTR_FLAGS]); - break; + if (nlerr->error == TSNIF_OK) + m.ack = 1; + else { + m.err = 1; + m.error = nlerr->error; } - default: - /* we are not supposed to get anything else */ - return -1; - } + return process_cb(arg, &m, &nlerr->msg); +} + +static int parse_cb(struct nl_msg *msg, void *arg) +{ + struct trans_msg m; + + TSNIF_DEBUG("got parse cb\n"); + + memset(&m, 0x0, sizeof(m)); - return CB_RET(h->cb(h, &m)); + return process_cb(arg, &m, nlmsg_hdr(msg)); } static int set_no_enobufs(struct trans_handle *h) @@ -140,7 +122,6 @@ int trans_init(struct trans_handle *h, trans_cb_t cb) nl_socket_modify_cb(sock, NL_CB_VALID, NL_CB_CUSTOM, parse_cb, h); - nl_socket_modify_cb(sock, NL_CB_SEND_ACK, NL_CB_CUSTOM, ack_cb, h); nl_socket_modify_cb(sock, NL_CB_SEQ_CHECK, NL_CB_CUSTOM, seq_cb, h); nl_cb_err(nl_socket_get_cb(sock), NL_CB_CUSTOM, err_cb, h); |