{"action":"created","comment":{"url":"https://api.github.com/repos/cfriedt/bluetooth-next/pulls/comments/36990444","id":36990444,"diff_hunk":"@@ -1201,10 +1221,239 @@ static void nl802154_ed_scan_cnf( struct work_struct *work ) {\n \treturn;\n }\n \n-static int nl802154_ed_scan_req( struct sk_buff *skb, struct genl_info *info )\n+static int\n+ieee802154_send_beacon_command_frame( struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev, u8 cmd_frame_id )\n {\n-\tint r;\n+\tint r = 0;\n+\tstruct sk_buff *skb;\n+\tstruct ieee802154_mac_cb *cb;\n+\tint hlen, tlen, size;\n+\tstruct ieee802154_addr dst_addr, src_addr;\n+\tunsigned char *data;\n+\n+\t//Create beacon frame / payload\n+\thlen = 7; //Header is 7 octets. From the IEEE 802154 std 2011.\n+\ttlen = wpan_dev->netdev->needed_tailroom;\n+\tsize = 1; //Todo: Replace magic number. Comes from ieee std 802154 \"Beacon Request Frame Format\" with a define\n+\n+\tskb = alloc_skb( hlen + tlen + size, GFP_KERNEL );\n+\tif (!skb){\n+\t\tgoto error;\n+\t}\n+\n+\tskb_reserve(skb, hlen);\n+\n+\tskb_reset_network_header(skb);\n+\n+\tdata = skb_put(skb, size);\n+\n+\tsrc_addr.mode = IEEE802154_ADDR_NONE;\n+\tdst_addr.mode = IEEE802154_ADDR_SHORT;\n+\tdst_addr.pan_id = IEEE802154_PANID_BROADCAST;\n+\tdst_addr.short_addr = IEEE802154_ADDR_BROADCAST;\n+\n+\tcb = mac_cb_init(skb);\n+\tcb->type = IEEE802154_FC_TYPE_MAC_CMD;\n+\tcb->ackreq = false;\n+\n+\tcb->secen = false;\n+\tcb->secen_override = false;\n+\tcb->seclevel = 0;\n+\n+\tcb->source = src_addr;\n+\tcb->dest = dst_addr;\n+\n+\t//Since the existing subroutine for creating the mac header doesn't seem to work in this situation, will be rewriting it it with a correction here\n+\tr = wpan_dev->netdev->header_ops->create( skb, wpan_dev->netdev, ETH_P_IEEE802154, &dst_addr, &src_addr, hlen + tlen + size);\n+\n+\t//Add the mac header to the data\n+\tmemcpy( data, cb, size );\n+\tdata[0] = cmd_frame_id;\n+\n+\tskb->dev = wpan_dev->netdev;\n+\tskb->protocol = htons(ETH_P_IEEE802154);\n+\n+\twpan_dev->netdev->netdev_ops->ndo_start_xmit( skb, wpan_dev->netdev );\n+\tif( 0 == r) {\n+\t\tgoto out;\n+\t}\n+\n+\n+error:\n+\tkfree_skb(skb);\n+out:\n+\treturn r;\n+}\n+\n+static void nl802154_active_scan_cnf( struct work_struct *work )\n+{\n+\tint status;\n+\n+\tstruct work802154 *wrk;\n+\tstruct sk_buff *skb;\n+\tstruct genl_info *info;\n+\tstruct cfg802154_registered_device *rdev;\n+\tstruct net_device *dev;\n+\tstruct wpan_dev *wpan_dev;\n+\n+\tint i;\n+\n+\tu8 channel_page;\n+\tu32 scan_channels;\n+\tu8 scan_duration;\n+\tu32 current_channel;\n+\t__le32 unscanned_channels;\n+\tstruct sk_buff *reply;\n+\tvoid *hdr;\n+\n+\twrk = container_of( to_delayed_work( work ), struct work802154, work );\n+\tskb = wrk->skb;\n+\tinfo = wrk->info;\n+\trdev = info->user_ptr[0];\n+\tdev = info->user_ptr[1];\n+\twpan_dev = (struct wpan_dev *)&rdev->wpan_phy.dev;\n+\n+\t//Get active scan variables from previous calls from the work struct\n+\tstatus = wrk->cmd_stuff.active_scan.status;\n+\tchannel_page = wrk->cmd_stuff.active_scan.channel_page;\n+\tscan_channels = wrk->cmd_stuff.active_scan.scan_channels;\n+\tscan_duration = wrk->cmd_stuff.active_scan.scan_duration;\n+\tcurrent_channel = wrk->cmd_stuff.active_scan.current_channel;\n+\treply = (struct sk_buff *)&wrk->cmd_stuff.active_scan.reply;\n+\thdr  = &wrk->cmd_stuff.active_scan.hdr;\n+\n+\t//Scanning process\n+\t//Check that the current channel is selected in the scan_channels bit mask.\n+\t//If not add it to the unscanned channels bit mask\n+\t//Yes: switch to that channel and send the beacon request frame.\n+\t//Schedule this work to occur again after scan_duration time.\n+\n+\twhile( !(scan_channels & BIT(current_channel) ) ) {\n+\t\tunscanned_channels |= BIT(current_channel);\n+\t\tcurrent_channel++;\n+\t\tif( IEEE802154_MAX_CHANNEL == current_channel ) {\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\tif( scan_channels & BIT(current_channel) ) {\n+\t\tnetdev_dbg(dev, \"Scanning channel #: %d\\n\", i );\n+\t\tstatus = rdev_set_channel(rdev, channel_page, current_channel);\n+\t\t//Send the beacon request\n+\t\tstatus = ieee802154_send_beacon_command_frame( wpan_dev->wpan_phy, wpan_dev, IEEE802154_CMD_BEACON_REQ );\n+\t\twrk->cmd_stuff.active_scan.current_channel = current_channel + 1;\n+\t\tstatus = schedule_delayed_work( &wrk->work, msecs_to_jiffies( scan_duration*10000 ) ) ? 0 : -EALREADY;\n+\t\tif( 0 == status ) {\n+\t\t\tgoto out;\n+\t\t}\n+\t}\n+\n+\tif( IEEE802154_MAX_CHANNEL == current_channel || status != 0) {\n+\t\t//Add the remaining MLME-SCAN.confirm parameters as netlink attributes and send\n+\t\tstatus = nla_put_u8( reply, NL802154_ATTR_SCAN_RESULT_LIST_SIZE, wrk->cmd_stuff.active_scan.result_list_size );\n+//\t\tstatus = nl802154_active_scan_put_pan_descriptors( reply, result_list_size, pan_descriptor_list ;)\n+\n+\t\tif ( 0 != status ) {\n+\t\t\tdev_err( &dev->dev, \"nla_put_failure (%d)\\n\", status );\n+\t\t\tgoto nla_put_failure;\n+\t\t}\n+\n+\t\tgenlmsg_end( reply, hdr );\n+\n+\t\tstatus = genlmsg_reply( reply, info );\n+\t\tgoto complete;\n+\t}\n+\n \n+nla_put_failure:\n+\tnlmsg_free( reply );\n+complete:\n+\trdev_active_scan_deregister_listener( rdev );\n+\tcomplete( &wrk->completion );\n+\tkfree( wrk );\n+out:\n+\treturn;\n+}\n+\n+void nl802154_active_scan_pan_descriptor_send( struct sk_buff *receive_skb, const struct ieee802154_hdr *receive_hdr, struct work_struct *active_scan_work )\n+{\n+\tstruct ieee802154_beacon_indication beacon_notify;\n+\tstruct net *net;\n+\tstruct nlattr *nl_pan_desc_entry;\n+\n+\tstruct cfg802154_registered_device *rdev;\n+\tstruct wpan_dev *wpan_dev;\n+\n+\tstruct work802154 *wrk;\n+\n+\twrk = container_of( to_delayed_work( active_scan_work ), struct work802154, work );\n+\n+\trdev = wrk->info->user_ptr[0];\n+\twpan_dev = (struct wpan_dev *)&rdev->wpan_phy.dev;\n+\n+\tbeacon_notify.pan_desc.src_addr_mode   = receive_hdr->fc.source_addr_mode;\n+\n+\tif ( IEEE802154_ADDR_LONG == beacon_notify.pan_desc.src_addr_mode ) {\n+\t\tbeacon_notify.pan_desc.src_addr = mac_cb(receive_skb)->source.extended_addr;\n+\t}\n+\telse if ( IEEE802154_ADDR_SHORT == beacon_notify.pan_desc.src_addr_mode ) {\n+\t\tbeacon_notify.pan_desc.src_addr = mac_cb(receive_skb)->source.short_addr;\n+\t}\n+\n+\t/* The Source PAN Identifier and Source Address fields contain the PAN identifier and address,\n+\t * respectively, of the device transmitting the beacon. */\n+\tbeacon_notify.pan_desc.src_addr        = mac_cb(receive_skb)->source.short_addr;\n+\tbeacon_notify.pan_desc.src_pan_id      = mac_cb(receive_skb)->source.pan_id;\n+\tbeacon_notify.pan_desc.channel_num     = wpan_dev->wpan_phy->current_channel;\n+\tbeacon_notify.pan_desc.channel_page    = wpan_dev->wpan_phy->current_channel;\n+\tbeacon_notify.pan_desc.superframe_spec = 0;\n+\tbeacon_notify.pan_desc.gts_permit      = 0;\n+\tbeacon_notify.pan_desc.lqi             = mac_cb(receive_skb)->lqi;\n+\tbeacon_notify.pan_desc.time_stamp      = 0;\n+\tbeacon_notify.pan_desc.sec_status      = 0;\n+\tbeacon_notify.pan_desc.sec_level       = mac_cb(receive_skb)->seclevel;\n+\tbeacon_notify.pan_desc.key_id_mode     = receive_hdr->sec.key_id_mode;\n+\tbeacon_notify.pan_desc.key_src         = 0;\n+\tbeacon_notify.pan_desc.key_index       = receive_hdr->sec.key_id;\n+\n+\tnl_pan_desc_entry = nla_nest_start( wrk->cmd_stuff.active_scan.reply, NL802154_ATTR_PAN_DESCRIPTOR );\n+\tif (nla_put_u8 ( wrk->cmd_stuff.active_scan.reply, NL802154_ATTR_PAN_DESC_SRC_ADDR_MODE, beacon_notify.pan_desc.src_addr_mode ) ||\n+\t\t\tnla_put_u16( wrk->cmd_stuff.active_scan.reply, NL802154_ATTR_PAN_DESC_SRC_PAN_ID, beacon_notify.pan_desc.src_pan_id) ||\n+\t\t\tnla_put_u32( wrk->cmd_stuff.active_scan.reply, NL802154_ATTR_PAN_DESC_SRC_ADDR, beacon_notify.pan_desc.src_addr) ||\n+\t\t\tnla_put_u8 ( wrk->cmd_stuff.active_scan.reply, NL802154_ATTR_PAN_DESC_CHANNEL_NUM, beacon_notify.pan_desc.channel_num) ||\n+\t\t\tnla_put_u8 ( wrk->cmd_stuff.active_scan.reply, NL802154_ATTR_PAN_DESC_CHANNEL_PAGE, beacon_notify.pan_desc.channel_page) ||\n+\t\t\tnla_put_u8 ( wrk->cmd_stuff.active_scan.reply, NL802154_ATTR_PAN_DESC_SUPERFRAME_SPEC, beacon_notify.pan_desc.superframe_spec) ||\n+\t\t\tnla_put_u32( wrk->cmd_stuff.active_scan.reply, NL802154_ATTR_PAN_DESC_GTS_PERMIT, beacon_notify.pan_desc.gts_permit) ||\n+\t\t\tnla_put_u8 ( wrk->cmd_stuff.active_scan.reply, NL802154_ATTR_PAN_DESC_LQI, beacon_notify.pan_desc.lqi) ||\n+\t\t\tnla_put_u32( wrk->cmd_stuff.active_scan.reply, NL802154_ATTR_PAN_DESC_TIME_STAMP, beacon_notify.pan_desc.time_stamp) ||\n+\t\t\tnla_put_u8 ( wrk->cmd_stuff.active_scan.reply, NL802154_ATTR_PAN_DESC_SEC_STATUS, beacon_notify.pan_desc.sec_status) ||\n+\t\t\tnla_put_u8 ( wrk->cmd_stuff.active_scan.reply, NL802154_ATTR_PAN_DESC_SEC_LEVEL, beacon_notify.pan_desc.sec_level) ||\n+\t\t\tnla_put_u8 ( wrk->cmd_stuff.active_scan.reply, NL802154_ATTR_PAN_DESC_KEY_ID_MODE, beacon_notify.pan_desc.key_id_mode) ||\n+\t\t\tnla_put_u8 ( wrk->cmd_stuff.active_scan.reply, NL802154_ATTR_PAN_DESC_KEY_SRC, beacon_notify.pan_desc.key_src) ||\n+\t\t\tnla_put_u8 ( wrk->cmd_stuff.active_scan.reply, NL802154_ATTR_PAN_DESC_KEY_INDEX, beacon_notify.pan_desc.key_index)) {\n+\t\twrk->cmd_stuff.active_scan.status = -ENOBUFS;\n+\t\tgoto free_reply;\n+\t}\n+\tnla_nest_end( wrk->cmd_stuff.active_scan.reply, nl_pan_desc_entry );\n+\n+\tnet = genl_info_net(wrk->info);\n+\n+\twrk->cmd_stuff.active_scan.status = genlmsg_reply( wrk->cmd_stuff.active_scan.reply, wrk->info);\n+\n+\twrk->cmd_stuff.active_scan.result_list_size++;\n+\n+\tgoto out;\n+\n+free_reply:\n+\tnlmsg_free( wrk->cmd_stuff.active_scan.reply );\n+out:\n+\treturn;\n+}\n+\n+static int nl802154_ed_scan_req( struct sk_buff *skb, struct genl_info *info )","path":"net/ieee802154/nl802154.c","position":283,"original_position":283,"commit_id":"2ffdf1414398d1b2d5e18bd3d53b4ae69a095623","original_commit_id":"2ffdf1414398d1b2d5e18bd3d53b4ae69a095623","user":{"login":"cfriedt","id":983494,"avatar_url":"https://avatars.githubusercontent.com/u/983494?v=3","gravatar_id":"","url":"https://api.github.com/users/cfriedt","html_url":"https://github.com/cfriedt","followers_url":"https://api.github.com/users/cfriedt/followers","following_url":"https://api.github.com/users/cfriedt/following{/other_user}","gists_url":"https://api.github.com/users/cfriedt/gists{/gist_id}","starred_url":"https://api.github.com/users/cfriedt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cfriedt/subscriptions","organizations_url":"https://api.github.com/users/cfriedt/orgs","repos_url":"https://api.github.com/users/cfriedt/repos","events_url":"https://api.github.com/users/cfriedt/events{/privacy}","received_events_url":"https://api.github.com/users/cfriedt/received_events","type":"User","site_admin":false},"body":"Why does this still contain a pile of code for active  scan? It should literally be a copy paste of my original ed_scan code, unchanged.\r\n\r\nPlease also pay attention to compiler warnings. I.e. status is unused, afaik","created_at":"2015-08-13T15:50:57Z","updated_at":"2015-08-13T15:50:57Z","html_url":"https://github.com/cfriedt/bluetooth-next/pull/9#discussion_r36990444","pull_request_url":"https://api.github.com/repos/cfriedt/bluetooth-next/pulls/9","_links":{"self":{"href":"https://api.github.com/repos/cfriedt/bluetooth-next/pulls/comments/36990444"},"html":{"href":"https://github.com/cfriedt/bluetooth-next/pull/9#discussion_r36990444"},"pull_request":{"href":"https://api.github.com/repos/cfriedt/bluetooth-next/pulls/9"}}},"pull_request":{"url":"https://api.github.com/repos/cfriedt/bluetooth-next/pulls/9","id":41387627,"html_url":"https://github.com/cfriedt/bluetooth-next/pull/9","diff_url":"https://github.com/cfriedt/bluetooth-next/pull/9.diff","patch_url":"https://github.com/cfriedt/bluetooth-next/pull/9.patch","issue_url":"https://api.github.com/repos/cfriedt/bluetooth-next/issues/9","number":9,"state":"closed","locked":false,"title":"[RFC] Feature/mlme scan","user":{"login":"magyarm","id":1568371,"avatar_url":"https://avatars.githubusercontent.com/u/1568371?v=3","gravatar_id":"","url":"https://api.github.com/users/magyarm","html_url":"https://github.com/magyarm","followers_url":"https://api.github.com/users/magyarm/followers","following_url":"https://api.github.com/users/magyarm/following{/other_user}","gists_url":"https://api.github.com/users/magyarm/gists{/gist_id}","starred_url":"https://api.github.com/users/magyarm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/magyarm/subscriptions","organizations_url":"https://api.github.com/users/magyarm/orgs","repos_url":"https://api.github.com/users/magyarm/repos","events_url":"https://api.github.com/users/magyarm/events{/privacy}","received_events_url":"https://api.github.com/users/magyarm/received_events","type":"User","site_admin":false},"body":"This should be everything for the active scan now. I'm creating this pull request as RFC since I have a feeling about missing something and need another set of eyes going over it. I'll return to it tomorrow with fresh eyes, and will resubmit when I see what's wrong.","created_at":"2015-07-31T22:38:18Z","updated_at":"2015-08-13T15:50:57Z","closed_at":"2015-08-12T15:55:05Z","merged_at":"2015-08-12T15:55:05Z","merge_commit_sha":"f1e83c7bae082d9d6f4ea7083d1bedc6f09dfd5e","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/cfriedt/bluetooth-next/pulls/9/commits","review_comments_url":"https://api.github.com/repos/cfriedt/bluetooth-next/pulls/9/comments","review_comment_url":"https://api.github.com/repos/cfriedt/bluetooth-next/pulls/comments{/number}","comments_url":"https://api.github.com/repos/cfriedt/bluetooth-next/issues/9/comments","statuses_url":"https://api.github.com/repos/cfriedt/bluetooth-next/statuses/2ffdf1414398d1b2d5e18bd3d53b4ae69a095623","head":{"label":"magyarm:feature/mlme-scan","ref":"feature/mlme-scan","sha":"2ffdf1414398d1b2d5e18bd3d53b4ae69a095623","user":{"login":"magyarm","id":1568371,"avatar_url":"https://avatars.githubusercontent.com/u/1568371?v=3","gravatar_id":"","url":"https://api.github.com/users/magyarm","html_url":"https://github.com/magyarm","followers_url":"https://api.github.com/users/magyarm/followers","following_url":"https://api.github.com/users/magyarm/following{/other_user}","gists_url":"https://api.github.com/users/magyarm/gists{/gist_id}","starred_url":"https://api.github.com/users/magyarm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/magyarm/subscriptions","organizations_url":"https://api.github.com/users/magyarm/orgs","repos_url":"https://api.github.com/users/magyarm/repos","events_url":"https://api.github.com/users/magyarm/events{/privacy}","received_events_url":"https://api.github.com/users/magyarm/received_events","type":"User","site_admin":false},"repo":{"id":39142482,"name":"bluetooth-next","full_name":"magyarm/bluetooth-next","owner":{"login":"magyarm","id":1568371,"avatar_url":"https://avatars.githubusercontent.com/u/1568371?v=3","gravatar_id":"","url":"https://api.github.com/users/magyarm","html_url":"https://github.com/magyarm","followers_url":"https://api.github.com/users/magyarm/followers","following_url":"https://api.github.com/users/magyarm/following{/other_user}","gists_url":"https://api.github.com/users/magyarm/gists{/gist_id}","starred_url":"https://api.github.com/users/magyarm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/magyarm/subscriptions","organizations_url":"https://api.github.com/users/magyarm/orgs","repos_url":"https://api.github.com/users/magyarm/repos","events_url":"https://api.github.com/users/magyarm/events{/privacy}","received_events_url":"https://api.github.com/users/magyarm/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/magyarm/bluetooth-next","description":null,"fork":true,"url":"https://api.github.com/repos/magyarm/bluetooth-next","forks_url":"https://api.github.com/repos/magyarm/bluetooth-next/forks","keys_url":"https://api.github.com/repos/magyarm/bluetooth-next/keys{/key_id}","collaborators_url":"https://api.github.com/repos/magyarm/bluetooth-next/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/magyarm/bluetooth-next/teams","hooks_url":"https://api.github.com/repos/magyarm/bluetooth-next/hooks","issue_events_url":"https://api.github.com/repos/magyarm/bluetooth-next/issues/events{/number}","events_url":"https://api.github.com/repos/magyarm/bluetooth-next/events","assignees_url":"https://api.github.com/repos/magyarm/bluetooth-next/assignees{/user}","branches_url":"https://api.github.com/repos/magyarm/bluetooth-next/branches{/branch}","tags_url":"https://api.github.com/repos/magyarm/bluetooth-next/tags","blobs_url":"https://api.github.com/repos/magyarm/bluetooth-next/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/magyarm/bluetooth-next/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/magyarm/bluetooth-next/git/refs{/sha}","trees_url":"https://api.github.com/repos/magyarm/bluetooth-next/git/trees{/sha}","statuses_url":"https://api.github.com/repos/magyarm/bluetooth-next/statuses/{sha}","languages_url":"https://api.github.com/repos/magyarm/bluetooth-next/languages","stargazers_url":"https://api.github.com/repos/magyarm/bluetooth-next/stargazers","contributors_url":"https://api.github.com/repos/magyarm/bluetooth-next/contributors","subscribers_url":"https://api.github.com/repos/magyarm/bluetooth-next/subscribers","subscription_url":"https://api.github.com/repos/magyarm/bluetooth-next/subscription","commits_url":"https://api.github.com/repos/magyarm/bluetooth-next/commits{/sha}","git_commits_url":"https://api.github.com/repos/magyarm/bluetooth-next/git/commits{/sha}","comments_url":"https://api.github.com/repos/magyarm/bluetooth-next/comments{/number}","issue_comment_url":"https://api.github.com/repos/magyarm/bluetooth-next/issues/comments{/number}","contents_url":"https://api.github.com/repos/magyarm/bluetooth-next/contents/{+path}","compare_url":"https://api.github.com/repos/magyarm/bluetooth-next/compare/{base}...{head}","merges_url":"https://api.github.com/repos/magyarm/bluetooth-next/merges","archive_url":"https://api.github.com/repos/magyarm/bluetooth-next/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/magyarm/bluetooth-next/downloads","issues_url":"https://api.github.com/repos/magyarm/bluetooth-next/issues{/number}","pulls_url":"https://api.github.com/repos/magyarm/bluetooth-next/pulls{/number}","milestones_url":"https://api.github.com/repos/magyarm/bluetooth-next/milestones{/number}","notifications_url":"https://api.github.com/repos/magyarm/bluetooth-next/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/magyarm/bluetooth-next/labels{/name}","releases_url":"https://api.github.com/repos/magyarm/bluetooth-next/releases{/id}","created_at":"2015-07-15T14:47:19Z","updated_at":"2015-07-15T14:52:02Z","pushed_at":"2015-08-13T13:42:33Z","git_url":"git://github.com/magyarm/bluetooth-next.git","ssh_url":"git@github.com:magyarm/bluetooth-next.git","clone_url":"https://github.com/magyarm/bluetooth-next.git","svn_url":"https://github.com/magyarm/bluetooth-next","homepage":null,"size":984413,"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":"cfriedt:feature/mlme-scan","ref":"feature/mlme-scan","sha":"aec1e24bd04cdd3a4801688a63872884e7e27718","user":{"login":"cfriedt","id":983494,"avatar_url":"https://avatars.githubusercontent.com/u/983494?v=3","gravatar_id":"","url":"https://api.github.com/users/cfriedt","html_url":"https://github.com/cfriedt","followers_url":"https://api.github.com/users/cfriedt/followers","following_url":"https://api.github.com/users/cfriedt/following{/other_user}","gists_url":"https://api.github.com/users/cfriedt/gists{/gist_id}","starred_url":"https://api.github.com/users/cfriedt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cfriedt/subscriptions","organizations_url":"https://api.github.com/users/cfriedt/orgs","repos_url":"https://api.github.com/users/cfriedt/repos","events_url":"https://api.github.com/users/cfriedt/events{/privacy}","received_events_url":"https://api.github.com/users/cfriedt/received_events","type":"User","site_admin":false},"repo":{"id":37265646,"name":"bluetooth-next","full_name":"cfriedt/bluetooth-next","owner":{"login":"cfriedt","id":983494,"avatar_url":"https://avatars.githubusercontent.com/u/983494?v=3","gravatar_id":"","url":"https://api.github.com/users/cfriedt","html_url":"https://github.com/cfriedt","followers_url":"https://api.github.com/users/cfriedt/followers","following_url":"https://api.github.com/users/cfriedt/following{/other_user}","gists_url":"https://api.github.com/users/cfriedt/gists{/gist_id}","starred_url":"https://api.github.com/users/cfriedt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cfriedt/subscriptions","organizations_url":"https://api.github.com/users/cfriedt/orgs","repos_url":"https://api.github.com/users/cfriedt/repos","events_url":"https://api.github.com/users/cfriedt/events{/privacy}","received_events_url":"https://api.github.com/users/cfriedt/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/cfriedt/bluetooth-next","description":null,"fork":false,"url":"https://api.github.com/repos/cfriedt/bluetooth-next","forks_url":"https://api.github.com/repos/cfriedt/bluetooth-next/forks","keys_url":"https://api.github.com/repos/cfriedt/bluetooth-next/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cfriedt/bluetooth-next/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cfriedt/bluetooth-next/teams","hooks_url":"https://api.github.com/repos/cfriedt/bluetooth-next/hooks","issue_events_url":"https://api.github.com/repos/cfriedt/bluetooth-next/issues/events{/number}","events_url":"https://api.github.com/repos/cfriedt/bluetooth-next/events","assignees_url":"https://api.github.com/repos/cfriedt/bluetooth-next/assignees{/user}","branches_url":"https://api.github.com/repos/cfriedt/bluetooth-next/branches{/branch}","tags_url":"https://api.github.com/repos/cfriedt/bluetooth-next/tags","blobs_url":"https://api.github.com/repos/cfriedt/bluetooth-next/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cfriedt/bluetooth-next/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cfriedt/bluetooth-next/git/refs{/sha}","trees_url":"https://api.github.com/repos/cfriedt/bluetooth-next/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cfriedt/bluetooth-next/statuses/{sha}","languages_url":"https://api.github.com/repos/cfriedt/bluetooth-next/languages","stargazers_url":"https://api.github.com/repos/cfriedt/bluetooth-next/stargazers","contributors_url":"https://api.github.com/repos/cfriedt/bluetooth-next/contributors","subscribers_url":"https://api.github.com/repos/cfriedt/bluetooth-next/subscribers","subscription_url":"https://api.github.com/repos/cfriedt/bluetooth-next/subscription","commits_url":"https://api.github.com/repos/cfriedt/bluetooth-next/commits{/sha}","git_commits_url":"https://api.github.com/repos/cfriedt/bluetooth-next/git/commits{/sha}","comments_url":"https://api.github.com/repos/cfriedt/bluetooth-next/comments{/number}","issue_comment_url":"https://api.github.com/repos/cfriedt/bluetooth-next/issues/comments{/number}","contents_url":"https://api.github.com/repos/cfriedt/bluetooth-next/contents/{+path}","compare_url":"https://api.github.com/repos/cfriedt/bluetooth-next/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cfriedt/bluetooth-next/merges","archive_url":"https://api.github.com/repos/cfriedt/bluetooth-next/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cfriedt/bluetooth-next/downloads","issues_url":"https://api.github.com/repos/cfriedt/bluetooth-next/issues{/number}","pulls_url":"https://api.github.com/repos/cfriedt/bluetooth-next/pulls{/number}","milestones_url":"https://api.github.com/repos/cfriedt/bluetooth-next/milestones{/number}","notifications_url":"https://api.github.com/repos/cfriedt/bluetooth-next/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cfriedt/bluetooth-next/labels{/name}","releases_url":"https://api.github.com/repos/cfriedt/bluetooth-next/releases{/id}","created_at":"2015-06-11T14:21:04Z","updated_at":"2015-07-14T15:08:11Z","pushed_at":"2015-08-13T15:48:41Z","git_url":"git://github.com/cfriedt/bluetooth-next.git","ssh_url":"git@github.com:cfriedt/bluetooth-next.git","clone_url":"https://github.com/cfriedt/bluetooth-next.git","svn_url":"https://github.com/cfriedt/bluetooth-next","homepage":null,"size":982921,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":2,"forks":3,"open_issues":2,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/cfriedt/bluetooth-next/pulls/9"},"html":{"href":"https://github.com/cfriedt/bluetooth-next/pull/9"},"issue":{"href":"https://api.github.com/repos/cfriedt/bluetooth-next/issues/9"},"comments":{"href":"https://api.github.com/repos/cfriedt/bluetooth-next/issues/9/comments"},"review_comments":{"href":"https://api.github.com/repos/cfriedt/bluetooth-next/pulls/9/comments"},"review_comment":{"href":"https://api.github.com/repos/cfriedt/bluetooth-next/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/cfriedt/bluetooth-next/pulls/9/commits"},"statuses":{"href":"https://api.github.com/repos/cfriedt/bluetooth-next/statuses/2ffdf1414398d1b2d5e18bd3d53b4ae69a095623"}}}}