Giter Site home page Giter Site logo

opencapwap's Introduction

OpenCAPWAP v2.0

Open source implementation of the CAPWAP protocol according to RFC 4515 and RFC 4516. It supports both SplitMAC and LocalMAC operational architectures.

For further informations please refer to:
"OpenCAPWAP v2.0: the new open-source implementation of the CAPWAP protocol", E. Agostini, M. Bernaschi, M. Vellucci, L. Vollero International Journal of Network Management 2016, Volume 26, Issue 6, Pages 537–552

Wiley Online Library
ResearchGate

Requirements

This version has been tested on Linux Debian distro 32-bit. You need to install the following libraries:

libnl-3-dev
libnl-3-genl-dev
libssl-dev

In order to run the WTP software, you must have a wireless card with AP mode available (check with iw)

Installing

Within the openCAPWAP folder, type:

make clean
make

For further info, please refer to the INSTALL file

Notes

OpenCAPWAP doesn't provide any type of DHCP service or IP assignation to associated stations, that is you must have a DHCP server active. When a client station associates with the WTP's AP interface, it starts to send DHCP Discovery messages. If you are using the SPLIT MAC mode, you must create a bridge between AC's network interface (ethernet or wireless) and the AC's tap interface. If you are using the LOCAL MAC mode, you must create a bridge between the WTP's AP interface and the ethernet interface. The DHCP server must be reachable from WTP's ethernet (LOCAL MAC) or AC's ethernet (SPLIT MAC).

opencapwap's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

opencapwap's Issues

Can't start AC - issue

Hi,

I am new to openCapwap. I am trying to run the AC and WTP. but i am getting error while running AC, the log says that 'Found 0 network interfaces' and then 'Can't start AC.' Please help me to resolve the issue.

Thanks

WTP can't join the AC as the AC deamon is crashing

Hi,
I'm struggling with getting the WTP connect to the AC. We are using an OpenWRT based - TPLink 841ND AP and have built and ported OpenCAPWAP's WTP component on it. We observe that the AC deamon responds to the Discovery-req from the WTP, the WTP receives the Discovery-Resp, proceeds to open the DTLS channel, But the AC crashes immediately after receiving the Client-Hello. I traced it to the CWSecurityReceive -> SSL_Recv() function.

We've kind of hit a dead-end on this.

Could some-one provide some help on this issue and the following queries:

  1. Which is the stable and working branch of the two - master or elana.ago? I ask this because I see a lot of compiler warnings when I build the master (on both Ubuntu/AC and OpenWRT/WTP) - so not sure if the Master is the stable branch.
  2. The INSTALL does not mention anything about openSSL or the certificates. Do we need to make any openSSL specific configuration?
  3. The makefile adds CW_NO_DTLS to CFLAGS - as per the code, this should disable the DTLS support. why do we set this flag?
  4. To what extent is the splitMAC mode supported?

ac.log.txt
wtp1.txt

Regards,
Naveen Bhatia

where can i findthe binaries - i dont have the compile capabilty

appreciate if you some one can make the copy of compiled binaries available ?
also i want to simulate the client on the WTP itself -so WTP is talking to WLC.
So WTP is a VM with two interfaces -one connected to WLC and another which is a VLAN we connect based on the info we recieve from WLC after it authenticates the client with a Cisco ISE.

the opencapwap code

hello all:
I have an question that the openCAPWAP is running as an ac or ap?
I think that the ac only need the capwap control packet process and the fsm.why
the WTP is need for?
--Shen Ni

Cant Connect Station to Access point

Hi , I am trying to run AC and WTP on two separate machines in Local MAC mode. I have succeeded in creating a WLAN network using wum which in turn creates an AP WTPWLan00 . I assign a static IP to it and try to connect UE to it. UE is assigned dynamic IP by dhcp server listening on WTPWLan00 interface .
But still WTP or AC logs give no information regarding UE(base station) association.

WTP halts at Waiting for data->station(Mac address) and echo response
AC halts at Parse configuration response ... Result code = 0

What am I missing?

Note : No bridges created on WTP or AC .... First step, trying to obtain successful UE association at WTP

STA ping the AC disable

AS the INSTALL file , i run ac and wtp.
but the STA cant ping to the AC. Is there any more details not in INSTALL file?

create ap

