RDK Resources
[*RDK Preferred*]
Code Management Facility
RDK Forums
[RDK Conferences]
RDK Support
Archives
Papers & Presentations Archive
...
Info |
---|
This Page is under Development |
Briefly describe in general terms the system/application and the purpose for which it is intended, written in non-technical terminology. Consider including a high-level architecture diagram for the system. The description should include, but is not limited to, the following:
<Briefly describe and graphically depict as appropriate the equipment, communications, and network configuration of the system in a way that a non-technical user can understand>
<Briefly describe and graphically depict as appropriate the equipment, communications, and network configuration of the system in a way that a non-technical user can understand>
<Provide detailed information and describe the procedures necessary to access the system. If applicable, include how to get a user ID and log on to the system, as well as the actions a user must take to change and/or reset a password.>
<Describe how system flow is happening mentioning checkpoints which can be verified during flow to ensure system is working as expected>
<Mention the validation artifacts that are essential to ensure the functionality is working as expected. Also any limitation while closing the validation process>
Describe the specific system function or feature in detail and depict graphically by including screen prints and descriptive narrative as appropriate. Ensure each screen print is captioned and has an associated tag providing appropriate alternative text
Follow the above for sub feature / use cases
<Identify the error messages that a user may receive and the likely cause(s) and/or possible corrective actions for the error>
...
Raspberry Pi: The Raspberry Pi 3 Model B+ featuring a 64-bit quad core processor running at 1.4 Ghz. R-Pi3 B+ supports the dual band 2.4GHz and 5GHz IEEE 802.11.b/g/n/ac wireless LAN which provides an high edge for the broadband developer community to test the RDK-B stack with Router, WiFi functionalities.
Pre-Requisites
Requirement | Remarks |
Linux | 32 bit Ubuntu 18.04 OS |
Fee HDD Space | Minimum 100GB Free Memory |
Oracle Virtual Box | 4.3.18 or higher |
Wireless Adapter | Brand Name: Tenda ralink & Model Number:W311MI TPLink Archer T4U AC1200 |
USB to Ethernet Switch | To connect with Ethernet Switch & Multiple Clients |
This step is for one time setup for downloading & building RDK-B Emulator and Raspberry Pi in a standalone machine.
The instructions provided below are meant to be executed via the command line on an Ubuntu machine:
$ sudo apt-get install build-essential gettext bison libfile-slurp-perl gawk libncurses-dev autoconf flex doxygen libtool automake libpcre3-dev zlib1g-dev libbz2-dev subversion minicom putty libssl-dev rpm python-pexpect python-svn python-argparse vim tofrodos meld dos2unix cmake uuid-dev ruby transfig libglib2.0-dev xutils-dev lynx-cur gperf autopoint python-dulwich python-dev curl vim diffstat texinfo chrpath openjdk-8-jre
$ sudo dpkg-reconfigure dash
Select “No”
To choose bash, when the prompt asks if you want to use dash as the default system shell - select “No”
Upgrade your Git version to 1.8.x or higher
On Ubuntu 16.04 LTS, if you are unable to upgrade your git version using apt-get, then follow the below steps in order to upgrade
$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:git-core/ppa
$ sudo apt-get update
$ sudo apt-get install git
Once git is installed, configure your name and email using the below commands
$ git config --global user.email " you@example.com "
$ git config --global user.name "Your Name"
In order to use Yocto build system, first you need to make sure that repo is properly installed on the machine:
$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
Trivia : Repo is a repository management tool that is built on top of Git. Its main purpose is to help manage projects that consist of many Git repositories, it can also be used to manage uploads to the CMF Gerrit instance and automate aspects of the development workflow.
Repo does not replace Git, it simply aids management of projects that contain multiple Git repositories into a single local working directory. Git will still be used for local operation such as commits etc.
Repo manages this for you by means of an XML based Manifest file. The Manifest file defines which repositories the project uses and links to appropriate revisions of each git repository, i.e where the upstream repositories reside and where they should be cloned locally. It is the manifest.xml (or default.xml) that determines which Git repositories and revisions repo will manage. This manifest.xml file is hosted in a Git repository along with all the other git repositories.
CMF git uses https. This step prevents the password prompt every now and then during code checkout and build.
Create a file .netrc in home directory.
$ vi .netrc
The contents of the .netrc should be as follows:
machine code.rdkcentral.com
login <YOUR_USERNAME>
password <YOUR_PASSWORD>
Following commands fetch the source code of emulator and raspberry pi using repo tool
$ mkdir emulator or RaspberryPi && cd emulator or RaspberryPi
Please use the following repo init command
$ repo init -u https://code.rdkcentral.com/r/manifests -m rdkb.xml -b <branch_name> ( common for both Emulator and Raspberry Pi )
(Example 1: repo init -u https://code.rdkcentral.com/r/manifests -m rdkb.xml -b rdkb-20180527
Example 2: repo init -u https://code.rdkcentral.com/r/manifests -m rdkb.xml -b master
Example 3: repo init -u https://code.rdkcentral.com/r/manifests -m rdkb.xml -b morty)
$ repo sync -j4 --no-clone-bundle ( common for both Emulator and Raspberry Pi )
Note |
---|
|
For Emulator:
$ source meta-cmf-bsp-emulator/setup-environment
The above step configures and sets up your directory to start an appropriate build for broadband.
There are different kinds of builds listed. Please read the options and select the number of the build you need.
1) meta-rdk-bsp-emulator/conf/machine/qemuarmbroadband.conf
2) meta-rdk-bsp-emulator/conf/machine/qemux86broadband.conf
3) meta-rdk-bsp-emulator/conf/machine/qemux86hyb.conf
4) meta-rdk-bsp-emulator/conf/machine/qemux86mc.conf
5) openembedded-core/meta/conf/machine/qemuarm.conf
6) openembedded-core/meta/conf/machine/qemux86-64.conf
7) openembedded-core/meta/conf/machine/qemux86.conf
For Raspberry Pi:
$ source meta-cmf-raspberrypi/setup-environment (Select option raspberrypi-rdk-broadband.conf).
Next, you would need to initiate the build using the following command:
$ bitbake rdk-generic-broadband-image ( common for both Emulator and Raspberry Pi).
Image path for Emulator:
On Successful build, the ROOTFS (in vmdk format) would be available at the following reference location based on the build type:
- ${HOME}/emulator/build-qemux86broadband/tmp/deploy/images/qemux86broadband/rdk-generic-broadband-image-qemux86broadband-<timestamp>.vmdk
Example:
…/build-qemux86broadband/tmp/deploy/images/qemux86broadband/rdk-generic-broadband-image-qemux86broadband-20160217080610.vmdk
Image path for Raspberry Pi:
On Successful build, the ROOTFS (in sdimg format) would be available at the following reference location based on the build type:
- ${HOME}/RaspberryPi/build-raspberrypi-rdk-broadband/tmp/deploy/images/raspberrypi-rdk-broadband/rdkb-generic-broadband-image-raspberrypi-rdk-broadband.rpi-sdimg
Example:
.../build-raspberrypi-rdk-broadband/tmp/deploy/images/raspberrypi-rdk-broadband/rdkb-generic-broadband-image_default_20200206062343.rootfs.rpi-sdimg
| /usr/include/x86_64-linux-gnu/bits/mman-shared.h:46:5: note: previous declaration of ‘memfd_create’ was here
| int memfd_create (const char *__name, unsigned int __flags) __THROW;
| ^~~~~~~~~~~~
| /home/amrita/Desktop/Emu_Feb3/build-qemux86broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/qemu-2.7.0/rules.mak:59: recipe for target 'util/memfd.o' failed
| make: *** [util/memfd.o] Error 1
| make: *** Waiting for unfinished jobs....
| /home/amrita/Desktop/Emu_Feb3/build-qemux86broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/qemu-2.7.0/util/path.c: In function ‘follow_path’:
| /home/amrita/Desktop/Emu_Feb3/build-qemux86broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/qemu-2.7.0/util/path.c:126:5: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
| if (!cursor->populated_entries)
| ^~
| /home/amrita/Desktop/Emu_Feb3/build-qemux86broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/qemu-2.7.0/util/path.c:128:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’
| cursor = *source;
| ^~~~~~
| WARNING: exit code 1 from a shell command.
| ERROR: Function failed: do_compile (log file is located at /home/amrita/Desktop/Emu_Feb3/build-qemux86broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/temp/log.do_compile.9718)
ERROR: Task (virtual:native:/home/amrita/Desktop/Emu_Feb3/openembedded-core/meta/recipes-devtools/qemu/qemu_2.7.0.bb:do_compile) failed with exit code '1'
Solution:
Remove static keyword in function int memfdcreate in file /x8664-linux/qemu-native/2.7.0-r1/qemu-2.7.0/util/memfd.c
Pictorial representation of changes in memfd.c file:
draw.io Diagram diagramName ERR1_Emu.drawio size 1200 revision 1
Patch file for changes in memfd.c attached below:
Path for changes in memfd.c file:
draw.io Diagram | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| /usr/include/gconv.h:26:36: fatal error: bits/types/__mbstate_t.h: No such file or directory
| #include <bits/types/__mbstate_t.h>
| ^
| compilation terminated.
| src/CMakeFiles/ucresolv.dir/build.make:89: recipe for target 'src/CMakeFiles/ucresolv.dir/res_query.c.o' failed
| make[2]: *** [src/CMakeFiles/ucresolv.dir/res_query.c.o] Error 1
| make[2]: Leaving directory '/home/amrita/Desktop/Emu_Feb3/build-qemux86broadband/tmp/work/i586-rdk-linux/ucresolv/git+AUTOINC+996c3778b1-r1/build'
| CMakeFiles/Makefile2:127: recipe for target 'src/CMakeFiles/ucresolv.dir/all' failed
| make[1]: *** [src/CMakeFiles/ucresolv.dir/all] Error 2
| make[1]: Leaving directory '/home/amrita/Desktop/Emu_Feb3/build-qemux86broadband/tmp/work/i586-rdk-linux/ucresolv/git+AUTOINC+996c3778b1-r1/build'
| Makefile:132: recipe for target 'all' failed
| make: *** [all] Error 2
| WARNING: exit code 2 from a shell command.
| ERROR: Function failed: do_compile (log file is located at /home/amrita/Desktop/Emu_Feb3/build-qemux86broadband/tmp/work/i586-rdk-linux/ucresolv/git+AUTOINC+996c3778b1-r1/temp/log.do_compile.29460)
ERROR: Task (/home/amrita/Desktop/Emu_Feb3/meta-rdk-ext/recipes-support/ucresolv/ucresolv_1.0.bb:do_compile) failed with exit code '1'
Solution:
Copy __mbstate_t.h file from build-qemux86broadband/tmp/work/i586-rdk-linux/ucresolv/git+AUTOINC+996c3778b1-r1/git/include/wcsmbs/bits/types and put it in build-qemux86broadband/tmp/sysroots/qemux86broadband/usr/include/bits/types
Pictorial representation of changes in ucresolv_1.0.bb file:
draw.io Diagram diagramName ERR2_Emu.drawio size 1200 revision 1
Patch file for changes in ucresolv_1.0.bb attached below:
Path for changes in ucresolv_1.0.bb file:
draw.io Diagram border true diagramName __mbstate_t.h simpleViewer false links auto tbstyle top lbox true diagramWidth 426 revision 1
In file included from ../../git/debugfs/../misc/create_inode.c:19:0:
| /usr/include/unistd.h:1110:9: note: previous declaration of ‘copy_file_range’ was here
| ssize_t copy_file_range (int __infd, __off64_t *__pinoff,
| ^~~~~~~~~~~~~~~
| Makefile:412: recipe for target 'create_inode.o' failed
| make[2]: *** [create_inode.o] Error 1
| make[2]: *** Waiting for unfinished jobs....
| gcc -c -I. -I../lib -I../../git/lib -isystem/home/amrita/Desktop/Emu_Feb3/build-qemux86broadband/tmp/sysroots/x86_64-linux/usr/include -isystem/home/amrita/Desktop/Emu_Feb3/build-qemux86broadband/tmp/sysroots/x86_64-linux/usr/include -O2 -pipe -DHAVE_CONFIG_H -I../../git/debugfs/../e2fsck -DDEBUGFS ../../git/debugfs/xattrs.c -o xattrs.o
| make[2]: Leaving directory '/home/amrita/Desktop/Emu_Feb3/build-qemux86broadband/tmp/work/x86_64-linux/e2fsprogs-native/1.43-r1/build/debugfs'
| Makefile:399: recipe for target 'all-progs-recursive' failed
| make[1]: *** [all-progs-recursive] Error 1
| make[1]: Leaving directory '/home/amrita/Desktop/Emu_Feb3/build-qemux86broadband/tmp/work/x86_64-linux/e2fsprogs-native/1.43-r1/build'
| Makefile:334: recipe for target 'all' failed
| make: *** [all] Error 2
| ERROR: Function failed: do_compile (log file is located at /home/amrita/Desktop/Emu_Feb3/build-qemux86broadband/tmp/work/x86_64-linux/e2fsprogs-native/1.43-r1/temp/log.do_compile.21571)
ERROR: Task (virtual:native:/home/amrita/Desktop/Emu_Feb3/openembedded-core/meta/recipes-devtools/e2fsprogs/e2fsprogs_1.43.bb:do_compile) failed with exit code '1'
Solution:
Change copy_file_range to copy_file_chunk in x86_64-linux/e2fsprogs-native/1.43-r1/git/misc/create_inode.c
Pictorial representation of changes in create_inode.c file:
draw.io Diagram diagramName ERR3_Emu.drawio size 1200 revision 1
Patch file for changes in create_inode.c attached below:
Path for changes in create_inode.c file:
draw.io Diagram border true diagramName Create_inode.c simpleViewer false links auto tbstyle top lbox true diagramWidth 121 revision 1
/home/amrita/Desktop/Rpi_Jan31/build-raspberrypi-rdk-broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/qemu-2.7.0/util/memfd.c:40:12: error: static declaration of ‘memfd_create’ follows non-static declaration
| static int memfd_create(const char *name, unsigned int flags)
| ^~~~~~~~~~~~
| In file included from /usr/include/x86_64-linux-gnu/bits/mman-linux.h:115:0,
| from /usr/include/x86_64-linux-gnu/bits/mman.h:45,
| from /usr/include/x86_64-linux-gnu/sys/mman.h:41,
| from /home/amrita/Desktop/Rpi_Jan31/build-raspberrypi-rdk-broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/qemu-2.7.0/include/sysemu/os-posix.h:29,
| from /home/amrita/Desktop/Rpi_Jan31/build-raspberrypi-rdk-broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/qemu-2.7.0/include/qemu/osdep.h:104,
| from /home/amrita/Desktop/Rpi_Jan31/build-raspberrypi-rdk-broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/qemu-2.7.0/util/memfd.c:28:
| /usr/include/x86_64-linux-gnu/bits/mman-shared.h:46:5: note: previous declaration of ‘memfd_create’ was here
| int memfd_create (const char *__name, unsigned int __flags) __THROW;
| ^~~~~~~~~~~~
| /home/amrita/Desktop/Rpi_Jan31/build-raspberrypi-rdk-broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/qemu-2.7.0/rules.mak:59: recipe for target 'util/memfd.o' failed
| make: *** [util/memfd.o] Error 1
| make: *** Waiting for unfinished jobs....
| ERROR: Function failed: do_compile (log file is located at /home/amrita/Desktop/Rpi_Jan31/build-raspberrypi-rdk-broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/temp/log.do_compile.19600)
ERROR: Task (virtual:native:/home/amrita/Desktop/Rpi_Jan31/openembedded-core/meta/recipes-devtools/qemu/qemu_2.7.0.bb:do_compile) failed with exit code '1'
Solution:
Removed static keyword in function int memfd_create in file /x86_64-linux/qemu-native/2.7.0-r1/qemu-2.7.0/util/memfd.c
Pictorial representation of changes in memfd.c file:
draw.io Diagram diagramName ERR1_Emu.drawio size 1200 revision 1
Patch file for changes in memfd.c attached below:
Path for changes in memfd.c file:
draw.io Diagram border true diagramName __mbstate_t.h Rpi simpleViewer false links auto tbstyle top lbox true diagramWidth 121 revision 1
/usr/include/gconv.h:26:36: fatal error: bits/types/__mbstate_t.h: No such file or directory
| #include <bits/types/__mbstate_t.h>
| ^
| compilation terminated.
| src/CMakeFiles/ucresolv.shared.dir/build.make:137: recipe for target 'src/CMakeFiles/ucresolv.shared.dir/res_send.c.o' failed
| make[2]: *** [src/CMakeFiles/ucresolv.shared.dir/res_send.c.o] Error 1
| make[2]: Leaving directory '/home/amrita/Desktop/Rpi_Jan31/build-raspberrypi-rdk-broadband/tmp/work/cortexa7t2hf-neon-vfpv4-rdk-linux-gnueabi/ucresolv/git+AUTOINC+996c3778b1-r1/build'
| CMakeFiles/Makefile2:90: recipe for target 'src/CMakeFiles/ucresolv.shared.dir/all' failed
| make[1]: *** [src/CMakeFiles/ucresolv.shared.dir/all] Error 2
| make[1]: Leaving directory '/home/amrita/Desktop/Rpi_Jan31/build-raspberrypi-rdk-broadband/tmp/work/cortexa7t2hf-neon-vfpv4-rdk-linux-gnueabi/ucresolv/git+AUTOINC+996c3778b1-r1/build'
| Makefile:132: recipe for target 'all' failed
| make: *** [all] Error 2
| WARNING: exit code 2 from a shell command.
| ERROR: Function failed: do_compile (log file is located at /home/amrita/Desktop/Rpi_Jan31/build-raspberrypi-rdk-broadband/tmp/work/cortexa7t2hf-neon-vfpv4-rdk-linux-gnueabi/ucresolv/git+AUTOINC+996c3778b1-r1/temp/log.do_compile.6585)
ERROR: Task (/home/amrita/Desktop/Rpi_Jan31/meta-rdk-ext/recipes-support/ucresolv/ucresolv_1.0.bb:do_compile) failed with exit code '1'
Solution:
Copy __mbstate_t.h file from cortexa7t2hf-neon-vfpv4-rdk-linux-gnueabi/ucresolv/git+AUTOINC+b58d49e165-r1/git/include/wcsmbs/bits/types and put it in build-raspberrypi-rdk-broadband/tmp/sysroots/raspberrypi-rdk-broadband/usr/include/bits/types/
Patch file for changes in ucresolv_1.0.bb attached below:
draw.io Diagram diagramName ERR2_Emu.drawio size 1200 revision 1
Path for changes in ucresolv_1.0.bb file:
draw.io Diagram border true diagramName Ucresolve simpleViewer false links auto tbstyle top lbox true diagramWidth 401 revision 1
In file included from ../../git/debugfs/../misc/create_inode.c:19:0:
| /usr/include/unistd.h:1110:9: note: previous declaration of ‘copy_file_range’ was here
| ssize_t copy_file_range (int __infd, __off64_t *__pinoff,
| ^~~~~~~~~~~~~~~
| Makefile:412: recipe for target 'create_inode.o' failed
| make[2]: *** [create_inode.o] Error 1
| make[2]: *** Waiting for unfinished jobs....
| make[2]: Leaving directory '/home/amrita/Desktop/Rpi_Jan31/build-raspberrypi-rdk-broadband/tmp/work/x86_64-linux/e2fsprogs-native/1.43-r1/build/debugfs'
| Makefile:399: recipe for target 'all-progs-recursive' failed
| make[1]: *** [all-progs-recursive] Error 1
| make[1]: Leaving directory '/home/amrita/Desktop/Rpi_Jan31/build-raspberrypi-rdk-broadband/tmp/work/x86_64-linux/e2fsprogs-native/1.43-r1/build'
| Makefile:334: recipe for target 'all' failed
| make: *** [all] Error 2
| WARNING: exit code 1 from a shell command.
| ERROR: Function failed: do_compile (log file is located at /home/amrita/Desktop/Rpi_Jan31/build-raspberrypi-rdk-broadband/tmp/work/x86_64-linux/e2fsprogs-native/1.43-r1/temp/log.do_compile.11514)
ERROR: Task (virtual:native:/home/amrita/Desktop/Rpi_Jan31/openembedded-core/meta/recipes-devtools/e2fsprogs/e2fsprogs_1.43.bb:do_compile) failed with exit code '1'
Solution:
Change copy_file_range to copy_file_chunk in x86_64-linux/e2fsprogs-native/1.43-r1/git/misc/create_inode.c
Pictorial representation of changes in create_inode.c file:
draw.io Diagram diagramName ERR3_Emu.drawio size 1200 revision 1
Patch file for changes in create_inode.c attached below:
Path for changes in create_inode.c file:
draw.io Diagram border true diagramName Create_inode.c simpleViewer false links auto tbstyle top lbox true diagramWidth 121 revision 1
Error
/home/amrita/Desktop/Emu_Feb3/build-raspberrypi3-64-rdk-broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/qemu-2.7.0/rules.mak:59: recipe for target 'util/memfd.o' failed
| make: *** [util/memfd.o] Error 1
| make: *** Waiting for unfinished jobs....
| /home/amrita/Desktop/Emu_Feb3/build-raspberrypi3-64-rdk-broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/qemu-2.7.0/util/path.c: In function ‘follow_path’:
| /home/amrita/Desktop/Emu_Feb3/build-raspberrypi3-64-rdk-broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/qemu-2.7.0/util/path.c:126:5: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
| if (!cursor->populated_entries)
| ^~
| /home/amrita/Desktop/Emu_Feb3/build-raspberrypi3-64-rdk-broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/qemu-2.7.0/util/path.c:128:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’
| cursor = *source;
| ^~~~~~
| WARNING: /home/amrita/Desktop/Emu_Feb3/build-raspberrypi3-64-rdk-broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/temp/run.do_compile.8435:1 exit 1 from 'exit 1'
| ERROR: Function failed: do_compile (log file is located at /home/amrita/Desktop/Emu_Feb3/build-raspberrypi3-64-rdk-broadband/tmp/work/x86_64-linux/qemu-native/2.7.0-r1/temp/log.do_compile.8435)
ERROR: Task (virtual:native:/home/amrita/Desktop/Emu_Feb3/openembedded-core/meta/recipes-devtools/qemu/qemu_2.7.0.bb:do_compile) failed with exit code '1'
Solution:
Removed 1. #ifdef CONFIG_MEMFD 2. #include <sys/memfd.h> 3. #elif defined CONFIG_LINUX and added 1.#include <sys/mman.h> 2.#if defined CONFIG_LINUX && !defined CONFIG_MEMFD in /x86_64-linux/qemu-native/2.7.0-r1/qemu-2.7.0/util/memfd.c
Pictorial representation of changes in memfd.c file:
draw.io Diagram diagramName ERR4.drawio size 1200 revision 1
Patch file for changes in memfd.c attached below:
Path for changes in memfd.c file:
draw.io Diagram border true diagramName Mem simpleViewer false links auto tbstyle top lbox true diagramWidth 241 revision 1
Contact | Organization | Phone | Role | ||||||
Rajkumar Narayanan | L&T Technology Services | Nill | rajkumar.narayanan@ltts.com | Program Manager | <Contact Name> | <Organization> | <Phone> | <Email> | <Role> |