{"action":"created","comment":{"url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/comments/30282570","id":30282570,"diff_hunk":"@@ -0,0 +1,676 @@\n+/*\n+ * Copyright (C) 2015 Freie Universität Berlin\n+ *\n+ * This file is subject to the terms and conditions of the GNU Lesser\n+ * General Public License v2.1. See the file LICENSE in the top level\n+ * directory for more details.\n+ */\n+\n+/**\n+ * @ingroup     drivers_ng_at86rf2xx\n+ * @{\n+ *\n+ * @file\n+ * @brief       Netdev adaption for the AT86RF2xx drivers\n+ *\n+ * @author      Thomas Eichinger <thomas.eichinger@fu-berlin.de>\n+ * @author      Hauke Petersen <hauke.petersen@fu-berlin.de>\n+ *\n+ * @}\n+ */\n+\n+#include \"net/ng_ieee802154.h\"\n+#include \"net/ng_netbase.h\"\n+#include \"ng_at86rf2xx.h\"\n+#include \"ng_at86rf2xx_netdev.h\"\n+#include \"ng_at86rf2xx_internal.h\"\n+#include \"ng_at86rf2xx_registers.h\"\n+\n+#define ENABLE_DEBUG (0)\n+#include \"debug.h\"\n+\n+/* TODO: generalize and move to ng_ieee802154 */\n+static size_t _make_data_frame_hdr(ng_at86rf2xx_t *dev, uint8_t *buf,\n+                                   ng_netif_hdr_t *hdr)\n+{\n+    int pos = 0;\n+\n+    /* we are building a data frame here */\n+    buf[0] = NG_IEEE802154_FCF_TYPE_DATA;\n+    buf[1] = 0x88;      /* use short src and dst addresses as starting point */\n+\n+    /* if AUTOACK is enabled, then we also expect ACKs for this packet */\n+    if (dev->options & NG_AT86RF2XX_OPT_AUTOACK) {\n+        buf[0] |= NG_IEEE802154_FCF_ACK_REQ;\n+    }\n+\n+    /* fill in destination PAN ID */\n+    pos = 3;\n+    buf[pos++] = (uint8_t)((dev->pan) & 0xff);\n+    buf[pos++] = (uint8_t)((dev->pan) >> 8);\n+\n+    /* fill in destination address */\n+    if (hdr->flags &\n+        (NG_NETIF_HDR_FLAGS_BROADCAST | NG_NETIF_HDR_FLAGS_MULTICAST)) {\n+        buf[pos++] = 0xff;\n+        buf[pos++] = 0xff;\n+    }\n+    else if (hdr->dst_l2addr_len == 2) {\n+        uint8_t *dst_addr = ng_netif_hdr_get_dst_addr(hdr);\n+        buf[pos++] = dst_addr[1];\n+        buf[pos++] = dst_addr[0];\n+    }\n+    else if (hdr->dst_l2addr_len == 8) {\n+        buf[1] |= 0x04;\n+        uint8_t *dst_addr = ng_netif_hdr_get_dst_addr(hdr);\n+        for (int i = 7;  i >= 0; i--) {\n+            buf[pos++] = dst_addr[i];\n+        }\n+    }\n+    else {\n+        /* unsupported address length */\n+        return 0;\n+    }\n+\n+    /* fill in source PAN ID (if applicable */\n+    if (dev->options & NG_AT86RF2XX_OPT_USE_SRC_PAN) {\n+        buf[pos++] = (uint8_t)((dev->pan) & 0xff);\n+        buf[pos++] = (uint8_t)((dev->pan) >> 8);\n+    } else {\n+        buf[0] |= NG_IEEE802154_FCF_PAN_COMP;\n+    }\n+\n+    /* fill in source address */\n+    if (dev->options & NG_AT86RF2XX_OPT_SRC_ADDR_LONG) {\n+        buf[1] |= 0x40;\n+        memcpy(&(buf[pos]), dev->addr_long, 8);\n+        pos += 8;\n+    }\n+    else {\n+        buf[pos++] = dev->addr_short[0];\n+        buf[pos++] = dev->addr_short[1];\n+    }\n+\n+    /* set sequence number */\n+    buf[2] = dev->seq_nr++;\n+    /* return actual header length */\n+    return pos;\n+}\n+\n+/* TODO: generalize and move to ng_ieee802154 */\n+/* TODO: include security header implications */\n+static size_t _get_frame_hdr_len(uint8_t *mhr)\n+{\n+    uint8_t tmp;\n+    size_t len = 3;\n+\n+    /* figure out address sizes */\n+    tmp = (mhr[1] & NG_IEEE802154_FCF_DST_ADDR_MASK);\n+    if (tmp == NG_IEEE802154_FCF_DST_ADDR_SHORT) {\n+        len += 4;\n+    }\n+    else if (tmp == NG_IEEE802154_FCF_DST_ADDR_LONG) {\n+        len += 10;\n+    }\n+    else if (tmp != NG_IEEE802154_FCF_DST_ADDR_VOID) {\n+        return 0;\n+    }\n+    tmp = (mhr[1] & NG_IEEE802154_FCF_SRC_ADDR_MASK);\n+    if (tmp == NG_IEEE802154_FCF_SRC_ADDR_VOID) {\n+        return len;\n+    }\n+    else {\n+        if (!(mhr[0] & NG_IEEE802154_FCF_PAN_COMP)) {\n+            len += 2;\n+        }\n+        if (tmp == NG_IEEE802154_FCF_SRC_ADDR_SHORT) {\n+            return (len + 2);\n+        }\n+        else if (tmp == NG_IEEE802154_FCF_SRC_ADDR_LONG) {\n+            return (len + 8);\n+        }\n+    }\n+    return 0;\n+}\n+\n+/* TODO: generalize and move to ng_ieee802154 */\n+static ng_pktsnip_t *_make_netif_hdr(uint8_t *mhr)\n+{\n+    uint8_t tmp;\n+    uint8_t *addr;\n+    uint8_t src_len, dst_len;\n+    ng_pktsnip_t *snip;\n+    ng_netif_hdr_t *hdr;\n+\n+    /* figure out address sizes */\n+    tmp = mhr[1] & NG_IEEE802154_FCF_SRC_ADDR_MASK;\n+    if (tmp == NG_IEEE802154_FCF_SRC_ADDR_SHORT) {\n+        src_len = 2;\n+    }\n+    else if (tmp == NG_IEEE802154_FCF_SRC_ADDR_LONG) {\n+        src_len = 8;\n+    }\n+    else if (tmp == 0) {\n+        src_len = 0;\n+    }\n+    else {\n+        return NULL;\n+    }\n+    tmp = mhr[1] & NG_IEEE802154_FCF_DST_ADDR_MASK;\n+    if (tmp == NG_IEEE802154_FCF_DST_ADDR_SHORT) {\n+        dst_len = 2;\n+    }\n+    else if (tmp == NG_IEEE802154_FCF_DST_ADDR_LONG) {\n+        dst_len = 8;\n+    }\n+    else if (tmp == 0) {\n+        dst_len = 0;\n+    }\n+    else {\n+        return NULL;\n+    }\n+    /* allocate space for header */\n+    snip = ng_pktbuf_add(NULL, NULL, sizeof(ng_netif_hdr_t) + src_len + dst_len,\n+                         NG_NETTYPE_NETIF);\n+    if (snip == NULL) {\n+        return NULL;\n+    }\n+    /* fill header */\n+    hdr = (ng_netif_hdr_t *)snip->data;\n+    ng_netif_hdr_init(hdr, src_len, dst_len);\n+    if (dst_len > 0) {\n+        tmp = 5 + dst_len;\n+        addr = ng_netif_hdr_get_dst_addr(hdr);\n+        for (int i = 0; i < dst_len; i++) {\n+            addr[i] = mhr[5 + (dst_len - i) - 1];\n+        }\n+    }\n+    else {\n+        tmp = 3;\n+    }\n+    if (!(mhr[0] & NG_IEEE802154_FCF_PAN_COMP)) {\n+        tmp += 2;\n+    }\n+    if (src_len > 0) {\n+        addr = ng_netif_hdr_get_src_addr(hdr);\n+        for (int i = 0; i < src_len; i++) {\n+            addr[i] = mhr[tmp + (src_len - i) - 1];\n+        }\n+    }\n+    return snip;\n+}\n+\n+\n+static int _send(ng_netdev_t *netdev, ng_pktsnip_t *pkt)\n+{\n+    ng_at86rf2xx_t *dev = (ng_at86rf2xx_t *)netdev;\n+    ng_pktsnip_t *snip;\n+    uint8_t mhr[NG_IEEE802154_MAX_HDR_LEN];\n+    size_t len;\n+\n+    if (pkt == NULL) {\n+        return -ENOMSG;\n+    }\n+    if (dev == NULL) {\n+        ng_pktbuf_release(pkt);\n+        return -ENODEV;\n+    }\n+\n+    /* create 802.15.4 header */\n+    len = _make_data_frame_hdr(dev, mhr, (ng_netif_hdr_t *)pkt->data);\n+    if (len == 0) {\n+        DEBUG(\"[ng_at86rf2xx] error: unable to create 802.15.4 header\\n\");\n+        ng_pktbuf_release(pkt);\n+        return -ENOMSG;\n+    }\n+    /* check if packet (header + payload + FCS) fits into FIFO */\n+    snip = pkt->next;\n+    if ((ng_pkt_len(snip) + len + 2) > NG_AT86RF2XX_MAX_PKT_LENGTH) {\n+        DEBUG(\"[ng_at86rf2xx] error: packet too large to be send\\n\");\n+        ng_pktbuf_release(pkt);\n+        return -EOVERFLOW;\n+    }\n+\n+    ng_at86rf2xx_tx_prepare(dev);\n+    /* put header into FIFO */\n+    len = ng_at86rf2xx_tx_load(dev, mhr, len, 0);\n+    /* load packet data into FIFO */\n+    while (snip) {\n+        len += ng_at86rf2xx_tx_load(dev, snip->data, snip->size, len);\n+        snip = snip->next;\n+    }\n+    /* send data out directly if pre-loading id disabled */\n+    if (!(dev->options & NG_AT86RF2XX_OPT_PRELOADING)) {\n+        ng_at86rf2xx_tx_exec(dev);\n+    }\n+    /* release packet */\n+    ng_pktbuf_release(pkt);\n+    /* return the number of bytes that were actually send out */\n+    return (int)len;\n+}\n+\n+static void _receive_data(ng_at86rf2xx_t *dev)\n+{\n+    uint8_t mhr[NG_IEEE802154_MAX_HDR_LEN];\n+    size_t pkt_len, hdr_len;\n+    ng_pktsnip_t *hdr, *payload = NULL;\n+    ng_netif_hdr_t *netif;\n+\n+    /* get the size of the received packet (unlocks frame buffer protection) */\n+    pkt_len = ng_at86rf2xx_rx_len(dev);\n+\n+    /* abort here already if no event callback is registered */\n+    if (!dev->event_cb) {\n+        return;\n+    }\n+\n+    /* in raw mode, just read the binary dump into the packet buffer */\n+    if (dev->options & NG_AT86RF2XX_OPT_RAWDUMP) {\n+        payload = ng_pktbuf_add(NULL, NULL, pkt_len, NG_NETTYPE_UNDEF);\n+        if (payload == NULL ) {\n+            DEBUG(\"[ng_at86rf2xx] error: unable to allocate RAW data\\n\");\n+            return;\n+        }\n+        ng_at86rf2xx_rx_read(dev, payload->data, pkt_len, 0);\n+        dev->event_cb(NETDEV_EVENT_RX_COMPLETE, payload);\n+        return;\n+    }\n+\n+    /* get FCF field and compute 802.15.4 header length */\n+    ng_at86rf2xx_rx_read(dev, mhr, 2, 0);\n+    hdr_len = _get_frame_hdr_len(mhr);\n+    if (hdr_len == 0) {\n+        DEBUG(\"[ng_at86rf2xx] error: unable parse incoming frame header\\n\");\n+        return;\n+    }\n+    /* read the rest of the header and parse the netif header from it */\n+    ng_at86rf2xx_rx_read(dev, &(mhr[2]), hdr_len - 2, 2);\n+    hdr = _make_netif_hdr(mhr);\n+    if (hdr == NULL) {\n+        DEBUG(\"[ng_at86rf2xx] error: unable to allocate netif header\\n\");\n+        return;\n+    }\n+    /* fill missing fields in netif header */\n+    netif = (ng_netif_hdr_t *)hdr->data;\n+    netif->if_pid = dev->mac_pid;\n+    ng_at86rf2xx_rx_read(dev, &(netif->lqi), 1, pkt_len);\n+    netif->rssi = ng_at86rf2xx_reg_read(dev, NG_AT86RF2XX_REG__PHY_ED_LEVEL);\n+\n+    /* allocate payload */\n+    payload = ng_pktbuf_add(hdr, NULL, (pkt_len - hdr_len), dev->proto);\n+    if (payload == NULL) {\n+        DEBUG(\"[ng_at86rf2xx] error: unable to allocate incoming payload\\n\");\n+        ng_pktbuf_release(hdr);\n+        return;\n+    }\n+    /* copy payload */\n+    ng_at86rf2xx_rx_read(dev, payload->data, payload->size, hdr_len);\n+    /* finish up and send data to upper layers */\n+    dev->event_cb(NETDEV_EVENT_RX_COMPLETE, payload);\n+}\n+\n+static int _set_state(ng_at86rf2xx_t *dev, ng_netconf_state_t state)\n+{\n+    switch (state) {\n+        case NETCONF_STATE_SLEEP:\n+            ng_at86rf2xx_set_state(dev, NG_AT86RF2XX_STATE_TRX_OFF);\n+            break;\n+        case NETCONF_STATE_IDLE:\n+            ng_at86rf2xx_set_state(dev, NG_AT86RF2XX_STATE_RX_AACK_ON);\n+            break;\n+        case NETCONF_STATE_TX:\n+            if (dev->options & NG_AT86RF2XX_OPT_PRELOADING) {\n+                ng_at86rf2xx_tx_exec(dev);\n+            }\n+            break;\n+        case NETCONF_STATE_RESET:\n+            ng_at86rf2xx_reset(dev);\n+            break;\n+        default:\n+            return -ENOTSUP;\n+    }\n+    return sizeof(ng_netconf_state_t);\n+}\n+\n+ng_netconf_state_t _get_state(ng_at86rf2xx_t *dev)\n+{\n+    switch (ng_at86rf2xx_get_state(dev)) {\n+        case NG_AT86RF2XX_STATE_SLEEP:\n+            return NETCONF_STATE_SLEEP;\n+        case NG_AT86RF2XX_STATE_BUSY_RX_AACK:\n+            return NETCONF_STATE_RX;\n+        case NG_AT86RF2XX_STATE_BUSY_TX_ARET:\n+        case NG_AT86RF2XX_STATE_TX_ARET_ON:\n+            return NETCONF_STATE_TX;\n+        case NG_AT86RF2XX_STATE_RX_AACK_ON:\n+        default:\n+            return NETCONF_STATE_IDLE;\n+    }\n+}\n+\n+static int _get(ng_netdev_t *device, ng_netconf_opt_t opt,\n+                void *val, size_t max_len)\n+{\n+    if (device == NULL) {\n+        return -ENODEV;\n+    }\n+    ng_at86rf2xx_t *dev = (ng_at86rf2xx_t *) device;\n+\n+    switch (opt) {\n+\n+        case NETCONF_OPT_ADDRESS:\n+            if (max_len < sizeof(uint16_t)) {\n+                return -EOVERFLOW;\n+            }\n+            *((uint16_t *)val) = ng_at86rf2xx_get_addr_short(dev);\n+            return sizeof(uint16_t);\n+\n+        case NETCONF_OPT_ADDRESS_LONG:\n+            if (max_len < sizeof(uint64_t)) {\n+                return -EOVERFLOW;\n+            }\n+            *((uint64_t *)val) = ng_at86rf2xx_get_addr_long(dev);\n+            return sizeof(uint64_t);\n+\n+        case NETCONF_OPT_ADDR_LEN:\n+            if (max_len < sizeof(uint16_t)) {\n+                return -EOVERFLOW;\n+            }\n+            *((uint16_t *)val) = 2;\n+            return sizeof(uint16_t);\n+\n+        case NETCONF_OPT_SRC_LEN:\n+            if (max_len < sizeof(uint16_t)) {\n+                return -EOVERFLOW;\n+            }\n+            if (dev->options & NG_AT86RF2XX_OPT_SRC_ADDR_LONG) {\n+                *((uint16_t *)val) = 8;\n+            }\n+            else {\n+                *((uint16_t *)val) = 2;\n+            }\n+            return sizeof(uint16_t);\n+\n+        case NETCONF_OPT_NID:\n+            if (max_len < sizeof(uint16_t)) {\n+                return -EOVERFLOW;\n+            }\n+            *((uint16_t *)val) = dev->pan;\n+            return sizeof(uint16_t);\n+\n+        case NETCONF_OPT_CHANNEL:\n+            if (max_len < sizeof(uint16_t)) {\n+                return -EOVERFLOW;\n+            }\n+            ((uint8_t *)val)[1] = 0;\n+            ((uint8_t *)val)[0] = ng_at86rf2xx_get_chan(dev);\n+            return sizeof(uint16_t);\n+\n+        case NETCONF_OPT_TX_POWER:\n+            if (max_len < sizeof(int16_t)) {\n+                return -EOVERFLOW;\n+            }\n+            *((uint16_t *)val) = ng_at86rf2xx_get_txpower(dev);\n+            return sizeof(uint16_t);\n+\n+        case NETCONF_OPT_MAX_PACKET_SIZE:\n+            if (max_len < sizeof(int16_t)) {\n+                return -EOVERFLOW;\n+            }\n+            *((uint16_t *)val) = NG_AT86RF2XX_MAX_PKT_LENGTH;","path":"drivers/ng_at86rf2xx/ng_at86rf2xx_netdev.c","position":420,"original_position":420,"commit_id":"4e121e1b17ef0e4fb7ea431ac00a0d5f2a900c2e","original_commit_id":"4e121e1b17ef0e4fb7ea431ac00a0d5f2a900c2e","user":{"login":"PeterKietzmann","id":7765855,"avatar_url":"https://avatars.githubusercontent.com/u/7765855?v=3","gravatar_id":"","url":"https://api.github.com/users/PeterKietzmann","html_url":"https://github.com/PeterKietzmann","followers_url":"https://api.github.com/users/PeterKietzmann/followers","following_url":"https://api.github.com/users/PeterKietzmann/following{/other_user}","gists_url":"https://api.github.com/users/PeterKietzmann/gists{/gist_id}","starred_url":"https://api.github.com/users/PeterKietzmann/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PeterKietzmann/subscriptions","organizations_url":"https://api.github.com/users/PeterKietzmann/orgs","repos_url":"https://api.github.com/users/PeterKietzmann/repos","events_url":"https://api.github.com/users/PeterKietzmann/events{/privacy}","received_events_url":"https://api.github.com/users/PeterKietzmann/received_events","type":"User","site_admin":false},"body":"You are returning the full 802.15.4 packet length here without taking care of the 802.15.4 header that also has to be appended.","created_at":"2015-05-13T22:28:02Z","updated_at":"2015-05-13T22:28:02Z","html_url":"https://github.com/RIOT-OS/RIOT/pull/2825#discussion_r30282570","pull_request_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2825","_links":{"self":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/comments/30282570"},"html":{"href":"https://github.com/RIOT-OS/RIOT/pull/2825#discussion_r30282570"},"pull_request":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2825"}}},"pull_request":{"url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2825","id":33478420,"html_url":"https://github.com/RIOT-OS/RIOT/pull/2825","diff_url":"https://github.com/RIOT-OS/RIOT/pull/2825.diff","patch_url":"https://github.com/RIOT-OS/RIOT/pull/2825.patch","issue_url":"https://api.github.com/repos/RIOT-OS/RIOT/issues/2825","number":2825,"state":"closed","locked":false,"title":"drivers: new driver for at86rf2xx radios","user":{"login":"haukepetersen","id":620834,"avatar_url":"https://avatars.githubusercontent.com/u/620834?v=3","gravatar_id":"","url":"https://api.github.com/users/haukepetersen","html_url":"https://github.com/haukepetersen","followers_url":"https://api.github.com/users/haukepetersen/followers","following_url":"https://api.github.com/users/haukepetersen/following{/other_user}","gists_url":"https://api.github.com/users/haukepetersen/gists{/gist_id}","starred_url":"https://api.github.com/users/haukepetersen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/haukepetersen/subscriptions","organizations_url":"https://api.github.com/users/haukepetersen/orgs","repos_url":"https://api.github.com/users/haukepetersen/repos","events_url":"https://api.github.com/users/haukepetersen/events{/privacy}","received_events_url":"https://api.github.com/users/haukepetersen/received_events","type":"User","site_admin":false},"body":"this PR is the continuation of @thomaseichinger's work started in #2650.\r\n\r\n~~Tested (and working) with the `iot-lab_M3` (`at86rf321`). With the `iot-lab_M3` it should be possible with this PR at the current state to run the new network stack -> happy testing :-)~~\r\n\r\nUpdate: driver should be stable with `iot-lab_M3` and `samr21-xpro` - also tested successfully against the Xbee S1 and validated packets against Wireshark.\r\n\r\n~~Receiving also works with the `samr32-xpro` (`at86rf233`), here the sending still has problems -> will fix this next week.~~\r\n\r\nI heavily restructured the code again -> the goal was to separate the drivers internals from the 'netdev' adaption to a large extend. This is not completely clean -> especially when receiving data there are still some fixed references into `netdev`...\r\n\r\nSome more known issues:\r\n - the RSSI seems to be faulty\r\n - ~~enabling/disabling of AUTOACK, CSMA, PROMISCUOUS-Mode is missing~~\r\n - ~~a lot of doxygen documentation is missing~~\r\n - ~~some doxygen is still wrong (copy/paste)~~\r\n - the IEEE802.15.4 frame header creation/parsing is not cleanly separated from the driver, yet\r\n - ~~probably more...~~\r\n","created_at":"2015-04-16T18:21:29Z","updated_at":"2015-05-13T22:28:02Z","closed_at":"2015-04-28T11:12:11Z","merged_at":"2015-04-28T11:12:11Z","merge_commit_sha":"3f2a154f9de78a774424e587a529657c6e48b0ff","assignee":{"login":"bapclenet","id":4921425,"avatar_url":"https://avatars.githubusercontent.com/u/4921425?v=3","gravatar_id":"","url":"https://api.github.com/users/bapclenet","html_url":"https://github.com/bapclenet","followers_url":"https://api.github.com/users/bapclenet/followers","following_url":"https://api.github.com/users/bapclenet/following{/other_user}","gists_url":"https://api.github.com/users/bapclenet/gists{/gist_id}","starred_url":"https://api.github.com/users/bapclenet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bapclenet/subscriptions","organizations_url":"https://api.github.com/users/bapclenet/orgs","repos_url":"https://api.github.com/users/bapclenet/repos","events_url":"https://api.github.com/users/bapclenet/events{/privacy}","received_events_url":"https://api.github.com/users/bapclenet/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/RIOT-OS/RIOT/milestones/11","html_url":"https://github.com/RIOT-OS/RIOT/milestones/Network%20Stack%20Task%20Force","labels_url":"https://api.github.com/repos/RIOT-OS/RIOT/milestones/11/labels","id":968921,"number":11,"title":"Network Stack Task Force","description":"The goal of this milestone is to implement the redesign of the network stack.\r\n\r\nTodo list at #2278.","creator":{"login":"OlegHahm","id":1590423,"avatar_url":"https://avatars.githubusercontent.com/u/1590423?v=3","gravatar_id":"","url":"https://api.github.com/users/OlegHahm","html_url":"https://github.com/OlegHahm","followers_url":"https://api.github.com/users/OlegHahm/followers","following_url":"https://api.github.com/users/OlegHahm/following{/other_user}","gists_url":"https://api.github.com/users/OlegHahm/gists{/gist_id}","starred_url":"https://api.github.com/users/OlegHahm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OlegHahm/subscriptions","organizations_url":"https://api.github.com/users/OlegHahm/orgs","repos_url":"https://api.github.com/users/OlegHahm/repos","events_url":"https://api.github.com/users/OlegHahm/events{/privacy}","received_events_url":"https://api.github.com/users/OlegHahm/received_events","type":"User","site_admin":false},"open_issues":21,"closed_issues":110,"state":"open","created_at":"2015-02-06T16:04:53Z","updated_at":"2015-05-13T09:05:40Z","due_on":"2015-04-29T22:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2825/commits","review_comments_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2825/comments","review_comment_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/comments{/number}","comments_url":"https://api.github.com/repos/RIOT-OS/RIOT/issues/2825/comments","statuses_url":"https://api.github.com/repos/RIOT-OS/RIOT/statuses/4e121e1b17ef0e4fb7ea431ac00a0d5f2a900c2e","head":{"label":"haukepetersen:opt_driver_rf2xx","ref":"opt_driver_rf2xx","sha":"4e121e1b17ef0e4fb7ea431ac00a0d5f2a900c2e","user":{"login":"haukepetersen","id":620834,"avatar_url":"https://avatars.githubusercontent.com/u/620834?v=3","gravatar_id":"","url":"https://api.github.com/users/haukepetersen","html_url":"https://github.com/haukepetersen","followers_url":"https://api.github.com/users/haukepetersen/followers","following_url":"https://api.github.com/users/haukepetersen/following{/other_user}","gists_url":"https://api.github.com/users/haukepetersen/gists{/gist_id}","starred_url":"https://api.github.com/users/haukepetersen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/haukepetersen/subscriptions","organizations_url":"https://api.github.com/users/haukepetersen/orgs","repos_url":"https://api.github.com/users/haukepetersen/repos","events_url":"https://api.github.com/users/haukepetersen/events{/privacy}","received_events_url":"https://api.github.com/users/haukepetersen/received_events","type":"User","site_admin":false},"repo":{"id":13741766,"name":"RIOT","full_name":"haukepetersen/RIOT","owner":{"login":"haukepetersen","id":620834,"avatar_url":"https://avatars.githubusercontent.com/u/620834?v=3","gravatar_id":"","url":"https://api.github.com/users/haukepetersen","html_url":"https://github.com/haukepetersen","followers_url":"https://api.github.com/users/haukepetersen/followers","following_url":"https://api.github.com/users/haukepetersen/following{/other_user}","gists_url":"https://api.github.com/users/haukepetersen/gists{/gist_id}","starred_url":"https://api.github.com/users/haukepetersen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/haukepetersen/subscriptions","organizations_url":"https://api.github.com/users/haukepetersen/orgs","repos_url":"https://api.github.com/users/haukepetersen/repos","events_url":"https://api.github.com/users/haukepetersen/events{/privacy}","received_events_url":"https://api.github.com/users/haukepetersen/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/haukepetersen/RIOT","description":"RIOT OS -  The revolutionary IoT OS","fork":true,"url":"https://api.github.com/repos/haukepetersen/RIOT","forks_url":"https://api.github.com/repos/haukepetersen/RIOT/forks","keys_url":"https://api.github.com/repos/haukepetersen/RIOT/keys{/key_id}","collaborators_url":"https://api.github.com/repos/haukepetersen/RIOT/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/haukepetersen/RIOT/teams","hooks_url":"https://api.github.com/repos/haukepetersen/RIOT/hooks","issue_events_url":"https://api.github.com/repos/haukepetersen/RIOT/issues/events{/number}","events_url":"https://api.github.com/repos/haukepetersen/RIOT/events","assignees_url":"https://api.github.com/repos/haukepetersen/RIOT/assignees{/user}","branches_url":"https://api.github.com/repos/haukepetersen/RIOT/branches{/branch}","tags_url":"https://api.github.com/repos/haukepetersen/RIOT/tags","blobs_url":"https://api.github.com/repos/haukepetersen/RIOT/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/haukepetersen/RIOT/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/haukepetersen/RIOT/git/refs{/sha}","trees_url":"https://api.github.com/repos/haukepetersen/RIOT/git/trees{/sha}","statuses_url":"https://api.github.com/repos/haukepetersen/RIOT/statuses/{sha}","languages_url":"https://api.github.com/repos/haukepetersen/RIOT/languages","stargazers_url":"https://api.github.com/repos/haukepetersen/RIOT/stargazers","contributors_url":"https://api.github.com/repos/haukepetersen/RIOT/contributors","subscribers_url":"https://api.github.com/repos/haukepetersen/RIOT/subscribers","subscription_url":"https://api.github.com/repos/haukepetersen/RIOT/subscription","commits_url":"https://api.github.com/repos/haukepetersen/RIOT/commits{/sha}","git_commits_url":"https://api.github.com/repos/haukepetersen/RIOT/git/commits{/sha}","comments_url":"https://api.github.com/repos/haukepetersen/RIOT/comments{/number}","issue_comment_url":"https://api.github.com/repos/haukepetersen/RIOT/issues/comments{/number}","contents_url":"https://api.github.com/repos/haukepetersen/RIOT/contents/{+path}","compare_url":"https://api.github.com/repos/haukepetersen/RIOT/compare/{base}...{head}","merges_url":"https://api.github.com/repos/haukepetersen/RIOT/merges","archive_url":"https://api.github.com/repos/haukepetersen/RIOT/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/haukepetersen/RIOT/downloads","issues_url":"https://api.github.com/repos/haukepetersen/RIOT/issues{/number}","pulls_url":"https://api.github.com/repos/haukepetersen/RIOT/pulls{/number}","milestones_url":"https://api.github.com/repos/haukepetersen/RIOT/milestones{/number}","notifications_url":"https://api.github.com/repos/haukepetersen/RIOT/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/haukepetersen/RIOT/labels{/name}","releases_url":"https://api.github.com/repos/haukepetersen/RIOT/releases{/id}","created_at":"2013-10-21T12:31:38Z","updated_at":"2015-03-02T09:15:38Z","pushed_at":"2015-05-13T09:23:52Z","git_url":"git://github.com/haukepetersen/RIOT.git","ssh_url":"git@github.com:haukepetersen/RIOT.git","clone_url":"https://github.com/haukepetersen/RIOT.git","svn_url":"https://github.com/haukepetersen/RIOT","homepage":"https://github.com/RIOT-OS/RIOT/wiki","size":19261,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2,"mirror_url":null,"open_issues_count":0,"forks":2,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"RIOT-OS:master","ref":"master","sha":"f12f19917c913e322304569257c358370418a714","user":{"login":"RIOT-OS","id":3079480,"avatar_url":"https://avatars.githubusercontent.com/u/3079480?v=3","gravatar_id":"","url":"https://api.github.com/users/RIOT-OS","html_url":"https://github.com/RIOT-OS","followers_url":"https://api.github.com/users/RIOT-OS/followers","following_url":"https://api.github.com/users/RIOT-OS/following{/other_user}","gists_url":"https://api.github.com/users/RIOT-OS/gists{/gist_id}","starred_url":"https://api.github.com/users/RIOT-OS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RIOT-OS/subscriptions","organizations_url":"https://api.github.com/users/RIOT-OS/orgs","repos_url":"https://api.github.com/users/RIOT-OS/repos","events_url":"https://api.github.com/users/RIOT-OS/events{/privacy}","received_events_url":"https://api.github.com/users/RIOT-OS/received_events","type":"Organization","site_admin":false},"repo":{"id":7370241,"name":"RIOT","full_name":"RIOT-OS/RIOT","owner":{"login":"RIOT-OS","id":3079480,"avatar_url":"https://avatars.githubusercontent.com/u/3079480?v=3","gravatar_id":"","url":"https://api.github.com/users/RIOT-OS","html_url":"https://github.com/RIOT-OS","followers_url":"https://api.github.com/users/RIOT-OS/followers","following_url":"https://api.github.com/users/RIOT-OS/following{/other_user}","gists_url":"https://api.github.com/users/RIOT-OS/gists{/gist_id}","starred_url":"https://api.github.com/users/RIOT-OS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RIOT-OS/subscriptions","organizations_url":"https://api.github.com/users/RIOT-OS/orgs","repos_url":"https://api.github.com/users/RIOT-OS/repos","events_url":"https://api.github.com/users/RIOT-OS/events{/privacy}","received_events_url":"https://api.github.com/users/RIOT-OS/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/RIOT-OS/RIOT","description":"RIOT -  The friendly OS for IoT","fork":false,"url":"https://api.github.com/repos/RIOT-OS/RIOT","forks_url":"https://api.github.com/repos/RIOT-OS/RIOT/forks","keys_url":"https://api.github.com/repos/RIOT-OS/RIOT/keys{/key_id}","collaborators_url":"https://api.github.com/repos/RIOT-OS/RIOT/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/RIOT-OS/RIOT/teams","hooks_url":"https://api.github.com/repos/RIOT-OS/RIOT/hooks","issue_events_url":"https://api.github.com/repos/RIOT-OS/RIOT/issues/events{/number}","events_url":"https://api.github.com/repos/RIOT-OS/RIOT/events","assignees_url":"https://api.github.com/repos/RIOT-OS/RIOT/assignees{/user}","branches_url":"https://api.github.com/repos/RIOT-OS/RIOT/branches{/branch}","tags_url":"https://api.github.com/repos/RIOT-OS/RIOT/tags","blobs_url":"https://api.github.com/repos/RIOT-OS/RIOT/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/RIOT-OS/RIOT/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/RIOT-OS/RIOT/git/refs{/sha}","trees_url":"https://api.github.com/repos/RIOT-OS/RIOT/git/trees{/sha}","statuses_url":"https://api.github.com/repos/RIOT-OS/RIOT/statuses/{sha}","languages_url":"https://api.github.com/repos/RIOT-OS/RIOT/languages","stargazers_url":"https://api.github.com/repos/RIOT-OS/RIOT/stargazers","contributors_url":"https://api.github.com/repos/RIOT-OS/RIOT/contributors","subscribers_url":"https://api.github.com/repos/RIOT-OS/RIOT/subscribers","subscription_url":"https://api.github.com/repos/RIOT-OS/RIOT/subscription","commits_url":"https://api.github.com/repos/RIOT-OS/RIOT/commits{/sha}","git_commits_url":"https://api.github.com/repos/RIOT-OS/RIOT/git/commits{/sha}","comments_url":"https://api.github.com/repos/RIOT-OS/RIOT/comments{/number}","issue_comment_url":"https://api.github.com/repos/RIOT-OS/RIOT/issues/comments{/number}","contents_url":"https://api.github.com/repos/RIOT-OS/RIOT/contents/{+path}","compare_url":"https://api.github.com/repos/RIOT-OS/RIOT/compare/{base}...{head}","merges_url":"https://api.github.com/repos/RIOT-OS/RIOT/merges","archive_url":"https://api.github.com/repos/RIOT-OS/RIOT/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/RIOT-OS/RIOT/downloads","issues_url":"https://api.github.com/repos/RIOT-OS/RIOT/issues{/number}","pulls_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls{/number}","milestones_url":"https://api.github.com/repos/RIOT-OS/RIOT/milestones{/number}","notifications_url":"https://api.github.com/repos/RIOT-OS/RIOT/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/RIOT-OS/RIOT/labels{/name}","releases_url":"https://api.github.com/repos/RIOT-OS/RIOT/releases{/id}","created_at":"2012-12-29T20:38:40Z","updated_at":"2015-05-13T19:01:14Z","pushed_at":"2015-05-13T21:24:18Z","git_url":"git://github.com/RIOT-OS/RIOT.git","ssh_url":"git@github.com:RIOT-OS/RIOT.git","clone_url":"https://github.com/RIOT-OS/RIOT.git","svn_url":"https://github.com/RIOT-OS/RIOT","homepage":"https://github.com/RIOT-OS/RIOT/wiki","size":109823,"stargazers_count":358,"watchers_count":358,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":292,"mirror_url":null,"open_issues_count":327,"forks":292,"open_issues":327,"watchers":358,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2825"},"html":{"href":"https://github.com/RIOT-OS/RIOT/pull/2825"},"issue":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/issues/2825"},"comments":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/issues/2825/comments"},"review_comments":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2825/comments"},"review_comment":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2825/commits"},"statuses":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/statuses/4e121e1b17ef0e4fb7ea431ac00a0d5f2a900c2e"}}}}