Hi!
Now, I have connected two WTPs with the AC.They are "My WTP 1" and "My WTP 2". I also have create an AP on WTP 1 by the command "sudo ./wum -c addwlan -w 0 - r 1 -l 1 -s test -t 1". But if I want to create an AP on WTP 2, how can I do ? Can I execute the command "sudo ./wum -c addwlan -w 1 -r 2 -l 2 -s test2 -t 2"? Is it right?

Why (802.11a)5GHz wifi not support ?

Hi ,
I found that the capwap-split_mac does not support 11an band. Thus I try to add some new code for making 80211A band work. However I failed with error "Failed to stop TX DMA queue=0x004!"
After I adding my code, the 5GHz client can get IP from dhcp server, but the WTP failed to send packet to client, such as 'ARP reply', which result in client can not study the arp table well.
Any resolution on this issue? thanks.

Station can't connect to WTP

Hi, everyone

I build the code, and run. AP and WTP run fine. But I try use my cellphone connect to WTP.
The cellphone didn't get IP, please help me.
I upload the log to dropbox.
WTP log https://www.dropbox.com/s/ln2juio0bnle07o/wtp1.txt?dl=0
AC log https://www.dropbox.com/s/s6w0hdsrviy8efl/ac.log.txt?dl=0

And the device iw infomatiom
phy#0
Interface WTPWLan00
ifindex 7
wdev 0x2
addr 8c:c7:aa:00:c0:48
ssid TEST789
type AP
channel 1 (2412 MHz), width: 20 MHz (no HT), center1: 2412 MHz

OpenCAPWAP

Hello everyone !
When I execute "sudo ./wum -c addwlan -w 0 -s test -r 1 -l 0 -t 1 ",I get an error in wtp log file ."NL80211 ERROR] Set new STA error: -22, Invalid argument".If you can solve this error ,help me ,Thank you !

CentOS 6 make fail

[root@localhost openCAPWAP]# uname -a
Linux localhost 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost openCAPWAP]# pwd
/root/.ssh/openCAPWAP
[root@localhost openCAPWAP]# make AC
gcc -DCW_NO_DTLS -DCW_NO_DTLSCWParseConfigurationUpdateRequest -DCW_DEBUGGING -DOPENSSL_NO_KRB5 -I/usr/include/libnl3 -I./HostapdHeaders/utils/ -c -o CWTunnel.o CWTunnel.c
CWTunnel.c: In function ‘CWConvertDataFrame_8023_to_80211’:
CWTunnel.c:70: error: ‘ETH_P_802_3_MIN’ undeclared (first use in this function)
CWTunnel.c:70: error: (Each undeclared identifier is reported only once
CWTunnel.c:70: error: for each function it appears in.)
make: *** [CWTunnel.o] Error 1

Please help

Call through Opencapwap setup and connection to external PDN

Hi,
We are trying to build a Call setup using the WTP and AC agents of opencapwap to connect to external PDN . We need to know if this opencapwap setup at its current stage(code from elena.ago branch) be able to handle this. Or do we need to make any modifications on WTP and AC source code? If so , what are the sections in project that we will need to modify?

socket newer closed after leaving sulking state and new socket opened

...which gives WTP a lot of open but defunct sockets that cannot be used by the OS.

The code is full of resource leaks, notable gWTPSocket is not freed before overwrite.

The close-net functions calls 'shutdowns, but passes the arguments in the wrong order.

I've got a few more bugs, notably shrinking the stack size for pthreads so it doesn't take up 8MB per thread (it is not nice on an embedded device and very notable).

user interface and/or API to opencapwap?

I understand that OpenCapWap has one type of service running on the access points and another that runs on the controller AC). How does a user (like a network administrator) interact with the AC component of OpenCapWap? Is there a command line interface? Is there an API so that a developer can extend OpenCapWap? Are either of these documented anywhere? Thanks.

Configuration wireless network in elena.ago branch.

Hello!
I'm using branch elena.ago on Ubuntu 14.04. When I run WTP in system created two interfaces (WTPWLan00 and monitor0), but WiFi network wasn't created. In last post about issues was said: "In elenago branch there is no need of hostapd". So, how can I configure a wireless network with WTP?

Connecting Staton to WTP

Hi,
I am using openCapwap WTP and AC. AC and WTP are running fine. Both are coming in RUN state. Through WUM i have sent add wlan also. But on another X86 laptop (which i am using as Station), there SSID is coming as AD_HOC. I am not able to connect any other station also.

