Some key notes for RFC3264

Facing a new task of standardizing SIP protocols for the Kedacom conference Endpoints.

So I digged into some RFC document recently. Here are some key notes for RFC3264: An OfferAnswer Model with the Session Description Protocol (SDP)

1. Capatibility comparison – Direction


If “a=sendrecv” attribute does not exist, or been omitted, that means the direction is sendrecv, since sendrecv is the default.

2. [Offering] RTP Port in m


RTP port in m line for recvonly and sendrecv streams, while RTCP port for sendonly streams.

For recvonly and sendrecv streams, the port number and address in the
offer indicate where the offerer would like to receive the media
stream.  For sendonly RTP streams, the address and port number
indirectly indicate where the offerer wants to receive RTCP reports.
Unless there is an explicit indication otherwise, reports are sent to
the port number one higher than the number indicated.  The IP address
and port present in the offer indicate nothing about the source IP
address and source port of RTP and RTCP packets that will be sent by
the offerer.

3. [Offering] Switching media format if multiple formats supported**


If multiple formats are listed, it
means that the offerer is capable of making use of any of those
formats during the session.  In other words, the answerer MAY change
formats in the middle of the session, making use of any of the
formats listed, without sending a new offer.

[Offering] Capatibility comparison – Preference


In all cases, the formats in the “m=” line MUST be listed in order of
preference, with the first format listed being preferred.  In this
case, preferred means that the recipient of the offer SHOULD use the
format with the highest preference that is acceptable to it.

[Offering] Capatibility comparison – Preference 2


For sendrecv RTP
streams, the payload type numbers indicate the value of the payload
type field the offerer expects to receive, and would prefer to send.
However, for sendonly and sendrecv streams, the answer might indicate
different payload type numbers for the same codecs, in which case,
the offerer MUST send with the payload type numbers from the answer.

* This is what SIP different with H.323, the payload type value in H.245 OLC mean’s the request will send the payload with this payload type value, while in SDP it means you should send your payload with the value I specified in my SDP.

[Offering] Bandwidth description


If the bandwidth attribute is present for a stream, it indicates the
desired bandwidth that the offerer would like to receive.  A value of
zero is allowed, but discouraged.  It indicates that no media should
be sent.  In the case of RTP, it would also disable all RTCP.

[Offering] A typical usage example for multiple media streams


