From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: MIME-Version: 1.0 In-Reply-To: <1273486527-7855-7-git-send-email-sancane@gmail.com> References: <1273486527-7855-1-git-send-email-sancane@gmail.com> <1273486527-7855-2-git-send-email-sancane@gmail.com> <1273486527-7855-3-git-send-email-sancane@gmail.com> <1273486527-7855-4-git-send-email-sancane@gmail.com> <1273486527-7855-5-git-send-email-sancane@gmail.com> <1273486527-7855-6-git-send-email-sancane@gmail.com> <1273486527-7855-7-git-send-email-sancane@gmail.com> Date: Wed, 12 May 2010 11:16:15 -0300 Message-ID: Subject: Re: [PATCH 07/25] Initiate creation of MCLs From: Raul Herbster To: Santiago Carot-Nemesio Cc: linux-bluetooth@vger.kernel.org Content-Type: text/plain; charset=ISO-8859-1 Sender: linux-bluetooth-owner@vger.kernel.org List-ID: Hi Santiago 2010/5/10 Santiago Carot-Nemesio : > From: Santiago Carot Nemesio > > --- >  mcap/mcap.c |  115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >  1 files changed, 115 insertions(+), 0 deletions(-) > > diff --git a/mcap/mcap.c b/mcap/mcap.c > index ebfaf9e..0112154 100644 > --- a/mcap/mcap.c > +++ b/mcap/mcap.c > @@ -43,6 +43,12 @@ >        __mcl->tid = 0;                 \ >  } while(0) > > +struct connect_mcl { > +       struct mcap_mcl         *mcl;           /* MCL for this operation */ > +       mcap_mcl_connect_cb     connect_cb;     /* Connect callback */ > +       gpointer                user_data;      /* Callback user data */ > +}; > + >  /* MCAP finite state machine functions */ >  static void proc_req_connected(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len); >  static void proc_req_pending(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len); > @@ -419,6 +425,115 @@ fail: >        return FALSE; >  } > > +static void mcap_connect_mcl_cb(GIOChannel *chan, GError *conn_err, > +                                                       gpointer user_data) > +{ > +       char dstaddr[18]; > +       struct connect_mcl *con = user_data; > +       struct mcap_mcl *aux, *mcl = con->mcl; > +       mcap_mcl_connect_cb connect_cb = con->connect_cb; > +       gpointer data = con->user_data; > +       GError *gerr = NULL; > + > +       g_free(con); > + > +       mcl->ctrl &= ~MCAP_CTRL_CONN; > + > +       if (conn_err) { > +               if (mcl->ctrl & MCAP_CTRL_FREE) > +                       mcl->ms->mcl_uncached_cb(mcl, mcl->ms->user_data); > +               mcap_mcl_check_del(mcl); > +               connect_cb(NULL, conn_err, data); > +               return; > +       } > + > +       ba2str(&mcl->addr, dstaddr); > + > +       aux = find_mcl(mcl->ms->mcls, &mcl->addr); > +       if (aux) { > +               /* Double MCL connection case */ > +               if (aux != mcl) { > +                       /* This MCL was not in cache */ > +                       mcap_mcl_unref(mcl); > +               } > +               error("MCL error: Device %s is already connected", dstaddr); > +               g_set_error(&gerr, MCAP_ERROR, MCAP_ERROR_ALREADY_EXISTS, > +                               "MCL %s is already connected", dstaddr); > +               connect_cb(NULL, gerr, data); > +               g_error_free(gerr); > +               return; > +       } > + > +       mcl->state = MCL_CONNECTED; > +       mcl->role = MCL_INITIATOR; > +       mcl->req = MCL_AVAILABLE; > +       mcl->ctrl |= MCAP_CTRL_STD_OP; > + > +       if (mcl->ctrl & MCAP_CTRL_CACHED) > +               mcap_uncache_mcl(mcl); > +       else > +               mcl->ms->mcls = g_slist_prepend(mcl->ms->mcls, mcl); > + > +       mcl->wid = g_io_add_watch(mcl->cc, G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL, > +                               (GIOFunc) mcl_control_cb, mcl); More than 80 characters. []´s --Raul