# 1.  Introduction:

This document will help to configure the stack module and protocol routing module,
and run sample app with DMM.

# 2.  Configuration files:

There are two configuration files need to modify for setting up the
topology.

release/configure

**module_config.json** is the stack module config file.

**rd_config.json** is the rd config file.

Copy the two json files to release/bin and configure in next step.

<!-- -->

Note:

    If users have run scripts/build.sh, configuration files were generated in /dmm/config/app_test.

# 3.  JSON files configuration.

We need to setup configuration as given below.

# 3.1  module_config.json for example:

```
{
    "default_stack_name": "kernel",                /*when rd can't be find maybe choose the defualt one*/
    "module_list": [
    {
        "stack_name": "kernel",                    /*stack name*/
        "function_name": "kernel_stack_register",  /*function name*/
        "libname": "./",                           /*library name, if loadtype is static, this maybe
                                                     null, else must give a library name*/
        "loadtype": "static",                      /*library load type: static or dynamic*/
        "deploytype": "1",                         /*deploy model type:model type1, model type2,
                                                     model type3. Indicating single or multi process
                                                     deployment. Used during shared memory initialization.*/
        "maxfd": "1024",                           /*the max fd supported*/
        "minfd": "0",                              /*the min fd supported*/
        "priorty": "1",                            /*priorty when executing, reserv*/
        "stackid": "0",                            /*stack id, this must be ordered and not be repeated*/
        },
/***********************************
    {
        "stack_name": "stackx",                    /*this is not a real stack, just an example for multiple
                                                     stack configurations*/
        "function_name": "stackx_register",
        "libname": "libstackx.so",
        "loadtype": "dynmic",
        "deploytype": "3",
        "maxfd": "1024",
        "minfd": "0",
        "priorty": "1",
        "stackid": "1",
        },
    ]
}
***********************************/
```

# 3.2  rd_config.json for example:

```
{
"ip_route": [
    {
        "subnet": "192.165.1.1/16",
        "type": "nstack-kernel",
                /* output interface type,
                   nstack-kernel: indicate this ip should go through kernel protocol
                   nstack-dpdk: go through stackx protocol*/
    },
    {
        "subnet": "172.16.25.125/16",
        "type": "nstack-kernel",
    }
    ],
"prot_route": [
        {
            "proto_type": "11",
            "type": "nstack-kernel",
        },
    ]
}
```
# 4.  Run sample APP:

-  **perf-test:**

    Add test code with kernel stack or userspace protocol stack


Usage:

After building the DMM, inside the DMM/release/bin directory below perf-test app will be generated.

*kc_common, ks_epoll, ks_select, vc_common, vs_epoll, vs_select*

The use of ks_epoll,ks_select,vs_epoll and vs_select are the same.

Before executing the app, we should disable ASLR (Address space layout randomization).
  echo 0 > /proc/sys/kernel/randomize_va_space

Examples:

**With Kernel stack(With direct kernel stack):**

server:
```
    #./ks_epoll -p 20000 -d 172.16.25.125 -a 10000 -s 172.16.25.126 -l 200 -t 5000000 -i 0 -f 1 -r 20000 -n 1 -w 10 -u 10000 -e 10 -x 1
```
client:
```
    #./kc_common -p 20000 -d 172.16.25.126 -a 10000 -s 172.16.25.125 -l 200 -t 5000000 -i 0 -f 1 -r 20000 -n 1 -w 10 -u 10000 -e 10 -x 1
```

**With DMM nStack(Stack is choosed by congfigure file):**
Note:

   Currently DMM nstack only support kernel mode. please check the config file.

server:
```
    #./vs_epoll -p 20000 -d 172.16.25.125 -a 10000 -s 172.16.25.126 -l 200 -t 5000000 -i 0 -f 1 -r 20000 -n 1 -w 10 -u 10000 -e 10 -x 1
```
client:
```
    #./vc_common -p 20000 -d 172.16.25.126 -a 10000 -s 172.16.25.125 -l 200 -t 5000000 -i 0 -f 1 -r 20000 -n 1 -w 10 -u 10000 -e 10 -x 1
```

- **NGNIX with DMM nStack**:

Nginx build process:

*step 1: Compile nginx code*

```
    #wget "http://hg.nginx.org/nginx"
    #cd nginx-1.1.15
    #./configure --with-ld-opt="-L /root/Work/xxx/release/lib64/ -lnStackAPI"
    #make
    #make install
```
Note:

    a. ./configure **--with-ld-opt="-L /root/xxx/DMM/release/lib64/ -lnStackAPI"** can be done if you want to use nStack otherwise just give the ./configure.
    b. Make sure before building edit the configurtaion if you want specific server IP.
    For Ex:
        Server: ifconfig eth3 172.16.25.125 netmask 255.255.255.224 up
        Client: ifconfig eth3 172.16.25.126 netmask 255.255.255.224 up

    nginx.conf file modifiecations:
        listen      172.16.25.125:80

*step 2: run the nginx code*

```
    #cd /usr/local/nginx/sbin
    #cp -r * ../../sbin
    #cd ../../sbin
    #./nginx
```
Note:

    if you want to run ./nginx with nStack then perform following before run
    a. export LD_LIBRARY_PATH=/root/xxx/DMM/release/lib64/
    b. export NSTACK_LOG_ON=DBG ##to display nStack consol logs.

*step 3: Check whether ngnix service is running.*

```
    #ps -ax | grep nginx
```
*step 4: Test the nginx server is up or not!*

At client board, perform below command and check the output:
```
    #curl http://172.16.25.125:80/
```
Note:

    curl is the tool need to be installed to browse the html page in linux without GUI.