A typical usage example for multiple media streams of the same type
is a pre-paid calling card application, where the user can press and
hold the pound (“#”) key at any time during a call to hangup and make
a new call on the same card.  This requires media from the user to
two destinations – the remote gateway, and the DTMF processing
application which looks for the pound.  This could be accomplished
with two media streams, one sendrecv to the gateway, and the other
sendonly (from the perspective of the user) to the DTMF application.

[Answering] Answering SDP must have at least one media format while rejecting


To reject an offered
stream, the port number in the corresponding stream in the answer
MUST be set to zero.  Any media formats listed are ignored.  At least
one MUST be present, as specified by SDP.

[Answering] Stream marked as recvonly can suggest a new format for the offerer


For streams marked as recvonly in the answer, the “m=” line MUST
contain at least one media format the answerer is willing to receive
with from amongst those listed in the offer.  The stream MAY indicate
additional media formats, not listed in the corresponding stream in
the offer, that the answerer is willing to receive.

Similarly, just like recvonly streams, sendrecv streams can suggest new formats for the offerer (of course, it will not be able to send them at this time, since it was not listed in the offer).

[Answering]Capability comparison – RECOMMENDED Order for answerer


If a stream in the offer lists
audio codecs 8, 22 and 48, in that order, and the answerer only
supports codecs 8 and 48, it is RECOMMENDED that, if the answerer has
no reason to change it, the ordering of codecs in the answer be 8,
48, and not 48, 8.

[Answering]Prefer RTP payload type with the value in the offer rather than in the answer


In the case of RTP, it MUST use the payload type numbers
from the offer, even if they differ from those in the answer.

[multicast] ??? How to handle participants in a some conference but with different format support ???


The set of media formats in the answer MUST be equal to or be a
subset of those in the offer.  Removing a format is a way for the
answerer to indicate that the format is not supported.

[Processing Answer]


It(Call offerer) MUST send using a media format listed in the answer,
and it SHOULD use the first media format listed in the answer when it
does send.

The reason this is a SHOULD, and not a MUST (its also a SHOULD,
and not a MUST, for the answerer), is because there will
oftentimes be a need to change codecs on the fly.  For example,
during silence periods, an agent might like to switch to a comfort
noise codec.  Or, if the user presses a number on the keypad, the
agent might like to send that using RFC 2833 [9].  Congestion
control might necessitate changing to a lower rate codec based on

[Modifying the Session] Session version of REINVITE


When issuing an offer that modifies the session,
the “o=” line of the new SDP MUST be identical to that in the
previous SDP, except that the version in the origin field MUST
increment by one from the previous SDP.  If the version in the origin
line does not increment, the SDP MUST be identical to the SDP with
that version number.

[Modifying the Session] Rules for m(Media stream) line of REINVITE


If an SDP is offered, which is different from the previous SDP, the
new SDP MUST have a matching media stream for each media stream in
the previous SDP.

[Modifying the Session] Adding a Media Stream in REINVITE


New media streams are created by new additional media descriptions
below the existing ones, or by reusing the “slot” used by an old
media stream which had been disabled by setting its port to zero.

[Modifying the Session] Changing the Set of Media Formats in REINVITE


For example, if A generates an offer
with G.711 assigned to dynamic payload type number 46, payload type
number 46 MUST refer to G.711 from that point forward in any offers
or answers for that media stream within the session.  However, it is
acceptable for multiple payload type numbers to be mapped to the same
codec, so that an updated offer could also use payload type number 72
for G.711.

     The mappings need to remain fixed for the duration of the session
      because of the loose synchronization between signaling exchanges
      of SDP and the media stream.

[Modifying the Session] Sending Media Stream after REINVITE is done


Similarly, as described in Section 6, as soon as it sends
its answer, the answerer MUST begin sending media using any formats
in the offer that were also present in the answer
Similarly, when the offerer receives the
answer, it MUST begin sending media using any formats in the answer

[Modifying the Session] Rules of ceasing use of an old media format for Agents


When an agent ceases using a media format (by not listing that format
in an offer or answer, even though it was in a previous SDP) the
agent will still need to be prepared to receive media with that
format for a brief time.

[Modifying the Session] Hold on a call


Hold on a call means request the other participant(s) stop sending streams to it.

   If the stream to be placed on hold was previously a sendrecv media
stream, it is placed on hold by marking it as sendonly.  If the
stream to be placed on hold was previously a recvonly media stream,
it is placed on hold by marking it inactive.

Certain third party call control scenarios do not work when an
      answerer responds to held SDP with held SDP.

[Modifying the Session] Hold on a call 2

Does it mean the sending of the Hold on requester will continue? The answer is no.

   Typically, when a user “presses” hold, the agent will generate an
offer with all streams in the SDP indicating a direction of sendonly,
and it will also locally mute, so that no media is sent to the far
end, and no media is played out.

Google shares SoC details for its modular smartphone coming 2015

Project_Ara_scattered_partsInterest in Google’s Project Ara is definitely very high among the tech loving community around the world. In the coming months, we expect to hear a lot more about the project as Google plans to launch the first device under the project by late 2015. The Mountain View based company recently shared some new information about the Project Ara that includes details on the SoCs and also the form factor of the device.

For the SoC, Google is working with NVIDIA and Marvell for two separate reference designs and form factor module prototypes. NVIDIA’s Tegra K1, the chipset used on the Google Nexus 9, and the Marvell PXA1928 are two chipsets that could be seen on the upcoming MDK v0.20 release. While most of you will be well aware of the NVIDIA Tegra K1 chipset, the Marvell PXA1928 chipset may be unfamiliar to most of you. The PXA1928 chipset is a 64-bit mobile SoC with a quad-core Cortex A53 based CPU, high perfroamnce GC5000 GPU and a 5-mode modem with support for LTE TDD/FDD, HSPA+, TD HSPA+ and EDGE connectivity.

Google also mentioned in the post that the Spiral 3 prototype was on schedule and should become available by spring. Before that, the company plans to show off its Spiral 2 prototypes at the Developers Conference in January. Also in January, Toshiba will be unveiling their second generation of UniPro switch and bridge ASICs with contactless M-PHY data transfer capability. These will be basis of Google’s Spiral 3 prototype and the final MDK release that is scheduled for next year.

Although we still have very little information on the first prototypes, Google did mention in the post that the Spiral 2 form factor prototypes look beautiful and come with custom module shells. The Project Ara Developers Conference is scheduled to be held in Mountain View, California on January 14th 2015 and in Singapore on January 21st 2015.

Source: Google ATAP

Big Announcement from Apple: All the Apps need to be 64 bit

Yesterday, Dec 17, 2014, a notice was launched on Apple Developer site, asking developers to submit 64 bit Apps to App Store for IOS, and all the Apps without 64 bit support will not be approved after June 1, 2015.

This could be a big requirement for me, and for my team, because we are definitely not ready for it now.

Seems we must change our developping schedules now.


Lastest info about UniGate IOT Controller

Yesterday, I got to know that the UniGate is promoted to be one of the major products for UniSVR when I talked with a former colleague from UniSVR.

It’s really a good thing to know. As what I always say, I have a good faith in the UniGate and IOT field.

Keep fighting! Looking forward to it.

Continue reading “Lastest info about UniGate IOT Controller”

Debugging & troubleshooting tutorial: backtrace + addr2line

Planning to write a series of posts about debugging & trouble shooting tricks. And I’d like to make backtrace as a start. As a typical programmer(AKA nerd), I’d like to jump to the topic directly before run into blah-blah.

Everyone knows, bug is free, so it may be at everywhere, to check out your free gift(s) sending to your clients, you may consider backtrace.
Continue reading “Debugging & troubleshooting tutorial: backtrace + addr2line”

Step by step to compile wireshark 1.10.10

1. Wireshark 1.10.10 source code download
The source code can be downloaded from page, and can be downloaded by SVN tools, such as TortoiseSVN, from repository
You can download the latest version instead, but the latest version requires Qt, means you need download an extra tool: Qt 5.3.2.

Qt 5.3.2:

As you know, Wireshark is a great tool for protocol analysis, you should research into its source code if you are intresting in networking programming.

2. Preparations and prerequirements
I’m here only introducing some brief/key steps to build a specified version of Wireshark. More and details about compiling Wireshark on Windows you can refer to

1) Install Microsoft Visual C++ 2010
2) Install Microsoft Windows SDK 7.1
Download url:, over there you can choose download an ISO image GRMSDKX_EN_DVD.iso instead of a web install program.
3) Install Microsoft Visual Studio 2010 Service Pack 1
Dowload URL:
4) Install Microsoft Visual C++ 2010 Service Pack 1 Compiler Update for the Windows SDK 7.1 (VC-Compiler-KB2519277.exe)
Download URL:

5) Install Cygwin
Download Address:
Run the setup.exe, and you can choose to download the installer package or install on-line directly. During the installation, a dialog will show you all the available tools for installation. There are some tools required for building Wireshark source code successfully.
Tools Needed to Select

6) Install Python
As what suggested in Wireshark WIKI site, we should choose Python 2.7.x, which can be downloaded here:

7) Install Subversion Client(Optional)
Subversion Client is used for version control, you can download it from
There are lots of releases for Windows, anyone of them would be fine. Except the list there, you can choose TortoiseSVN instead, it’s also have svn command line program packed in its installation.

8) Install TortoiseSVN (Optional)

3. Start to compile

1) Prepare source code
Use your installed SVN client tool, or git, to checkout the source code. I’m using path D:\svn\netmedia\20-protocol\wireshark\wireshark_src\wireshark-1.10.10 to save my source code.

2) Modify and configure your config.nmake file
Extract the source code package to a directory, where there is a config.namke file. Modify the files as below (search the files with key words). Recommend to backup config.nmake file before any change.
Key Words          Value          Actions
WIRESHARK_LIBS  The location of your Wireshark library
MSVC_VARIANT      Your version of Microsoft Visual Studio C++
GTK1_DIR          $(WIRESHARK_LIBS)\gtk+    use # to comment this line out as if you plan to use the latest version GTK 2
GTK2_DIR          $(WIRESHARK_LIBS)\gtk2    Default
CYGWIN_PATH        The path of Cygwin bin directory
PYTHON            The path of python    you can install standalone version of python, or use the default python in Cygwin\bin
MAKENSIS          The path of MakeNsis    use # to comment this line out if you haven’t installed MakeNsis
HHC_DIR            $(PROGRAM_FILES)/HTML Help Workshop/    use # to comment this line out if you haven’t installed Html Help Workshop
INSTALL1_DIR      wireshark-gtk1    use # to comment this line out if you don’t want to generate GTK 1 version’s Wireshark