Can you please shed some light on this??

can't compile the code on Ubuntu 64bit

Hi, as the title: I try to build the code of master branch,but i can't conpile it.
my os is Ubuntu 16.04 64bit, and if alse find the INSTALL FILE "libnl-3-genl" is not avalible, it should be "libnl-genl-3-dev". the error message like this:
CW80211InformationElements.c:(.text+0x131e): undefined reference to CWLog' CW80211InformationElements.c:(.text+0x1359): undefined reference to CWLog'
CW80211InformationElements.c:(.text+0x139a): undefined reference to CWLog' CW80211InformationElements.o: In function CW80211AssembleProbeResponse':
CW80211InformationElements.c:(.text+0x1676): undefined reference to CWLog' CW80211InformationElements.o:CW80211InformationElements.c:(.text+0x1a61): more undefined references to CWLog' follow
collect2: error: ld returned 1 exit status
Makefile:120: recipe for target 'AC' failed

anybody know why?
Or which is the right build enverionment?

Opencapwap

Hello! I have a question about OpebCAPWAP protocol. Now, I have start AC and WTP on the two computers. But, when I close the WTP, AC will close too. why?
The error on the AC side is : libgcc_s.so.1 must be installed for the pthread_canel .

AC build problem

Hello,

we have tried to build the AC using your project: we have used hostapd1_1 and ubuntu 12.04 (3.13.0.-32-generic).

First of all, we have build 'pure' hostapd1_1 - no problems. After that, we added the wrapper by using your instruction: have obtained the following errors:

ieee80211_radiotap_iterator_init': /home/user/hostap_1_1/hostapd/../src/utils/radiotap.c:84: multiple definition ofieee80211_radiotap_iterator_init'
../src/utils/radiotap.o:/home/user/hostap_1_1/hostapd/../src/utils/radiotap.c:84: first defined here
../src/utils/radiotap.o: In function ieee80211_radiotap_iterator_next': /home/user/hostap_1_1/hostapd/../src/utils/radiotap.c:160: multiple definition ofieee80211_radiotap_iterator_next'
../src/utils/radiotap.o:/home/user/hostap_1_1/hostapd/../src/utils/radiotap.c:160: first defined here
../src/drivers/netlink_fake.o: In function netlink_init': /home/user/hostap_1_1/hostapd/../src/drivers/netlink_fake.c:48: multiple definition ofnetlink_init'
../src/drivers/netlink.o:/home/user/hostap_1_1/hostapd/../src/drivers/netlink.c:98: first defined here
../src/drivers/netlink_fake.o: In function netlink_deinit': /home/user/hostap_1_1/hostapd/../src/drivers/netlink_fake.c:76: multiple definition ofnetlink_deinit'
../src/drivers/netlink.o:/home/user/hostap_1_1/hostapd/../src/drivers/netlink.c:135: first defined here
../src/drivers/netlink_fake.o: In function netlink_send_oper_ifla': /home/user/hostap_1_1/hostapd/../src/drivers/netlink_fake.c:82: multiple definition ofnetlink_send_oper_ifla'
../src/drivers/netlink.o:/home/user/hostap_1_1/hostapd/../src/drivers/netlink.c:148: first defined here
../src/drivers/linux_ioctl_fake.o: In function linux_set_iface_flags': /home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl_fake.c:29: multiple definition oflinux_set_iface_flags'
../src/drivers/linux_ioctl.o:/home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl.c:25: first defined here
../src/drivers/linux_ioctl_fake.o: In function linux_iface_up': /home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl_fake.c:34: multiple definition oflinux_iface_up'
../src/drivers/linux_ioctl.o:/home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl.c:64: first defined here
../src/drivers/linux_ioctl_fake.o: In function linux_get_ifhwaddr': /home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl_fake.c:36: multiple definition oflinux_get_ifhwaddr'
../src/drivers/linux_ioctl.o:/home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl.c:86: first defined here
../src/drivers/linux_ioctl_fake.o: In function linux_set_ifhwaddr': /home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl_fake.c:72: multiple definition oflinux_set_ifhwaddr'
../src/drivers/linux_ioctl.o:/home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl.c:109: first defined here
../src/drivers/linux_ioctl_fake.o: In function linux_br_add': /home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl_fake.c:91: multiple definition oflinux_br_add'
../src/drivers/linux_ioctl.o:/home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl.c:142: first defined here
../src/drivers/linux_ioctl_fake.o: In function linux_br_del': /home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl_fake.c:95: multiple definition oflinux_br_del'
../src/drivers/linux_ioctl.o:/home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl.c:154: first defined here
../src/drivers/linux_ioctl_fake.o: In function linux_br_add_if': /home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl_fake.c:99: multiple definition oflinux_br_add_if'
../src/drivers/linux_ioctl.o:/home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl.c:166: first defined here
../src/drivers/linux_ioctl_fake.o: In function linux_br_del_if': /home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl_fake.c:103: multiple definition oflinux_br_del_if'
../src/drivers/linux_ioctl.o:/home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl.c:188: first defined here
../src/drivers/linux_ioctl_fake.o: In function linux_br_get': /home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl_fake.c:107: multiple definition oflinux_br_get'
../src/drivers/linux_ioctl.o:/home/user/hostap_1_1/hostapd/../src/drivers/linux_ioctl.c:210: first defined here

