{"action":"created","comment":{"url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/comments/22893313","id":22893313,"diff_hunk":"@@ -0,0 +1,262 @@\n+/*\n+ * Copyright (C) 2014 Martine Lenders <mlenders@inf.fu-berlin.de>\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+ * @defgroup    net_netdev Network device driver interface\n+ * @addtogroup  net\n+ * @{\n+ *\n+ * @file\n+ * @brief       Network device driver interface definition.\n+ *\n+ * @author      Martine Lenders <mlenders@inf.fu-berlin.de>\n+ * @author      Hauke Petersen <hauke.petersen@fu-berlin.de>\n+ */\n+\n+#ifndef __NETDEV_H_\n+#define __NETDEV_H_\n+\n+#include <errno.h>\n+#include <stdint.h>\n+#include <stdlib.h>\n+\n+#ifdef __cplusplus\n+extern \"C\" {\n+#endif\n+\n+/**\n+ * @brief Type for @ref msg_t if device fired an event.\n+ */\n+#define NETDEV_MSG_EVENT_TYPE   (0x0100)\n+\n+/**\n+ * @brief   Definition of basic network device options.\n+ * @note    Feel free to expand if your device needs/supports more.\n+ */\n+typedef enum {\n+    NETDEV_OPT_CHANNEL,             /**< Channel for the device as unsigned value\n+                                         in host byte order */\n+    NETDEV_OPT_IS_CHANNEL_CLR,      /**< Check if channel is clear */\n+    NETDEV_OPT_ADDRESS,             /**< Hardware address for the device as\n+                                         unsigned value in host byte order */\n+    NETDEV_OPT_NID,                 /**< Network ID (e.g. PAN ID in IEEE 802.15.4)\n+                                         for the device as unsigned value in\n+                                         host byte order */\n+    NETDEV_OPT_ADDRESS_LONG,        /**< Longer hardware address for the device\n+                                         (e.g. EUI-64) for the device as\n+                                         unsigned value in host byte order */\n+    NETDEV_OPT_TX_POWER,            /**< The output of the device in dB as\n+                                         signed value in host byte order */\n+    NETDEV_OPT_MAX_PACKET_SIZE,     /**< Maximum packet size the device supports\n+                                         unsigned value in host byte order */\n+    NETDEV_OPT_SRC_LEN,             /**< Default mode the source address is\n+                                         set to as value of `size_t`. (e.g.\n+                                         either PAN-centric 16-bit address or\n+                                         EUI-64 in IEEE 802.15.4) */\n+    NETDEV_OPT_EN_PRELOADING,       /**< Enable pre-loading of data, transfer\n+                                         data to device using send_data(), send\n+                                         by calling set_state(NETDEV_STATE_TX) */\n+    NETDEV_OPT_EN_PROMISCUOUSMODE   /**< Enable promiscuous mode */\n+    NETDEV_OPT_EN_AUTOACK,          /**< Automatically send link-layer ACKs */\n+    NETDEV_OPT_RSSI,                /**< Read the RSSI value from the last transfer */\n+    NETDEV_OPT_LQI,                 /**< Read the link quality indicator */\n+\n+    /**\n+     * @brief   Last value for @ref netdev_opt_t defined here\n+     *\n+     * @details Specific devices or modules like @ref netapi that utilize these\n+     *          values to may define higher values, but they must be greater\n+     *          or equal to @ref NETDEV_OPT_LAST.\n+     */\n+    NETDEV_OPT_LAST,\n+} netdev_opt_t;\n+\n+/**\n+ * @brief   Definition of basic network device.\n+ * @note    Feel free to expand if your device needs/supports more\n+ */\n+typedef enum {\n+    NETDEV_ACTION_POWEROFF = 0,\n+    NETDEV_ACTION_SLEEP,\n+    NETDEV_ACTION_IDLE,\n+    NETDEV_ACTION_RX,\n+    NETDEV_ACTION_TX,               /**< only needed if pre-loading is enabled */\n+} netdev_action_t;\n+\n+/**\n+ * @brief   Definition of basic network device.\n+ * @note    Feel free to expand if your device needs/supports more\n+ */\n+typedef enum {\n+    NETDEV_STATE_OFF = 0,           /**< Device is powered off */\n+    NETDEV_STATE_SLEEP,             /**< Device is sleeping */\n+    NETDEV_STATE_IDLE,              /**< Device is idle */\n+    NETDEV_STATE_RX,                /**< Device is in receive mode */\n+    NETDEV_STATE_TX,                /**< Device is transmit mode */\n+    NETDEV_STATE_PROMISCUOUS,       /**< Device is in receive mode and\n+                                         accepts all packets without regard\n+                                         for their destination */\n+    NETDEV_STATE_TX_BURST,          /**< Device is burst sending and\n+                                         does not accept packets */\n+} netdev_state_t;\n+\n+/**\n+ * @brief   The netdev data-structure holds the minimum information needed for\n+ *          interaction with MAC layers\n+ *\n+ * The netdev structure is the parent for all network device driver descriptors.\n+ */\n+typedef struct netdev_t netdev_t;\n+\n+/**\n+ * @brief   Receive data callback for data frames from given network device.\n+ *\n+ * @param[in] data          pointer to the received data in the packet buffer\n+ */\n+typedef void (*netdev_rcv_data_cb_t)(pkt_t *data);\n+\n+/**\n+ * @brief   Network device API definition.\n+ *\n+ * @details This is a set of functions that must be implemented by any driver\n+ *           for a network device.\n+ */\n+typedef struct {\n+    /**\n+     * @brief Send data via a given network device\n+     *\n+     * @param[in] dev               the network device\n+     * @param[in] dest              the (hardware) destination address for the data\n+     *                              in host byte order.\n+     * @param[in] dest_len          the length of *dest* in byte\n+     * @param[in] data              pointer to the data to sent\n+     *\n+     * @return  the number of byte actually send on success\n+     * @return  -EAFNOSUPPORT if address of length dest_len is not supported\n+     *          by the device *dev*\n+     * @return  -ENODEV if *dev* is not recognized\n+     * @return  -EMSGSIZE if the total frame size is too long to fit in a frame\n+     *          of the device *dev*\n+     * @return  a fitting negative other errno on other failure\n+     */\n+    int (*send_data)(netdev_t *dev, pkt_t *data);\n+\n+    /**\n+     * @brief   Registers a receive data callback to a given network device.\n+     *\n+     * @param[in] dev   the network device.\n+     * @param[in] cb    the callback.\n+     *\n+     * @return  0, on success\n+     * @return  -ENODEV, if *dev* is not recognized\n+     * @return  -ENOBUFS, if maximum number of registrable callbacks is exceeded\n+     */\n+    int (*add_receive_data_callback)(netdev_t *dev, netdev_rcv_data_cb_t cb);\n+\n+    /**\n+     * @brief   Unregisters a receive data callback to a given network device.\n+     *\n+     * @param[in] dev   the network device.\n+     * @param[in] cb    the callback.\n+     *\n+     * @return  0, on success\n+     * @return  -ENODEV, if *dev* is not recognized\n+     */\n+    int (*rem_receive_data_callback)(netdev_t *dev, netdev_rcv_data_cb_t cb);\n+\n+    /**\n+     * @brief   Get an option value from a given network device.\n+     *\n+     * @param[in] dev           the network device\n+     * @param[in] opt           the option type\n+     * @param[out] value        pointer to store the gotten value in\n+     * @param[in,out] value_len the length of *value*. Must be initialized to the\n+     *                          available space in *value* on call.\n+     * @return  0, on success\n+     * @return  -ENODEV, if *dev* is not recognized\n+     * @return  -ENOTSUP, if *opt* is not supported for the device with this\n+     *          operation\n+     * @return  -EOVERFLOW, if available space in *value* given in *value_len*\n+     *          is not big enough to store the option value.\n+     * @return  any other fitting negative errno if the ones stated above\n+     *          are not sufficient\n+     */\n+    int (*get_option)(netdev_t *dev, netdev_opt_t opt, void *value,\n+                      size_t *value_len);\n+\n+    /**\n+     * @brief   Set an option value for a given network device.\n+     *\n+     * @param[in] dev           the network device\n+     * @param[in] opt           the option type\n+     * @param[in] value         the value to set\n+     * @param[in] value_len     the length of *value*\n+     *\n+     * @return  0, on success\n+     * @return  -EINVAL, if *value* is not in a required format\n+     * @return  -ENODEV, if *dev* is not recognized\n+     * @return  -ENOTSUP, if *opt* is not supported for the device with this\n+     *          operation\n+     * @return  -EOVERFLOW, if *value_len* is larger then the device expects.\n+     * @return  -EPROTONOSUPPORT, if *opt* was NETDEV_OPT_PROTO and type is\n+     *          not supported.\n+     * @return  any other fitting negative errno if the ones stated above\n+     *          are not sufficient\n+     */\n+    int (*set_option)(netdev_t *dev, netdev_opt_t opt, void *value,\n+                      size_t value_len);\n+\n+    /**\n+     * @brief   Get state from a given network device.\n+     *\n+     * @param[in] dev       the network device\n+     * @param[out] state    the network device\n+     *\n+     * @return  0, on success\n+     * @return  -ENODEV, if *dev* is not recognized\n+     * @return  -ETIME, if device timed out on trying to acquire state\n+     */\n+    int (*get_state)(netdev_t *dev, netdev_state_t *state);\n+\n+    /**\n+     * @brief   Set state from a given network device.\n+     *\n+     * @param[in] dev      the network device\n+     * @param[in] action   action to trigger\n+     *\n+     * @return  0, on success\n+     * @return  -ENODEV, if *dev* is not recognized\n+     * @return  -ENOTSUP, if *state* is not supported\n+     * @return  -ETIME, if device timed out on trying to change state\n+     */\n+    int (*trigger)(netdev_t *dev, netdev_action_t action);\n+\n+    /**\n+     * @brief   Must be called by a controlling thread if a message of type\n+     *          NETDEV_MSG_EVENT_TYPE was received\n+     *\n+     * @param[in] dev           the network device that fired the event.\n+     * @param[in] event_type    Event type. Values are free to choose for the\n+     *                          driver. Must be given in the @ref msg_t::value\n+     *                          of the received message\n+     */\n+    void (*event)(netdev_t *dev, uint16_t event_type);\n+} netdev_driver_t;\n+\n+struct netdev_t {\n+    kernel_pid_t pid;           /**< the driver's thread's PID */\n+    netdev_driver_t *driver;    /**< pointer to the devices interface */","path":"sys/net/include/netdev.h","position":254,"original_position":254,"commit_id":"346b9891c3b6f6c663e61d764852098e7463f906","original_commit_id":"346b9891c3b6f6c663e61d764852098e7463f906","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":"How are the netdev instance and the device specific type (at86..._t in your example) connected? ","created_at":"2015-01-13T20:48:33Z","updated_at":"2015-01-13T20:48:33Z","html_url":"https://github.com/RIOT-OS/RIOT/pull/2297#discussion_r22893313","pull_request_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2297","_links":{"self":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/comments/22893313"},"html":{"href":"https://github.com/RIOT-OS/RIOT/pull/2297#discussion_r22893313"},"pull_request":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2297"}}},"pull_request":{"url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2297","id":27294308,"html_url":"https://github.com/RIOT-OS/RIOT/pull/2297","diff_url":"https://github.com/RIOT-OS/RIOT/pull/2297.diff","patch_url":"https://github.com/RIOT-OS/RIOT/pull/2297.patch","issue_url":"https://api.github.com/repos/RIOT-OS/RIOT/issues/2297","number":2297,"state":"open","locked":false,"title":"net: minimization and simplification of netdev (WIP)","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 not meant to produce production code, but as base for discussion (I guess it won't even compile...).\r\n\r\nI was looking at the netdev interface for the last two days and I think it has grown to complicated... Here is a proposal for simplification. One main idea is, that `netdev_t` is basically a parent class for network device descriptors, meaning that structs holding the state of a network device simply are forced to have their first two members being of type `kernel_pid_t` and `netdev_driver_t *`. The rest of the members are free to be defined by the driver itself, typically stuff like SPI device, GPIO pins used, internal state data and option fields...\r\n\r\nThe major changes are:\r\n- moved and renamed the interface to `sys/net/include/netdev.h`\r\n- removed specializations for 802.15.4 (as they are not needed in my opinion)\r\n- removed everything connnected to `hlists` -> this code is being moved to `pkt.h` anyhow... (#2158)\r\n- simplified parameters used in netdev functions\r\n- flattened the hierarchy for the `netdev_t` data structure\r\n- added some options (e.g. ENABLE_PRELOADING...)\r\n- changed `set_state(state)` to `trigger(action)` and added actions\r\n\r\nI further touched the `AT86RF231` driver slightly, to demonstrate the usage of the netapi interface:\r\n- I defined the device descriptor for the radio device (again: subclass of `netdev_t`). All functions of the radio driver should take this struct as their first argument\r\n- rewrote the receiving part of the radio driver to demonstrate the use of the packet buffer \r\n\r\nI think this simplifies matters quite a bit, please let me know what you think!\r\n","created_at":"2015-01-13T18:48:29Z","updated_at":"2015-01-13T20:48:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"58223bef13539f3feedfba687515d8f7f2cae08e","assignee":{"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},"milestone":null,"commits_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2297/commits","review_comments_url":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2297/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/2297/comments","statuses_url":"https://api.github.com/repos/RIOT-OS/RIOT/statuses/346b9891c3b6f6c663e61d764852098e7463f906","head":{"label":"haukepetersen:opt_minimize_netdev","ref":"opt_minimize_netdev","sha":"346b9891c3b6f6c663e61d764852098e7463f906","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":"2014-07-03T13:22:33Z","pushed_at":"2015-01-13T18:31:39Z","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":15595,"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":"34908f11a9273168ed98271b871ae37809c64db8","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-01-13T17:49:15Z","pushed_at":"2015-01-13T17:49:15Z","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":80259,"stargazers_count":226,"watchers_count":226,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":194,"mirror_url":null,"open_issues_count":258,"forks":194,"open_issues":258,"watchers":226,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2297"},"html":{"href":"https://github.com/RIOT-OS/RIOT/pull/2297"},"issue":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/issues/2297"},"comments":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/issues/2297/comments"},"review_comments":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/pulls/2297/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/2297/commits"},"statuses":{"href":"https://api.github.com/repos/RIOT-OS/RIOT/statuses/346b9891c3b6f6c663e61d764852098e7463f906"}}}}