Table 1. Configuration Change

A) MSVC_VARIANT=MSVC2010           # Remove the ‘#’ MSVC_VARIANT=MSVC2010

3) Ready? Launch !
Start a DOS command window(Run as Administrator)
A) Set Visual C++ 2010 environment variants:
If you are building on a 32-bit machine
To build 32-bit binaries call “C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat”
And to build 64-bit binaries call “C:\Program Files\Microsoft Visual Studio 10.0\VC\Vcvarsall.bat x86_amd64”
If you are building on a 64-bit machine,
To build 32-bit binaries call “C:\Program Files(x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat”
And to build 64-bit binaries call “C:\Program Files(x86)\Microsoft Visual Studio 10.0\VC\Vcvarsall.bat amd64”

cd C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\Vcvarsall.bat amd64

4) Verify installed/required
A) Locate to your wireshark source directory:

cd d:/svn/netmedia/20-protocol/wireshark/wireshark_src/wireshark-1.10.10

B) Verify tools

nmake -f Makefile.nmake verify_tools

There will be an error message like this if it’s the first time you trying to build wireshark
ERROR: The contents of ‘C:\Wireshark-win32-libs\current_tag.txt’ is (unknown).

It’s only because you haven’t download the required packages, yet. Ignore it, and after the next step, you’ll get all of them.

5) Install required libraries
Run command below to start the auto setup and download the required libraries.

nmake -f Makefile.nmake setup

The libraries will be downloaded and saved to C:\Wireshark-win32-libs.
In normal cases of bandwidth, this requires ETA 5 minutes.
After downloaded all the libraries, you can run “nmake -f Makefile.nmake verify_tools” once more, then you’ll find the error message in the previous step is no more exist.

6) Clean the sources
Run command below to clean the sources

nmake -f Makefile.nmake distclean

This step is used to clean the obj files generated in a previous compilation, and make ready for the incoming next build.

7) Build Wireshark

nmake -f Makefile.nmake all

Wait until the compilation is finished, once it’s done, you can try run the compiled wireshark.exe to verify whether or not the compilation is success.


Mom’s surgery

Last month, just before the long holiday, a tumor was found in Mom’s throat(Says Thyroid Cancer).

Early in this month, we got the test result which telling “it’s not a bad tumor”, however, suggestion from the doctor was, better to get rid of it.So we booked a surgery for it, but need time to wait.

The day before yesterday, got a phone call from the hospital, that the surgery apply was accepted.

In fact, we were so worried ever since the tumor was found, but appearently, not as mom’s:

Yesterday, she sent a 2000 RMB Red envelope within to the doctor who’ll charge the surgery when she went to the hospital for check in.

That was a really ridiculous thing to me when mom told me she’d attend to. We would all laugh at that. But the thing was, the doctor actually accepted it. Well, well, well…

Good thing is, mom will not have to worry any other extra things about all the rest surgery arrangement after all.

Bad thing is, this really destroyed my belief in Doctor now.

Anyway, that’s not the point, my wish here is may we a Good luck. Fighting!