Where the problem might be?

Throughput problem

Hello,
I'm using two chipsets (wireless usb adapters) supporting IEEE 802.11n. However, when running openCAPWAP, I only get a max of 7Mbps between the station and the WTP.
In hostapd, we have to set up ieee80211n option in the config file.
How we can set up this option in the WTP configuration or at least how we can have a better bitrate?
Have you any idea?
Thanks

Make Fail

Hi,
After trying to make the openCAPWAP master I get the following errors,

Error number 1

CWSecurity.c: In function ‘CWSecurityInitSessionClient’:
CWSecurity.c:235:43: error: macro "BIO_ctrl_set_connected" passed 3 arguments, but takes just 2
i = BIO_ctrl_set_connected(sbio, 1, &peer);
^
CWSecurity.c:235:6: error: ‘BIO_ctrl_set_connected’ undeclared (first use in this function); did you mean ‘BIO_new_ssl_connect’?
i = BIO_ctrl_set_connected(sbio, 1, &peer);
^~~~~~~~~~~~~~~~~~~~~~
BIO_new_ssl_connect

Error Number 2

CWSecurity.c: In function ‘CWSecurityVerifyCB’:
CWSecurity.c:795:45: error: dereferencing pointer to incomplete type ‘X509_STORE_CTX {aka struct x509_store_ctx_st}’
X509_NAME_oneline(X509_get_issuer_name(ctx->current_cert), buf, 256);

my current openssl version is 1.1.0g-2ubuntu4.3 amd64 and I have successfully installed the said libraries except libnl-3-genl. Instead of libnl-3-genl I have the libnl-genl-3-dev.
libnl-3-dev version is 3.2.29-0ubuntu3 amd64
libnl-genl-3-dev version is 3.2.29-0ubuntu3 amd64
I would really appreciate it if anyone can help me out in this matter since I am working on my final year project using the openCAPWAP.

Hostapd in AC and WTP

It has been mentioned that the older hostapd wrappers are now obsolete. However it is not clear, how to set up the hostapd and if it should be installed in both WTP and AC. For example in the the split MAC scenario, could the WTP get authenticated in a central hostapd server running in the AC. What kind of configuration is needed for this?

To be more specific, I am trying to port the WTP in an openWRT system. Compilation and connection to the AC works fine, but keep on logging the following messages:

nl80211: Drv Event 59 (NL80211_CMD_FRAME) received for WTPWLan00
[80211] ______ Association Request Received
nl80211: Drv Event 59 (NL80211_CMD_FRAME) received for WTPWLan00
[80211] ______ Association Request Received

