From 4a82cb02338751c047ab8cfd8c631ce0c3e3e6e3 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 13 Nov 2010 10:26:07 +0900 Subject: stemodem: Fix various coding style and logic issues with RTNL support --- drivers/stemodem/caif_rtnl.c | 68 ++++++++++++++++++++++++-------------------- drivers/stemodem/caif_rtnl.h | 5 ++-- 2 files changed, 40 insertions(+), 33 deletions(-) (limited to 'drivers/stemodem') diff --git a/drivers/stemodem/caif_rtnl.c b/drivers/stemodem/caif_rtnl.c index 4ce24017..5d4073a9 100644 --- a/drivers/stemodem/caif_rtnl.c +++ b/drivers/stemodem/caif_rtnl.c @@ -75,7 +75,7 @@ static struct iplink_req *find_request(guint32 seq) } static void parse_newlink_param(struct ifinfomsg *msg, int size, - int *ifindex, char *ifname) + int *index, char *ifname) { struct rtattr *attr; @@ -91,15 +91,15 @@ static void parse_newlink_param(struct ifinfomsg *msg, int size, } } - *ifindex = msg->ifi_index; + *index = msg->ifi_index; } static void parse_rtnl_message(const void *buf, size_t len) { struct ifinfomsg *msg; - struct iplink_req *req = NULL; + struct iplink_req *req; char ifname[IF_NAMESIZE]; - int ifindex; + int index; while (len > 0) { const struct nlmsghdr *hdr = buf; @@ -115,10 +115,10 @@ static void parse_rtnl_message(const void *buf, size_t len) msg = (struct ifinfomsg *) NLMSG_DATA(hdr); parse_newlink_param(msg, IFA_PAYLOAD(hdr), - &ifindex, ifname); + &index, ifname); if (req->callback) - req->callback(ifindex, ifname, req->user_data); + req->callback(index, ifname, req->user_data); break; case NLMSG_ERROR: @@ -127,10 +127,13 @@ static void parse_rtnl_message(const void *buf, size_t len) break; DBG("nlmsg error req"); + if (req->callback) req->callback(-1, ifname, req->user_data); break; + default: + req = NULL; break; } @@ -141,7 +144,6 @@ static void parse_rtnl_message(const void *buf, size_t len) pending_requests = g_slist_remove(pending_requests, req); g_free(req); - req = NULL; } } } @@ -167,7 +169,7 @@ static int add_attribute(struct nlmsghdr *n, unsigned int maxlen, int type, return 0; } -static void prep_rtnl_req(struct rtnl_msg *msg, int reqtype, guint seqnr) +static inline void prep_rtnl_req(struct rtnl_msg *msg, int reqtype, guint seqnr) { msg->n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); msg->n.nlmsg_flags = NLM_F_REQUEST|NLM_F_CREATE|NLM_F_EXCL; @@ -180,19 +182,20 @@ static gboolean netlink_event(GIOChannel *chan, GIOCondition cond, gpointer data) { unsigned char buf[RTNL_MSG_SIZE]; - int len; - int sk = g_io_channel_unix_get_fd(rtnl_channel); + int len, sk; if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR)) { rtnl_watch = 0; return FALSE; } - memset(buf, 0, sizeof(buf)); - len = recv(sk, (void *)&buf, sizeof(buf), MSG_DONTWAIT); + sk = g_io_channel_unix_get_fd(rtnl_channel); + + len = recv(sk, buf, sizeof(buf), MSG_DONTWAIT); if (len < 0) { if (len == -EAGAIN) return TRUE; + rtnl_watch = 0; return FALSE; } @@ -254,10 +257,10 @@ int caif_rtnl_create_interface(int type, int connid, int loop, { struct iplink_req *req; struct sockaddr_nl addr; - int err, sk; struct rtnl_msg msg; struct rtattr *linkinfo; struct rtattr *data_start; + int err, sk; req = g_try_new0(struct iplink_req, 1); if (req == NULL) @@ -286,51 +289,54 @@ int caif_rtnl_create_interface(int type, int connid, int loop, type, &connid, sizeof(connid)); break; - - case __IFLA_CAIF_UNSPEC: - case IFLA_CAIF_LOOPBACK: - case __IFLA_CAIF_MAX: + default: DBG("unsupported linktype"); + g_free(req); return -EINVAL; } - if (loop) { + if (loop) add_attribute(&msg.n, sizeof(msg), IFLA_CAIF_LOOPBACK, &loop, sizeof(loop)); - } data_start->rta_len = (void *)NLMSG_TAIL(&msg.n) - (void *)data_start; linkinfo->rta_len = (void *)NLMSG_TAIL(&msg.n) - (void *)linkinfo; memset(&addr, 0, sizeof(addr)); addr.nl_family = AF_NETLINK; + sk = g_io_channel_unix_get_fd(rtnl_channel); + err = sendto(sk, &msg, msg.n.nlmsg_len, 0, (struct sockaddr *) &addr, sizeof(addr)); - if (err < 0) - goto error; + if (err < 0) { + g_free(req); + return err; + } pending_requests = g_slist_append(pending_requests, req); - return 0; -error: - g_free(req); - return err; + return 0; } -int caif_rtnl_delete_interface(int ifid) +int caif_rtnl_delete_interface(int index) { struct sockaddr_nl addr; struct rtnl_msg msg; - int err; - int sk = g_io_channel_unix_get_fd(rtnl_channel); + int err, sk; + + if (index < 0) + return -EINVAL; + + sk = g_io_channel_unix_get_fd(rtnl_channel); - memset(&msg, 0, sizeof(msg)); - prep_rtnl_req(&msg, RTM_DELLINK, ++rtnl_seqnr); - msg.i.ifi_index = ifid; memset(&addr, 0, sizeof(addr)); addr.nl_family = AF_NETLINK; + memset(&msg, 0, sizeof(msg)); + prep_rtnl_req(&msg, RTM_DELLINK, ++rtnl_seqnr); + msg.i.ifi_index = index; + err = sendto(sk, &msg, msg.n.nlmsg_len, 0, (struct sockaddr *) &addr, sizeof(addr)); if (err < 0) diff --git a/drivers/stemodem/caif_rtnl.h b/drivers/stemodem/caif_rtnl.h index 9e44b086..a0093394 100644 --- a/drivers/stemodem/caif_rtnl.h +++ b/drivers/stemodem/caif_rtnl.h @@ -18,12 +18,13 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ -typedef void (*caif_rtnl_create_cb_t) (int ifindex, char *ifname, + +typedef void (*caif_rtnl_create_cb_t) (int index, const char *ifname, void *user_data); extern int caif_rtnl_create_interface(int type, int connid, int loop, caif_rtnl_create_cb_t cb, void *user_data); -extern int caif_rtnl_delete_interface(int ifid); +extern int caif_rtnl_delete_interface(int index); extern int caif_rtnl_init(void); extern void caif_rtnl_exit(void); -- cgit v1.2.3