Lu Xun Native Place – A biggest house ever saw

In the last holiday (Oct 1), we dropped by ShaoXin on the way back to hometown, and paied a visit at Luxun Native Place.
All I should say is: I finally saw a house which is called as Large families(大户人家),

If you read a lot of LuXun’s Essays in your school time, it could be a good tour to review.
And if you come from a normal family, you should go visit it too, because you will be astonished by it too.

Continue reading “Lu Xun Native Place – A biggest house ever saw”

BFCP sucks

I’m participating in a project which was targeted to dual stream control together with MTs of Polycom and Huawei, by using BFCP protocol while a SIPProxy is invloved.

Working environment:
A. Several MTs working behind different NAT.
B. A Polycom SIP Proxy Server in internet.

Polycom MT model: POLYCOM RealPresence Group 550, firmware version: unknown.
Huawei MT model: TE60, firmware version: TEX0 V100R001C01B024SP05 Release May 7 2014 04:06:40
Kedacom MT model: HD3

Both of Polycom and Huawei MTs are using BFCP over UDP mode in proxy mode, no matter their SIP stack is using TLS or not, same if we forced to use SIP over TCP only.
Seems the root cause is Polycom SIP Proxy supports only BFCP over UDP for relay BFCP commands.

However, our SIP MT supports only BFCP over TCP.

So to implement BFCP over UDP for our MT, the major job it is.

Here we go.

1. Try get the BFCP related RFC documents

First thing to do is go to ietf to check out the RFC documents which related with BFCP.

There you’ll get 3 Standard typed RFC documents:
a. RFC 4582: The Binary Floor Control Protocol (BFCP)
b. RFC 4583: Session Description Protocol (SDP) Format for Binary Floor Control Protocol (BFCP) Streams
c. RFC 5018: Connection Establishment in the Binary Floor Control Protocol (BFCP)

and some drafts:
a. draft-ietf-bfcpbis-rfc4582bis-11, The Binary Floor Control Protocol (BFCP)
b. draft-sandbakken-dispatch-bfcp-udp-03, Revision of the Binary Floor Control Protocol (BFCP) for use over an unreliable transport
c. draft-ietf-bfcpbis-rfc453bis-09, Session Description Protocol (SDP) Format for Binary Floor Control Protocol (BFCP) Streams

2. Get into the documents for BFCP over UDP

After do some dig into the documents, turns out all the 3 RFCs are not describing BFCP over UDP or relavant.
That is to say we have no standard to follow for BFCP over UDP for now, we can only turn to the draft documents:

A. draft-ietf-bfcpbis-rfc4582bis-11
B. draft-sandbakken-dispatch-bfcp-udp-03
C. draft-ietf-bfcpbis-rfc453bis-09

Relationship of A, B, C:
A is the newest one, it replaced B which once replaced C.

3. About BFCP UDP and TCP

The major difference between BFCP over TCP and BFCP over UDP are:
A. UDP floor control message needs an ACK to confirm the message was received(and processed) properly, while BFCP over TCP can benefit from the TCP reliable machenism.
B. UDP packets can be relayed more easier than TCP packets while using Proxies like in this scenario.

4. Definition confliction in Primitive value

Bad thing happens, even protocol designed by great company as Cisco and Ericsson.

In draft-sandbakken-dispatch-bfcp-udp-03
| Value | Primitive             | Direction          |
|   14  | FloorRequestStatusAck | P -> S ; Ch -> S   |
|   15  | ErrorAck              | P -> S ; Ch -> S   |
|   16  | FloorStatusAck        | P -> S ; Ch -> S   |
|   17  | Goodbye               | P -> S ; Ch -> S ; |
|       |                       | P <- S ; Ch <- S   |
|   18  | GoodbyeAck            | P -> S ; Ch -> S ; |
|       |                       | P <- S ; Ch <- S   |

