summaryrefslogtreecommitdiffstats
path: root/src/trans-libnl.c
diff options
context:
space:
mode:
authorJiri Olsa <Jiri Olsa jolsa@redhat.com>2010-03-30 10:27:21 +0200
committerJiri Olsa <Jiri Olsa jolsa@redhat.com>2010-03-30 10:27:21 +0200
commit7f4dc168b6cfa82682a0235c4e426e43950ed1a9 (patch)
tree9f011a381024a3c19f9bd367b5468fbc545e6b1a /src/trans-libnl.c
parentb19b72eebbe375efe062c47468155d986db57c1f (diff)
downloadtsnif-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.c101
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);