Code Monkey home page Code Monkey logo

l3roamd's People

Contributors

christf avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

l3roamd's Issues

please make cfg80211 dependency optional

when running l3roamd the kernel module cfg80211 must be loaded otherwise l3roamd exits with the message:
"nl80211 not found"

the error message seems to be originating from wifistations.c

106 int nl80211_id = genl_ctrl_resolve(ctx->nl_sock, "nl80211");
107 if (nl80211_id < 0) {
108 fprintf(stderr, "nl80211 not found.\n");
109 goto fail;
110 }

should l3roamd really depend on cfg80211 even if the system that it runs on does not contain wifi hardware?

Anleitung zur Installation

Gibt es irgendwo schon eine Anleitung wie man l3 baut und fürs debuggen auf einem Router laufen lässt?

Reach node responsible for a client using a special IP

Nodes could generate a special IP address generated using a clients MAC address (like: PREFIX::MAC), announce a local route and assign this address to lo. A node claiming a client would first look for a route to this special IP address and if it is present contact the node previously serving the client using this address to initiate a smooth handover.

Maybe use fec0::/10?

No replicated database

It may suffice to only store client information on a single node. In case this node disappears, routes to clients can be rediscovered when needed. This may cause slight hiccups.

If we do this, we'd need the ability to query the network for a specific client given its MAC address.

Basically we need two new packet types:

  • request information about a MAC (should be flooded for now)
  • response containing list of IPs for that MAC

Information about a MAC should be requested whenever a new client appears, even if local information is available

The request actually claims the client. If another node thinks it owns the client, it'll compare the timestamp. If the other node has a younger timestamp, it won't respond but instead claim the client itself (by sending a request).Otherwise, it'll respond and let got of the client.

  • clientmgr_handle_claim dazu umbauen

remove routes when appropiate

  • periodically contact client (neighbor solicitation)
  • update timestamp on reply
  • purge clients that haven't responded for a while (also purge routes!)

obtaining IP-addresss when igmp_snooping=1 may take up to 5 minutes

I was able to capture this log. A new client (00:18:de:24:c6:7c) appears but it does not receive an IP address. In the same configuration in another connection attempt everything works.

What needs fixing?