In draft-ietf-bfcpbis-rfc4582bis-11
| Value | Primitive             | Direction          |
|   1   | FloorRequest          | P -> S             |
|   2   | FloorRelease          | P -> S             |
|   3   | FloorRequestQuery     | P -> S ; Ch -> S   |
|   4   | FloorRequestStatus    | P <- S ; Ch <- S   |
|   5   | UserQuery             | P -> S ; Ch -> S   |
|   6   | UserStatus            | P <- S ; Ch <- S   |
|   7   | FloorQuery            | P -> S ; Ch -> S   |
|   8   | FloorStatus           | P <- S ; Ch <- S   |
|   9   | ChairAction           | Ch -> S            |
|   10  | ChairActionAck        | Ch <- S            |
|   11  | Hello                 | P -> S ; Ch -> S   |
|   12  | HelloAck              | P <- S ; Ch <- S   |
|   13  | Error                 | P <- S ; Ch <- S   |
|   14  | FloorRequestStatusAck | P -> S ; Ch -> S   |
|   15  | FloorStatusAck        | P -> S ; Ch -> S   |
|   16  | Goodbye               | P -> S ; Ch -> S ; |
|       |                       | P <- S ; Ch <- S   |
|   17  | GoodbyeAck            | P -> S ; Ch -> S ; |
|       |                       | P <- S ; Ch <- S   |

Still not find out what the problem it is? Check the Primitive Value from 15 to 17, the definitions in the two drafts are complete different.

BTW: Wireshark, Version 1.10.6 (v1.10.6 from master-1.10),  interpret the primitive value according to draft-sandbakken-dispatch-bfcp-udp-03

5. Bug or something else?

Because we are using Polycom’s SIP proxy for test, so we took Polycom’s BFCP protocol command for the standard one.
But their are surprises after digged into Polycom 550:

a. Does not recognize FloorRelease command.
Polycom 550 was a Server (BFCP server role), and Huawei TE60 as a Participant(BFCP client role), when Huawei TE60 sent a FloorRelease command to Polycom 550, Polycom 550 did not response to this command.
However, in the HelloAck reply, Polycom declared that it do support FloorRelease.
Don’t know why.

BFCP - HelloAck - SupportedPrimitives
BFCP – HelloAck – SupportedPrimitives

b. Floor Control Header info
There is a field represents as Transaction Responser flag(the 5th bit of the first byte), 1 means a responder, 0 not. But in Polycom BFCP command protocols, seems there are different rules in it.
Here are two example packets sent out by Polycom 550, first one have the responder field value set to 1, second one 0.

BFCP - FloorControlHeader - Responder - True
BFCP – FloorControlHeader – Responder – True
BFCP - FloorControlHeader - Responder - False
BFCP – FloorControlHeader – Responder – False

c. Constructing OverallRequestStatus

Are there any rules about the levels for OverallRequestStatus in FloorRequestInformation? ‘Cause I found out that there are some slight differences between Huawei TE60 and Polycom 550.

BFCP - FloorRequestInformation - Polycom550
BFCP – FloorRequestInformation – Polycom550
BFCP - FloorRequestInformation - HuaweiTE60
BFCP – FloorRequestInformation – HuaweiTE60

See, Huawei puts the OverallRequestStatus parallel with FloorRequestStatus, while Polycom puts the FloorRequestStatus under the OverallRequestStatus.
(Not sure whether I mis-interpret the IETF drafts)

6. A temporary conclusion
BFCP sucks:
1. We don’t have a standard to follow(for BFCP over UDP).
2. The primitive definition conflictions in different drafts are really sick.

A Simple Tutorial for WANem

Being a networking related product developer, we always face issues which can not be easily reproducted in LAB(because in most cases we have LAN only environments).
Here I introduce you a tool, WANem – a WAN emulator tool from TATA. And we can benifit a lot in reproducing issues or trouble shooting simply by using WANem.

What does WANem do?

