{"action":"created","comment":{"url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/comments/33761926","id":33761926,"diff_hunk":"@@ -0,0 +1,1079 @@\n+/*\n+ * Copyright (C) 2015 Martine Lenders <mlenders@inf.fu-berlin.de>\n+ *\n+ * This file is subject to the terms and conditions of the GNU Lesser General\n+ * Public License v2.1. See the file LICENSE in the top level directory for\n+ * more details.\n+ */\n+\n+/**\n+ * @ingroup net_ng_zep\n+ * @{\n+ *\n+ * @file\n+ *\n+ * @author      Martine Lenders <mlenders@inf.fu-berlin.de>\n+ */\n+\n+#include <errno.h>\n+#include <string.h>\n+#include <time.h>\n+\n+#include \"ringbuffer.h\"\n+#include \"hashes.h\"\n+#include \"kernel.h\"\n+#include \"msg.h\"\n+#include \"net/ng_ieee802154.h\"\n+#include \"net/ng_ipv6/addr.h\"\n+#include \"net/ng_ipv6/hdr.h\"\n+#include \"net/ng_netbase.h\"\n+#include \"net/ng_udp.h\"\n+#include \"periph/cpuid.h\"\n+#include \"random.h\"\n+#include \"vtimer.h\"\n+\n+#include \"net/ng_zep.h\"\n+\n+#define ENABLE_DEBUG    (0)\n+#include \"debug.h\"\n+\n+#define _EVENT_RX_STARTED       (1)\n+#define _EVENT_RX_COMPLETE      (2)\n+#define _RX_BUF_SIZE            (16U * sizeof(ng_pktsnip_t *))\n+#define IEEE_802154_FCS_POLY    (0x8408)  /* x^16 + x^12 + x^5 + 1 for LSB first */\n+\n+static kernel_pid_t _pid = KERNEL_PID_UNDEF;\n+static char _rx_stack[NG_ZEP_STACK_SIZE];\n+static char _rx_buf_array[_RX_BUF_SIZE];\n+static ringbuffer_t _rx_buf = RINGBUFFER_INIT(_rx_buf_array);\n+\n+/* ng_netdev driver definitions */\n+static int _send(ng_netdev_t *dev, ng_pktsnip_t *pkt);\n+static int _add_cb(ng_netdev_t *dev, ng_netdev_event_cb_t cb);\n+static int _rem_cb(ng_netdev_t *dev, ng_netdev_event_cb_t cb);\n+static int _get(ng_netdev_t *dev, ng_netconf_opt_t opt, void *value,\n+                size_t max_len);\n+static int _set(ng_netdev_t *dev, ng_netconf_opt_t opt, void *value,\n+                size_t value_len);\n+static void _isr_event(ng_netdev_t *dev, uint32_t event_type);\n+\n+static const ng_netdev_driver_t _zep_driver = {\n+    _send,\n+    _add_cb,\n+    _rem_cb,\n+    _get,\n+    _set,\n+    _isr_event\n+};\n+\n+/* Function for the ZEP thread */\n+void *_event_loop(void *args);\n+\n+/* Builds (uninitialized) ZEP packet according to configured version */\n+static ng_pktsnip_t *_zep_hdr_build(ng_zep_t *dev, size_t size, bool ack);\n+\n+/* Fills ZEP header according to ng_zep_t configuration */\n+static size_t _zep_hdr_fill(ng_zep_t *dev, ng_zep_hdr_t *hdr,\n+                            size_t payload_len);\n+\n+/* Event handlers for ISR events */\n+static void _rx_started_event(ng_zep_t *dev);\n+\n+/* IEEE 802.15.4 helper functions: TODO: generalize add to ng_ieee802154 */\n+static size_t _make_data_frame_hdr(ng_zep_t *dev, uint8_t *buf,\n+                                   ng_netif_hdr_t *hdr);\n+static size_t _get_frame_hdr_len(uint8_t *mhr);\n+ng_pktsnip_t *_make_netif_hdr(uint8_t *mhr);\n+static uint16_t _calc_fcs(uint16_t fcs, const uint8_t *frame, uint8_t frame_len);\n+\n+kernel_pid_t ng_zep_init(ng_zep_t *dev, uint16_t src_port, ng_ipv6_addr_t *dst,\n+                         uint16_t dst_port)\n+{\n+#if CPUID_ID_LEN\n+    uint8_t cpuid[CPUID_ID_LEN];\n+    uint32_t hash1, hash2;\n+#endif\n+\n+    if (_pid != KERNEL_PID_UNDEF) {\n+        DEBUG(\"zep: ZEP thread already running at pid=%\" PRIkernel_pid \"\\n\", _pid);\n+        return -EEXIST;\n+    }\n+\n+    if (dev == NULL) {\n+        DEBUG(\"zep: dev was NULL\\n\");\n+        return -ENODEV;\n+    }\n+\n+    if ((dst == NULL) || (ng_ipv6_addr_is_unspecified(dst))) {\n+        DEBUG(\"zep: dst (%s) was NULL or unspecified\\n\", dst);\n+        return -ENOTSUP;\n+    }\n+\n+    if (ng_netreg_lookup(NG_NETTYPE_UDP, src_port)) {\n+        DEBUG(\"zep: port (%\" PRIu16 \") already registered\\n\", src_port);\n+        return -EADDRINUSE;\n+    }\n+\n+    dev->driver = (ng_netdev_driver_t *)&_zep_driver;\n+    dev->chan = NG_ZEP_DEFAULT_CHANNEL;\n+    dev->pan = byteorder_btols(byteorder_htons(NG_ZEP_DEFAULT_PANID));\n+    dev->flags = NG_ZEP_FLAGS_USE_SRC_PAN;\n+#if CPUID_ID_LEN\n+    /* initialize dev->addr and dev->eui64 from cpuid if available */\n+    cpuid_get(cpuid);\n+\n+    hash1 = djb2_hash(cpuid, CPUID_ID_LEN / 2);\n+    dev->addr.u16 = (uint16_t)((hash1 >> 16) ^ (hash1 & 0xffff));\n+\n+    if (CPUID_ID_LEN % 2) {\n+        hash2 = djb2_hash(cpuid + (CPUID_ID_LEN / 2), (CPUID_ID_LEN / 2) - 1);\n+    }\n+    else {\n+        hash2 = djb2_hash(cpuid + (CPUID_ID_LEN / 2), CPUID_ID_LEN / 2);\n+    }\n+\n+    dev->eui64.u32[0] = hash1;\n+    dev->eui64.u32[1] = hash2;\n+\n+    dev->eui64.u8[7] &= 0xfe;   /* set to unicast */\n+    dev->eui64.u8[7] |= 0x02;   /* set to locally administered */\n+#else\n+    dev->addr = NG_ZEP_DEFAULT_ADDR_SHORT;\n+    dev->eui64 = NG_ZEP_DEFAULT_ADDR_LONG;\n+#endif\n+    DEBUG(\"zep: initialized radio parameters: chan: %\" PRIu8 \", pan: 0x%04\" PRIx16\n+          \"addr: 0x%04\" PRIx16 \", eui64: %016\" PRIx64 \"\\n\", dev->chan,\n+          dev->pan, byteorder_ltobs(dev->addr).u16,\n+          byteorder_ltobll(dev->eui64).u64);\n+\n+#ifdef MODULE_NG_SIXLOWPAN\n+    dev->proto = NG_NETTYPE_SIXLOWPAN;\n+#else\n+    dev->proto = NG_NETTYPE_UNDEF;\n+#endif\n+\n+    dev->seq = genrand_uint32();\n+    dev->src_port = src_port;\n+    dev->dst.u64[0] = dst->u64[0];\n+    dev->dst.u64[1] = dst->u64[1];\n+    dev->dst_port = dst_port;\n+    dev->version = 2;\n+    dev->lqi_mode = 1;\n+\n+    _pid = thread_create(_rx_stack, NG_ZEP_STACK_SIZE, NG_ZEP_PRIO,\n+                         CREATE_STACKTEST, _event_loop, dev, \"zep_app\");\n+\n+    DEBUG(\"zep: started thread with PID %\" PRIkernel_pid \"\\n\", _pid);\n+\n+    return _pid;\n+}\n+\n+/* helper functions for options to avoid type pruning */\n+static inline void _set_uint16_ptr(uint16_t *ptr, uint16_t val)\n+{\n+    *ptr = val;\n+}\n+\n+static inline void _set_uint64_ptr(uint64_t *ptr, uint64_t val)\n+{\n+    *ptr = val;\n+}\n+\n+static inline void _set_flag_ptr(ng_netconf_enable_t *enable,\n+                                 uint16_t flag_field, uint16_t flag)\n+{\n+    if (flag_field & flag) {\n+        *enable = NETCONF_ENABLE;\n+    }\n+    else {\n+        *enable = NETCONF_DISABLE;\n+    }\n+}\n+\n+static inline uint16_t *_get_uint16_ptr(void *ptr)\n+{\n+    return ptr;\n+}\n+\n+static inline uint64_t *_get_uint64_ptr(void *ptr)\n+{\n+    return ptr;\n+}\n+\n+static int _send(ng_netdev_t *netdev, ng_pktsnip_t *pkt)\n+{\n+    ng_zep_t *dev = (ng_zep_t *)netdev;\n+    ng_pktsnip_t *ptr, *new, *hdr;","path":"sys/net/application_layer/ng_zep/ng_zep.c","position":206,"original_position":206,"commit_id":"e97c42ab8340a63f9d00073847b2ca323631af07","original_commit_id":"74857885f3480d72cfa02192a4a179888ed4d179","user":{"login":"authmillenon","id":675644,"avatar_url":"https://avatars.githubusercontent.com/u/675644?v=3","gravatar_id":"","url":"https://api.github.com/users/authmillenon","html_url":"https://github.com/authmillenon","followers_url":"https://api.github.com/users/authmillenon/followers","following_url":"https://api.github.com/users/authmillenon/following{/other_user}","gists_url":"https://api.github.com/users/authmillenon/gists{/gist_id}","starred_url":"https://api.github.com/users/authmillenon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/authmillenon/subscriptions","organizations_url":"https://api.github.com/users/authmillenon/orgs","repos_url":"https://api.github.com/users/authmillenon/repos","events_url":"https://api.github.com/users/authmillenon/events{/privacy}","received_events_url":"https://api.github.com/users/authmillenon/received_events","type":"User","site_admin":false},"body":"Fixed","created_at":"2015-07-02T09:42:48Z","updated_at":"2015-07-02T09:42:48Z","html_url":"https://github.com/RIOT-OS/RIOT/pull/2627#discussion_r33761926","pull_request_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2627","_links":{"self":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/comments/33761926"},"html":{"href":"https://github.com/RIOT-OS/RIOT/pull/2627#discussion_r33761926"},"pull_request":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2627"}}},"pull_request":{"url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2627","id":31346543,"html_url":"https://github.com/RIOT-OS/RIOT/pull/2627","diff_url":"https://github.com/RIOT-OS/RIOT/pull/2627.diff","patch_url":"https://github.com/RIOT-OS/RIOT/pull/2627.patch","issue_url":"https://api.github.com/repos/RIOT-OS/RIOT/issues/2627","number":2627,"state":"open","locked":false,"title":"net: initial import of the ZEP protocol","user":{"login":"authmillenon","id":675644,"avatar_url":"https://avatars.githubusercontent.com/u/675644?v=3","gravatar_id":"","url":"https://api.github.com/users/authmillenon","html_url":"https://github.com/authmillenon","followers_url":"https://api.github.com/users/authmillenon/followers","following_url":"https://api.github.com/users/authmillenon/following{/other_user}","gists_url":"https://api.github.com/users/authmillenon/gists{/gist_id}","starred_url":"https://api.github.com/users/authmillenon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/authmillenon/subscriptions","organizations_url":"https://api.github.com/users/authmillenon/orgs","repos_url":"https://api.github.com/users/authmillenon/repos","events_url":"https://api.github.com/users/authmillenon/events{/privacy}","received_events_url":"https://api.github.com/users/authmillenon/received_events","type":"User","site_admin":false},"body":"Main idea is to use this with native as \"fully\" supported IEEE 802.15.4 device.\r\n\r\nThis modules is both a `ng_netdev` and `ng_netapi` module. It speaks through UDP via `ng_netapi`, but imitates an IEEE 802.15.4 device through `ng_netdev` to be indistinguishable from normal devices.\r\n\r\n~~Depends on #2430.~~ (merged)\r\n\r\nFixes #163","created_at":"2015-03-17T15:35:41Z","updated_at":"2015-07-02T09:42:49Z","closed_at":null,"merged_at":null,"merge_commit_sha":"209d5443a93d3fa8ed8e4602df3853415f5be5bb","assignee":{"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},"milestone":{"url":"https://api.github.com/repos/RIOT-OS/RIOT/milestones/12","html_url":"https://github.com/RIOT-OS/RIOT/milestones/Release%202015.06","labels_url":"https://api.github.com/repos/RIOT-OS/RIOT/milestones/12/labels","id":1088995,"number":12,"title":"Release 2015.06","description":"This release aims mainly to include the brand new network stack.","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":73,"closed_issues":178,"state":"open","created_at":"2015-04-29T10:11:27Z","updated_at":"2015-07-02T09:22:48Z","due_on":"2015-06-29T22:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2627/commits","review_comments_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2627/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/2627/comments","statuses_url":"https://api.github.com/repos/RIOT-OS/RIOT/statuses/e97c42ab8340a63f9d00073847b2ca323631af07","head":{"label":"authmillenon:zep/feat/initial","ref":"zep/feat/initial","sha":"e97c42ab8340a63f9d00073847b2ca323631af07","user":{"login":"authmillenon","id":675644,"avatar_url":"https://avatars.githubusercontent.com/u/675644?v=3","gravatar_id":"","url":"https://api.github.com/users/authmillenon","html_url":"https://github.com/authmillenon","followers_url":"https://api.github.com/users/authmillenon/followers","following_url":"https://api.github.com/users/authmillenon/following{/other_user}","gists_url":"https://api.github.com/users/authmillenon/gists{/gist_id}","starred_url":"https://api.github.com/users/authmillenon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/authmillenon/subscriptions","organizations_url":"https://api.github.com/users/authmillenon/orgs","repos_url":"https://api.github.com/users/authmillenon/repos","events_url":"https://api.github.com/users/authmillenon/events{/privacy}","received_events_url":"https://api.github.com/users/authmillenon/received_events","type":"User","site_admin":false},"repo":{"id":7667624,"name":"RIOT","full_name":"authmillenon/RIOT","owner":{"login":"authmillenon","id":675644,"avatar_url":"https://avatars.githubusercontent.com/u/675644?v=3","gravatar_id":"","url":"https://api.github.com/users/authmillenon","html_url":"https://github.com/authmillenon","followers_url":"https://api.github.com/users/authmillenon/followers","following_url":"https://api.github.com/users/authmillenon/following{/other_user}","gists_url":"https://api.github.com/users/authmillenon/gists{/gist_id}","starred_url":"https://api.github.com/users/authmillenon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/authmillenon/subscriptions","organizations_url":"https://api.github.com/users/authmillenon/orgs","repos_url":"https://api.github.com/users/authmillenon/repos","events_url":"https://api.github.com/users/authmillenon/events{/privacy}","received_events_url":"https://api.github.com/users/authmillenon/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/authmillenon/RIOT","description":"RIOT OS -  The revolutionary IoT OS","fork":true,"url":"https://api.github.com/repos/authmillenon/RIOT","forks_url":"https://api.github.com/repos/authmillenon/RIOT/forks","keys_url":"https://api.github.com/repos/authmillenon/RIOT/keys{/key_id}","collaborators_url":"https://api.github.com/repos/authmillenon/RIOT/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/authmillenon/RIOT/teams","hooks_url":"https://api.github.com/repos/authmillenon/RIOT/hooks","issue_events_url":"https://api.github.com/repos/authmillenon/RIOT/issues/events{/number}","events_url":"https://api.github.com/repos/authmillenon/RIOT/events","assignees_url":"https://api.github.com/repos/authmillenon/RIOT/assignees{/user}","branches_url":"https://api.github.com/repos/authmillenon/RIOT/branches{/branch}","tags_url":"https://api.github.com/repos/authmillenon/RIOT/tags","blobs_url":"https://api.github.com/repos/authmillenon/RIOT/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/authmillenon/RIOT/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/authmillenon/RIOT/git/refs{/sha}","trees_url":"https://api.github.com/repos/authmillenon/RIOT/git/trees{/sha}","statuses_url":"https://api.github.com/repos/authmillenon/RIOT/statuses/{sha}","languages_url":"https://api.github.com/repos/authmillenon/RIOT/languages","stargazers_url":"https://api.github.com/repos/authmillenon/RIOT/stargazers","contributors_url":"https://api.github.com/repos/authmillenon/RIOT/contributors","subscribers_url":"https://api.github.com/repos/authmillenon/RIOT/subscribers","subscription_url":"https://api.github.com/repos/authmillenon/RIOT/subscription","commits_url":"https://api.github.com/repos/authmillenon/RIOT/commits{/sha}","git_commits_url":"https://api.github.com/repos/authmillenon/RIOT/git/commits{/sha}","comments_url":"https://api.github.com/repos/authmillenon/RIOT/comments{/number}","issue_comment_url":"https://api.github.com/repos/authmillenon/RIOT/issues/comments{/number}","contents_url":"https://api.github.com/repos/authmillenon/RIOT/contents/{+path}","compare_url":"https://api.github.com/repos/authmillenon/RIOT/compare/{base}...{head}","merges_url":"https://api.github.com/repos/authmillenon/RIOT/merges","archive_url":"https://api.github.com/repos/authmillenon/RIOT/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/authmillenon/RIOT/downloads","issues_url":"https://api.github.com/repos/authmillenon/RIOT/issues{/number}","pulls_url":"https://api.github.com/repos/authmillenon/RIOT/pulls{/number}","milestones_url":"https://api.github.com/repos/authmillenon/RIOT/milestones{/number}","notifications_url":"https://api.github.com/repos/authmillenon/RIOT/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/authmillenon/RIOT/labels{/name}","releases_url":"https://api.github.com/repos/authmillenon/RIOT/releases{/id}","created_at":"2013-01-17T14:31:57Z","updated_at":"2015-05-01T13:02:29Z","pushed_at":"2015-07-02T09:42:47Z","git_url":"git://github.com/authmillenon/RIOT.git","ssh_url":"git@github.com:authmillenon/RIOT.git","clone_url":"https://github.com/authmillenon/RIOT.git","svn_url":"https://github.com/authmillenon/RIOT","homepage":null,"size":36885,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"RIOT-OS:master","ref":"master","sha":"5788af1b90443d00a7b1db844444e2f298904a03","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-07-01T08:04:08Z","pushed_at":"2015-07-02T09:42:48Z","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":118419,"stargazers_count":429,"watchers_count":429,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":325,"mirror_url":null,"open_issues_count":355,"forks":325,"open_issues":355,"watchers":429,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2627"},"html":{"href":"https://github.com/RIOT-OS/RIOT/pull/2627"},"issue":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/issues/2627"},"comments":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/issues/2627/comments"},"review_comments":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2627/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/2627/commits"},"statuses":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/statuses/e97c42ab8340a63f9d00073847b2ca323631af07"}}}}