Sun Nov 27 18:54:38 2016 daemon.info l3roamd[871]: client0: Checking Client 9c:eb:e8:20:92:a2 (active, br-client/7)
Sun Nov 27 18:54:38 2016 daemon.info l3roamd[871]: ACTIVE 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 (865.217705780)
Sun Nov 27 18:54:38 2016 daemon.info l3roamd[871]: Send NS to ff02::1:ff20:92a2
Sun Nov 27 18:54:38 2016 daemon.info l3roamd[871]: Add Address: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2
Sun Nov 27 18:54:38 2016 daemon.info l3roamd[871]: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 changes from ACTIVE to ACTIVE
Sun Nov 27 18:54:39 2016 daemon.info l3roamd[871]: event 19
Sun Nov 27 18:54:39 2016 daemon.info l3roamd[871]: client0: new station 00:18:de:24:c6:7c
Sun Nov 27 18:54:39 2016 daemon.info l3roamd[871]: new client 00:18:de:24:c6:7c on br-client
Sun Nov 27 18:54:39 2016 daemon.info l3roamd[871]: event 60
Sun Nov 27 18:54:39 2016 daemon.info l3roamd[871]: client0: Checking Client 00:18:de:24:c6:7c (active, br-client/7)
Sun Nov 27 18:54:39 2016 daemon.info hostapd: client0: STA 00:18:de:24:c6:7c IEEE 802.11: authenticated
Sun Nov 27 18:54:39 2016 daemon.info hostapd: client0: STA 00:18:de:24:c6:7c IEEE 802.11: associated (aid 1)
Sun Nov 27 18:54:39 2016 daemon.info l3roamd[871]: event 60
Sun Nov 27 18:54:39 2016 kern.warn kernel: [ 871.040000] REJECT(src client)IN=br-client OUT= MAC=ff:ff:ff:ff:ff:ff:00:18:de:24:c6:7c:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=328 TOS=0x10 PREC=0x00 TTL=128 ID=0 PROTO=UDP SPT=68 DPT=67 LEN=308
Sun Nov 27 18:54:41 2016 daemon.info fastd[1597]: resolving host gw02.babel.ffm.freifunk.net' for peer <mesh_vpn_backbone_peer_fastd2>... Sun Nov 27 18:54:41 2016 daemon.info fastd[1597]: resolving host gw02.babel.ffm.freifunk.net' failed: Name or service not known
Sun Nov 27 18:54:42 2016 kern.warn kernel: [ 873.550000] REJECT(src client)IN=br-client OUT= MAC=ff:ff:ff:ff:ff:ff:00:18:de:24:c6:7c:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=328 TOS=0x10 PREC=0x00 TTL=128 ID=0 PROTO=UDP SPT=68 DPT=67 LEN=308
Sun Nov 27 18:54:43 2016 daemon.info l3roamd[871]: client0: Checking Client 9c:eb:e8:20:92:a2 (active, br-client/7)
Sun Nov 27 18:54:43 2016 daemon.info l3roamd[871]: ACTIVE 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 (870.218194250)
Sun Nov 27 18:54:43 2016 daemon.info l3roamd[871]: Send NS to ff02::1:ff20:92a2
Sun Nov 27 18:54:43 2016 daemon.info l3roamd[871]: Add Address: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2
Sun Nov 27 18:54:43 2016 daemon.info l3roamd[871]: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 changes from ACTIVE to ACTIVE
Sun Nov 27 18:54:44 2016 daemon.info l3roamd[871]: Checking Client 00:18:de:24:c6:7c (active, br-client/7)
Sun Nov 27 18:54:48 2016 daemon.info l3roamd[871]: Checking Client 9c:eb:e8:20:92:a2 (active, br-client/7)
Sun Nov 27 18:54:48 2016 daemon.info l3roamd[871]: ACTIVE 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 (875.218978220)
Sun Nov 27 18:54:48 2016 daemon.info l3roamd[871]: Send NS to ff02::1:ff20:92a2
Sun Nov 27 18:54:48 2016 daemon.info l3roamd[871]: Add Address: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2
Sun Nov 27 18:54:48 2016 daemon.info l3roamd[871]: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 changes from ACTIVE to ACTIVE
Sun Nov 27 18:54:48 2016 kern.warn kernel: [ 880.240000] REJECT(src client)IN=br-client OUT= MAC=ff:ff:ff:ff:ff:ff:00:18:de:24:c6:7c:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=328 TOS=0x10 PREC=0x00 TTL=128 ID=0 PROTO=UDP SPT=68 DPT=67 LEN=308
Sun Nov 27 18:54:49 2016 daemon.info l3roamd[871]: Checking Client 00:18:de:24:c6:7c (active, br-client/7)
Sun Nov 27 18:54:53 2016 daemon.info l3roamd[871]: Checking Client 9c:eb:e8:20:92:a2 (active, br-client/7)
Sun Nov 27 18:54:53 2016 daemon.info l3roamd[871]: ACTIVE 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 (880.219782270)
Sun Nov 27 18:54:53 2016 daemon.info l3roamd[871]: Send NS to ff02::1:ff20:92a2
Sun Nov 27 18:54:53 2016 daemon.info l3roamd[871]: Add Address: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2
Sun Nov 27 18:54:53 2016 daemon.info l3roamd[871]: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 changes from ACTIVE to ACTIVE
Sun Nov 27 18:54:54 2016 daemon.info l3roamd[871]: Checking Client 00:18:de:24:c6:7c (active, br-client/7)
Sun Nov 27 18:54:58 2016 daemon.info l3roamd[871]: Checking Client 9c:eb:e8:20:92:a2 (active, br-client/7)
Sun Nov 27 18:54:58 2016 daemon.info l3roamd[871]: ACTIVE 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 (885.220328500)
Sun Nov 27 18:54:58 2016 daemon.info l3roamd[871]: Send NS to ff02::1:ff20:92a2
Sun Nov 27 18:54:58 2016 daemon.info l3roamd[871]: Add Address: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2
Sun Nov 27 18:54:58 2016 daemon.info l3roamd[871]: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 changes from ACTIVE to ACTIVE
Sun Nov 27 18:54:59 2016 daemon.info l3roamd[871]: Checking Client 00:18:de:24:c6:7c (active, br-client/7)
Sun Nov 27 18:55:00 2016 kern.warn kernel: [ 891.740000] REJECT(src client)IN=br-client OUT= MAC=ff:ff:ff:ff:ff:ff:00:18:de:24:c6:7c:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=328 TOS=0x10 PREC=0x00 TTL=128 ID=0 PROTO=UDP SPT=68 DPT=67 LEN=308
Sun Nov 27 18:55:02 2016 daemon.info fastd[1597]: resolving host gw02.babel.ffm.freifunk.net' for peer <mesh_vpn_backbone_peer_fastd2>... Sun Nov 27 18:55:02 2016 daemon.info fastd[1597]: resolving host gw02.babel.ffm.freifunk.net' failed: Name or service not known
Sun Nov 27 18:55:03 2016 daemon.info l3roamd[871]: Checking Client 9c:eb:e8:20:92:a2 (active, br-client/7)