I would really appreciate your help on this! These is another openCAPWAP fork [https://github.com/iosifpeterfi/openCAPWAP-OpenWRT], specific for openWRT but it's quite old using the old wrappers? Do you think it would be a more suitable start-point?

WTP run issue

When I run ./WTP, I get the message:
Usage: WTP working_path
and after that I get:
chdir Faile

I found in the WTP.c the following code:
if (argc <= 1)
printf("Usage: WTP working_path\n");

if ((pid = fork()) < 0)
    exit(1);
else if (pid != 0)
    exit(0);
else {
    setsid();
    if (chdir(argv[1]) != 0){
        printf("chdir Faile\n");
        exit(1);
    }
    fclose(stdout);
}

However, I cannot understand the meaning!
Have you any explanation of this problem?
Thanks

master vs elena.ago branch

a couple of questions about project:

  1. What's the difference between the "master" and the "elena.ago" branch?
  2. Is it possible to use the "local mac"-mod in your project? and if yes, how?
  3. Is it possible to associate STA without Station Configureation Request (add station) from WTP to AC?

Problem of running WTP/AC: connection refused

Hello,
I am using the elena.ago branch
I built the WTP and the AC into two different Virtual machines.
Before building the WTP, I modified the setting.wtp.txt file as follows:

<RADIO_PHY_NAME_0>phy0

<RADIO_PHY_NAME_1>phy1
because when running "iw dev", I get:
phy#1
Interface wlan0
ifindex 3
type managed
The second change I made is setting the IP address of the AC in the config.wtp file.
Then I run "sudo make" and "./WTP ."
From the AC side, I run "sudo make", "./AC ." in the openCAPWAP folder. Next, I run "sudo make" in the wum folder.
I tried to run "./wum -c wtps" but I get "connect error:: Connection refused"
I get the same thing when trying to create a new interface on the WTP using the "wum -c addwlan..." command.

Could someone help me to figure out this problem?
Is there something missed in my configuration?

Another point: there is neither the wtp.log file nor the ac.log file!

Can't see wifi.

I run WTP in openwrt but can not see wifi. There is a wireless interface named WTPWLan00. When I type iw WTPWLan00 info ,it shows ssid and many other infomations.

Is this repository still being maintained?

If so, what are the requirements to make opencapwap work?

From WTP I have this type of information:
#________ Echo Request Message [0] (Run) ________#
Echo Response received
[KeepAlive packet]
WTP HeartBeat Timer Expired... we send an ECHO Request

and from AC:
#________ Echo Request (Run) ________#
Assembling Echo Response...
Echo Response Assembled
[KeepAlive packet]
[KeepAlive packet]
Inviato KeepAlive

but I can see no SSID by using scan command (iw dev scan).

I suppose I don't have to use hostapd, right? What if I want to work with hostapd? How can I do it? I unsuccessfully tried codes provided by travelping and ahmedshabib (see https://github.com/ramonfontes/opencapwap-mininet-wifi).

I'm developing a wireless network emulator for SDWN (github.com/intrig-unicamp/mininet-wifi) and I would like to use opencawap on the control plane.

Any help is welcome.

Association problem

Hello,
I have an association problem between a station and the WTP.
Every association attempt ends with (according to the wtp.log):

________ Station Configuration Request received ________

Parsing Station Configuration Request...
Searching for STA -> 34:fc:ef:c6:1a:83
Station Configuration Request Parsed
[CW80211] REQUEST Add Station
nl80211: nl80211_send_recv_cb_input->nl_recvmsgs failed: -16
Set STA info ok -> 34:fc:ef:c6:1a:83
Assembling Sattion Configuration Response...
Station Configuration Response Assembled
Message Sent

[CW80211] Association Timer Raised
WTP HeartBeat Timer Expired... we send an ECHO Request

________ Echo Request Message 0 ________

Echo Response received
[CW80211] Disassociation Request Received
nl80211: nl80211_send_recv_cb_input->nl_recvmsgs failed: -16
WTP HeartBeat Timer Expired... we send an ECHO Request

And from the AC side:

802.11 frame
CW80211: Management Frame Received. Subtype: 0
CW80211: Management Association request received
[CW80211] Assemble Association response AC side
192.168.108.133:12226
Inviato Frame 80211 a WTP
Assembling Station Configuration Request...
Station Configuration Request Assembled
192.168.108.133:12225
Message Sent

Error: Invalid Format. Seq Num or Msg Type not valid! .
(occurred at line 1373 in file ACRunState.c, catched at line 898 in file ACMainLoop.c).
--> Received something different from a valid Run Message
[KeepAlive packet]
[KeepAlive packet]
192.168.108.133:12226
Inviato KeepAlive
Expired, Sent Signal(10) to Thread: -1333830848
Soft Timer Expired for Thread: b07f5b40
Soft timer expired but we are not retransmitting
Timer Expired, Sent Signal(10) to Thread: -1333830848
Soft Timer Expired for Thread: b07f5b40
Soft timer expired but we are not retransmitting

Do someone know the cause of this problem?
Thanks for your help

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.