WANem is a Wide Area Network Emulator, meant to provide a real experience of a Wide Area Network/Internet, during application development / testing over a LAN environment. Typically application developers develop applications on a LAN while the intended purpose for the same could be, clients accessing the same over the WAN or even the Internet. WANem thus allows the application development team to setup a transparent application gateway which can be used to simulate WAN characteristics like Network delay, Packet loss, Packet corruption, Disconnections, Packet re-ordering, Jitter, etc. WANem can be used to simulate Wide Area Network conditions for Data/Voice traffic and is released under the widely acceptable GPL v2 license. WANem thus provides emulation of Wide Area Network characteristics and thus allows data/voice applications to be tested in a realistic WAN environment before they are moved into production at an affordable cost. WANem is built on top of other FLOSS [Free Libre and OpenSource] components and like other intelligent FLOSS projects has chosen not to re-invent the wheel as much as possible.

Where to download WANem?

WANem is an open-source project, and it hosts on source forge, you can download it here:

Start to use.

1. Start WANem image with VMware

1. knoppix5.3 bootup2. Choose your network configuration, DHCP or manual static IP. Here I’m using static IP.

2. dont use DHCP3. Setup your password for your VM(Knoppix).

3. setup your passsword4. Open a browser and navigate to WANem with an URL like this: http://ip-address/WANem, such as

4. open a browser and navigate to WANem5. Add route rule for your test endpoints/peers

5. add route rule for your test endpoints6. Start WANem by a specified Loss percentage.

6. start WANem7. Run your tests.

A sample route setting

a. Delete default route for your endpoint

route delete

b. Add a force route to WANem

route add mask

* You need to change the IP address with the IP address of your own WANem server.

However, all the data from this endpoint will be forced to route to WANem if this route is applied. If you wish it works only for one another peer IP, you can change the command to

route add mask

This means, if you are connecting or sending data to from this endpoint, all the data packages will first route to (WANem server)

c. Test your route

You can use this command to test the route setting if your application is working under windows:


If you have any questions about using WANem, you can leave a message for me under this post.

EzFaceRecognizer – a simple implementation of face recognition

One of my EasyIV project’s featured function is face detect, but obviously it was only used to collect faces for further process, like face recognition, of some other application or system working along with EasyIV.

I’d say here, face recognition was also included in my plan for EasyIV.

However, after digged into it for sometime, I found it’s really a big problem to me. I tried several ways to implement the face recognition process, but all the results are sad, none of the can work precisely.

P.S. Lucky me, I didn’t bring this topic to my paper, otherwise I’ll be doomed in the coming Mid-term examination.

Here I share with you a simple test program I used to practice face recognition by using Eigenface.

What is Eigenface?

Eigenfaces is the name given to a set of eigenvectors when they are used in the computer vision problem of human face recognition.[1] The approach of using eigenfaces for recognition was developed by Sirovich and Kirby (1987) and used by Matthew Turk and Alex Pentland in face classification.[2] The eigenvectors are derived from the covariance matrix of the probability distribution over the high-dimensional vector space of face images. The eigenfaces themselves form a basis set of all images used to construct the covariance matrix. This produces dimension reduction by allowing the smaller set of basis images to represent the original training images. Classification can be achieved by comparing how faces are represented by the basis set.

[UniSVR]Cloud Product and Service Demonstration to our visitors!

Although left UniSVR for a year, yet proud to say, I had particapted in this product, and played a role in this great product. For more informations, please visit:

UniSVR (HermesDDS supporting company) has a group of visitors on July 10th.  It was our pleasure to have them visiting and learning more about our product and services. Continue reading “[UniSVR]Cloud Product and Service Demonstration to our visitors!”

Incoming of the Mid-term examination

Easlier in the month, got a message from the school telling the mid-term examination of our dissertation is incoming. The scheduled time will be around mid-august.

I was once told that I can’t be in the list who can have the Thesis Defense in Oct, because I’m a Gendu students. the time for me to do it will not be earlier than May, 2015. However, I can keep fight for it in spite of the busy days in the hot seasons(In the work, at home, and other stuffs).

So I planned for myself that I will finish the draft version of my dissertation before the mid-term examination, and have it ready for the first round of question in the mid-term examination.

Keep fighting!

P.S. I’m considering whether should I start to apply a Ph.D. study after this, target field:  face recognition, or streaming media, which are exact in the fields of my tutor Ming Zhu, and also I’ve mastered and worked for years.