as opposed to a different connection try, when everything seems to work in the same configuration, just a while later.
Nov 27 18:56:33 2016 daemon.info l3roamd[871]: Add Address: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2
Sun Nov 27 18:56:33 2016 daemon.info l3roamd[871]: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 changes from ACTIVE to ACTIVE
Sun Nov 27 18:56:34 2016 daemon.info l3roamd[871]: Checking Client 00:18:de:24:c6:7c (active, br-client/7)
Sun Nov 27 18:56:38 2016 daemon.info l3roamd[871]: Checking Client 9c:eb:e8:20:92:a2 (active, br-client/7)
Sun Nov 27 18:56:38 2016 daemon.info l3roamd[871]: ACTIVE 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 (985.257362680)
Sun Nov 27 18:56:38 2016 daemon.info l3roamd[871]: Send NS to ff02::1:ff20:92a2
Sun Nov 27 18:56:38 2016 daemon.info l3roamd[871]: Add Address: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2
Sun Nov 27 18:56:38 2016 daemon.info l3roamd[871]: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 changes from ACTIVE to ACTIVE
Sun Nov 27 18:56:39 2016 daemon.info l3roamd[871]: Checking Client 00:18:de:24:c6:7c (active, br-client/7)
Sun Nov 27 18:56:42 2016 daemon.info fastd[1597]: resolving host gw02.babel.ffm.freifunk.net' for peer <mesh_vpn_backbone_peer_fastd2>... Sun Nov 27 18:56:42 2016 daemon.info fastd[1597]: resolving host gw02.babel.ffm.freifunk.net' failed: Name or service not known
Sun Nov 27 18:56:43 2016 daemon.info l3roamd[871]: Checking Client 9c:eb:e8:20:92:a2 (active, br-client/7)
Sun Nov 27 18:56:43 2016 daemon.info l3roamd[871]: ACTIVE 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 (990.256023740)
Sun Nov 27 18:56:43 2016 daemon.info l3roamd[871]: Send NS to ff02::1:ff20:92a2
Sun Nov 27 18:56:43 2016 daemon.info l3roamd[871]: Add Address: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2
Sun Nov 27 18:56:43 2016 daemon.info l3roamd[871]: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 changes from ACTIVE to ACTIVE
Sun Nov 27 18:56:44 2016 daemon.info l3roamd[871]: Checking Client 00:18:de:24:c6:7c (active, br-client/7)
Sun Nov 27 18:56:44 2016 daemon.info l3roamd[871]: event 60
Sun Nov 27 18:56:47 2016 daemon.info l3roamd[871]: client0: event 19
Sun Nov 27 18:56:47 2016 daemon.info l3roamd[871]: client0: new station 00:18:de:24:c6:7c
Sun Nov 27 18:56:47 2016 daemon.info l3roamd[871]: new client 00:18:de:24:c6:7c on br-client
Sun Nov 27 18:56:47 2016 daemon.info l3roamd[871]: event 60
Sun Nov 27 18:56:47 2016 daemon.info l3roamd[871]: client0: Checking Client 00:18:de:24:c6:7c (active, br-client/7)
Sun Nov 27 18:56:47 2016 daemon.info hostapd: client0: STA 00:18:de:24:c6:7c IEEE 802.11: authenticated
Sun Nov 27 18:56:47 2016 daemon.info hostapd: client0: STA 00:18:de:24:c6:7c IEEE 802.11: associated (aid 1)
Sun Nov 27 18:56:47 2016 daemon.info l3roamd[871]: event 60
Sun Nov 27 18:56:47 2016 kern.warn kernel: [ 999.320000] REJECT(src client)IN=br-client OUT= MAC=ff:ff:ff:ff:ff:ff:00:18:de:24:c6:7c:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=328 TOS=0x10 PREC=0x00 TTL=128 ID=0 PROTO=UDP SPT=68 DPT=67 LEN=308
Sun Nov 27 18:56:48 2016 daemon.info l3roamd[871]: client0: Checking Client 9c:eb:e8:20:92:a2 (active, br-client/7)
Sun Nov 27 18:56:48 2016 daemon.info l3roamd[871]: ACTIVE 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 (995.255729510)
Sun Nov 27 18:56:48 2016 daemon.info l3roamd[871]: Send NS to ff02::1:ff20:92a2
Sun Nov 27 18:56:48 2016 daemon.info l3roamd[871]: Add Address: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2
Sun Nov 27 18:56:48 2016 daemon.info l3roamd[871]: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 changes from ACTIVE to ACTIVE
Sun Nov 27 18:56:50 2016 kern.warn kernel: [ 1001.860000] REJECT(src client)IN=br-client OUT= MAC=ff:ff:ff:ff:ff:ff:00:18:de:24:c6:7c:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=328 TOS=0x10 PREC=0x00 TTL=128 ID=0 PROTO=UDP SPT=68 DPT=67 LEN=308
Sun Nov 27 18:56:51 2016 daemon.info l3roamd[871]: Add Address: fe80::218:deff:fe24:c67c
Sun Nov 27 18:56:52 2016 daemon.info l3roamd[871]: Checking Client 00:18:de:24:c6:7c (active, br-client/7)
Sun Nov 27 18:56:53 2016 daemon.info l3roamd[871]: Checking Client 9c:eb:e8:20:92:a2 (active, br-client/7)
Sun Nov 27 18:56:53 2016 daemon.info l3roamd[871]: ACTIVE 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 (1000.256491255)
Sun Nov 27 18:56:53 2016 daemon.info l3roamd[871]: Send NS to ff02::1:ff20:92a2
Sun Nov 27 18:56:53 2016 daemon.info l3roamd[871]: Add Address: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2
Sun Nov 27 18:56:53 2016 daemon.info l3roamd[871]: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 changes from ACTIVE to ACTIVE
Sun Nov 27 18:56:56 2016 kern.warn kernel: [ 1008.210000] REJECT(src client)IN=br-client OUT= MAC=ff:ff:ff:ff:ff:ff:00:18:de:24:c6:7c:08:00 SRC=0.0.0.0 DST=255.255.255.255 LEN=328 TOS=0x10 PREC=0x00 TTL=128 ID=0 PROTO=UDP SPT=68 DPT=67 LEN=308
Sun Nov 27 18:56:57 2016 daemon.info l3roamd[871]: Checking Client 00:18:de:24:c6:7c (active, br-client/7)
Sun Nov 27 18:56:58 2016 daemon.info l3roamd[871]: Checking Client 9c:eb:e8:20:92:a2 (active, br-client/7)
Sun Nov 27 18:56:58 2016 daemon.info l3roamd[871]: ACTIVE 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 (1005.257325825)
Sun Nov 27 18:56:58 2016 daemon.info l3roamd[871]: Send NS to ff02::1:ff20:92a2
Sun Nov 27 18:56:58 2016 daemon.info l3roamd[871]: Add Address: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2
Sun Nov 27 18:56:58 2016 daemon.info l3roamd[871]: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 changes from ACTIVE to ACTIVE
Sun Nov 27 18:57:00 2016 daemon.info fastd[1597]: resolving host gw02.babel.ffm.freifunk.net' for peer <mesh_vpn_backbone_peer_fastd2>... Sun Nov 27 18:57:00 2016 daemon.info fastd[1597]: resolving host gw02.babel.ffm.freifunk.net' failed: Name or service not known
Sun Nov 27 18:57:02 2016 daemon.info l3roamd[871]: Checking Client 00:18:de:24:c6:7c (active, br-client/7)
Sun Nov 27 18:57:03 2016 daemon.info l3roamd[871]: event 60
Sun Nov 27 18:57:03 2016 daemon.info l3roamd[871]: client0: Checking Client 9c:eb:e8:20:92:a2 (active, br-client/7)
Sun Nov 27 18:57:03 2016 daemon.info l3roamd[871]: ACTIVE 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 (1010.258089745)
Sun Nov 27 18:57:03 2016 daemon.info l3roamd[871]: Send NS to ff02::1:ff20:92a2
Sun Nov 27 18:57:03 2016 daemon.info l3roamd[871]: Add Address: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2
Sun Nov 27 18:57:03 2016 daemon.info l3roamd[871]: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 changes from ACTIVE to ACTIVE
Sun Nov 27 18:57:04 2016 daemon.info l3roamd[871]: Got packet to 2a06:8187:fbab:2:218:deff:fe24:c67c
Sun Nov 27 18:57:04 2016 daemon.info l3roamd[871]: Looking for 2a06:8187:fbab:2:218:deff:fe24:c67c
Sun Nov 27 18:57:04 2016 daemon.info l3roamd[871]: Send NS to ff02::1:ff24:c67c
Sun Nov 27 18:57:04 2016 daemon.info l3roamd[871]: Got packet to 2a06:8187:fbab:2:218:deff:fe24:c67c
Sun Nov 27 18:57:04 2016 daemon.info l3roamd[871]: Add Address: 2a06:8187:fbab:2:218:deff:fe24:c67c
Sun Nov 27 18:57:04 2016 daemon.info l3roamd[871]: 2a06:8187:fbab:2:218:deff:fe24:c67c changes from INACTIVE to ACTIVE
Sun Nov 27 18:57:07 2016 daemon.info l3roamd[871]: Checking Client 00:18:de:24:c6:7c (active, br-client/7)
Sun Nov 27 18:57:07 2016 daemon.info l3roamd[871]: ACTIVE 2a06:8187:fbab:2:218:deff:fe24:c67c (1015.826378795)
Sun Nov 27 18:57:07 2016 daemon.info l3roamd[871]: Send NS to ff02::1:ff24:c67c
Sun Nov 27 18:57:07 2016 daemon.info l3roamd[871]: Add Address: 2a06:8187:fbab:2:218:deff:fe24:c67c
Sun Nov 27 18:57:07 2016 daemon.info l3roamd[871]: 2a06:8187:fbab:2:218:deff:fe24:c67c changes from ACTIVE to ACTIVE
Sun Nov 27 18:57:08 2016 daemon.info l3roamd[871]: Checking Client 9c:eb:e8:20:92:a2 (active, br-client/7)
Sun Nov 27 18:57:08 2016 daemon.info l3roamd[871]: ACTIVE 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 (1015.258922520)
Sun Nov 27 18:57:08 2016 daemon.info l3roamd[871]: Send NS to ff02::1:ff20:92a2
Sun Nov 27 18:57:08 2016 daemon.info l3roamd[871]: Add Address: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2
Sun Nov 27 18:57:08 2016 daemon.info l3roamd[871]: 2a06:8187:fbab:2:9eeb:e8ff:fe20:92a2 changes from ACTIVE to ACTIVE

