<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/14064">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ccid_main_functionfs: Fix full chain of IN/OUT EP<br><br>which is already sufficient to make pcsc_scan happy and list all<br>eight cards/slots like<br><br>Reader 1: sysmoOCTSIM Test Reader [Osmocom CCID Interface] (2342) 01 00<br>  Event number: 0<br>  Card state: Card removed,<br><br>Change-Id: I37bd952ef0add662d565150f70e83d85ffd0c254<br>---<br>M ccid/ccid_device.c<br>M ccid/ccid_device.h<br>M ccid/ccid_main_functionfs.c<br>3 files changed, 51 insertions(+), 4 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/ccid/ccid_device.c b/ccid/ccid_device.c</span><br><span>index b7077df..e3705ae 100644</span><br><span>--- a/ccid/ccid_device.c</span><br><span>+++ b/ccid/ccid_device.c</span><br><span>@@ -157,7 +157,7 @@</span><br><span> /* Send given CCID message */</span><br><span> static int ccid_send(struct ccid_instance *ci, struct msgb *msg)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       return ci->ops.send_in(ci, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+   return ci->ops->send_in(ci, msg);</span><br><span> }</span><br><span> </span><br><span> /* Send given CCID message for given slot; patch bSlot into message */</span><br><span>@@ -717,3 +717,18 @@</span><br><span>    /* FIXME */</span><br><span>  return -1;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void ccid_instance_init(struct ccid_instance *ci, const struct ccid_ops *ops, const char *name,</span><br><span style="color: hsl(120, 100%, 40%);">+                    void *priv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i = 0; i < ARRAY_SIZE(ci->slot); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+            struct ccid_slot *cs = &ci->slot[i];</span><br><span style="color: hsl(120, 100%, 40%);">+           cs->slot_nr = i;</span><br><span style="color: hsl(120, 100%, 40%);">+           cs->ci = ci;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     ci->ops= ops;</span><br><span style="color: hsl(120, 100%, 40%);">+      ci->name = name;</span><br><span style="color: hsl(120, 100%, 40%);">+   ci->priv = priv;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/ccid/ccid_device.h b/ccid/ccid_device.h</span><br><span>index c7cef47..4cdb325 100644</span><br><span>--- a/ccid/ccid_device.h</span><br><span>+++ b/ccid/ccid_device.h</span><br><span>@@ -63,8 +63,12 @@</span><br><span>     /* slots within the reader */</span><br><span>        struct ccid_slot slot[NR_SLOTS];</span><br><span>     /* set of function pointers implementing specific operations */</span><br><span style="color: hsl(0, 100%, 40%);">- const struct ccid_ops ops;</span><br><span style="color: hsl(120, 100%, 40%);">+    const struct ccid_ops *ops;</span><br><span>  const char *name;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* user-supplied opaque data */</span><br><span style="color: hsl(120, 100%, 40%);">+       void *priv;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void ccid_instance_init(struct ccid_instance *ci, const struct ccid_ops *ops, const char *name,</span><br><span style="color: hsl(120, 100%, 40%);">+                        void *priv);</span><br><span> int ccid_handle_out(struct ccid_instance *ci, struct msgb *msg);</span><br><span>diff --git a/ccid/ccid_main_functionfs.c b/ccid/ccid_main_functionfs.c</span><br><span>index 84eb70c..2b57182 100644</span><br><span>--- a/ccid/ccid_main_functionfs.c</span><br><span>+++ b/ccid/ccid_main_functionfs.c</span><br><span>@@ -277,16 +277,19 @@</span><br><span>            } else if (fd == uh->ep_in.fd) {</span><br><span>                  /* IN endpoint AIO has completed. This means the IN transfer which</span><br><span>                    * we sent to the host has completed */</span><br><span style="color: hsl(120, 100%, 40%);">+                       msgb_free(uh->aio_in.msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                 uh->aio_in.msg = NULL;</span><br><span>            } else if (fd == uh->ep_out.fd) {</span><br><span>                         /* IN endpoint AIO has completed. This means the host has sent us</span><br><span>                     * some OUT data */</span><br><span style="color: hsl(0, 100%, 40%);">-                     //printf("\t%s\n", osmo_hexdump(uh->aio_out.buf, evt[i].res));</span><br><span style="color: hsl(0, 100%, 40%);">-                     //ccid_handle_out(uh->ccid_handle, uh->aio_out.buf, evt[i].res);</span><br><span>                       msgb_put(uh->aio_out.msg, evt[i].res);</span><br><span style="color: hsl(120, 100%, 40%);">+                     printf("\t%s\n", msgb_hexdump(uh->aio_out.msg));</span><br><span style="color: hsl(120, 100%, 40%);">+                 //ccid_handle_out(uh->ccid_handle, uh->aio_out.buf, evt[i].res);</span><br><span>                       ccid_handle_out(uh->ccid_handle, uh->aio_out.msg);</span><br><span>                     aio_refill_out(uh);</span><br><span>          }</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span> }</span><br><span> #endif</span><br><span> </span><br><span>@@ -353,12 +356,37 @@</span><br><span>         return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int ccid_ops_send_in(struct ccid_instance *ci, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct ufunc_handle *uh = ci->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct aio_help *ah = &uh->aio_in;</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* FIXME: does this work with multiple iocbs? probably not yet! */</span><br><span style="color: hsl(120, 100%, 40%);">+    ah->iocb = malloc(sizeof(struct iocb));</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(ah->iocb);</span><br><span style="color: hsl(120, 100%, 40%);">+     ah->msg = msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     io_prep_pwrite(ah->iocb, uh->ep_in.fd, msgb_data(msg), msgb_length(msg), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    io_set_eventfd(ah->iocb, uh->aio_evfd.fd);</span><br><span style="color: hsl(120, 100%, 40%);">+      rc = io_submit(uh->aio_ctx, 1, &ah->iocb);</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(rc >= 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct ccid_ops c_ops = {</span><br><span style="color: hsl(120, 100%, 40%);">+        .send_in = ccid_ops_send_in,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span> </span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span>         struct ufunc_handle ufh = (struct ufunc_handle) { 0, };</span><br><span style="color: hsl(120, 100%, 40%);">+       struct ccid_instance ci = (struct ccid_instance) { 0, };</span><br><span>     int rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   ccid_instance_init(&ci, &c_ops, "", &ufh);</span><br><span style="color: hsl(120, 100%, 40%);">+      ufh.ccid_handle = &ci;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         chdir(argv[1]);</span><br><span>      rc = ep0_init(&ufh);</span><br><span>     if (rc < 0) {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/14064">change 14064</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/14064"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ccid-firmware </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I37bd952ef0add662d565150f70e83d85ffd0c254 </div>
<div style="display:none"> Gerrit-Change-Number: 14064 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>