timers in l3roamd

  • re-trigger ND NS after a timeout (e.g. 15 minutes)
  • remove stale client and routes
  • send intercom packets three times, with 1s delay

Clientdatabase entry should be semigroup

Basically, we'd want to merge two client entries like this. A client entry contains:

  • the client's MAC address
  • timestamp when this client was last discovered
  • a list of IP addresses for that client, each with a last seen time

We need to merge it like this:

  • timestamp = max(timestamp_a, timestamp_b)
  • for each entry in ip_list_b check if it is in ip_list_a. if yes, update timestamp to max, else add entry as is

The idea would be that a node stores information about its clients. Other nodes can request that information. Multiple nodes may respond and the requesting node may already know a few IP addresses for the client. Upon receiving responses, the node would then combine them.

  • response (clientinfo) is sent using unicast and TTL = 1
  • After combining entries routes need to be updated. It may be necessary to derive a list of removed and added entries from the operation.

config file and command parser

  • There should be a config file.
  • There should be a command interface.
  • Both share the same set of commands. The config file is, essentially, a script.

At the very least, these commands are required:

  • attach-mesh-interface
  • detach-mesh-interface
  • attach-client-interface
  • detach-client-interface
  • add-prefix
  • remove-prefix
  • set-export-table

Repeat claim up to three times

In case of no response a claim should be tried up to three times, each after a short delay of about 1s if no response is received. Use the relinquished flag to determine when to stop.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.