xref: /f-stack/tools/README.md (revision d4a07e70)
17abd0fb2Slogwang# Introduction
27abd0fb2Slogwang
35af66259Sjfb8856606Compile ff tools
45af66259Sjfb8856606
58d76b62eSfengbojiang    # Upgrade pkg-config while version < 0.28
68d76b62eSfengbojiang    #wget https://pkg-config.freedesktop.org/releases/pkg-config-0.29.2.tar.gz
78d76b62eSfengbojiang    #tar xzvf pkg-config-0.29.2.tar.gz
88d76b62eSfengbojiang    #cd pkg-config-0.29.2
98d76b62eSfengbojiang    #./configure --with-internal-glib
108d76b62eSfengbojiang    #make
118d76b62eSfengbojiang    #make install
128d76b62eSfengbojiang    #mv /usr/bin/pkg-config /usr/bin/pkg-config.bak
138d76b62eSfengbojiang    #ln -s /usr/local/bin/pkg-config /usr/bin/pkg-config
148d76b62eSfengbojiang
158d76b62eSfengbojiang    export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:/usr/local/lib64/pkgconfig:/usr/lib/pkgconfig
168d76b62eSfengbojiang
175af66259Sjfb8856606    make
185af66259Sjfb8856606
195af66259Sjfb8856606Install ff tools, all ff tools will be installed to `/usr/local/bin/f-stack/`, and some soft link will be created in `/usr/local/bin`, such as `ff_top`,`ff_traffic`, etc.
205af66259Sjfb8856606
215af66259Sjfb8856606    make install
225af66259Sjfb8856606
23df6ad731SlogwangDirectory `compat` implements an ipc library using dpdk `rte_ring` and ports some source files compatible with FreeBSD and Linux.
247abd0fb2Slogwang
2565a9b498SfengbojiangDirectory `sbin` contains all the tools binary that compiled.
2665a9b498Sfengbojiang
277abd0fb2SlogwangAll other directories are useful tools ported from FreeBSD.
287abd0fb2SlogwangSince F-Stack is multi-process architecture and every process has an independent stack, so we must communicate with every F-Stack process.
29df6ad731SlogwangEach tool add an option `-p`(Which F-Stack process to communicate with, default 0), except that, it is same with the original FreeBSD.
30df6ad731Slogwang
31df6ad731SlogwangNote that these tools must be executed serially.
327abd0fb2Slogwang
337abd0fb2Slogwang# sysctl
347abd0fb2SlogwangUsage:
3591a931faSlogwang```
3691a931faSlogwangsysctl -p <f-stack proc_id> [-bdehiNnoqTtWx] [ -B <bufsize> ] [-f filename] name[=value] ...
3791a931faSlogwangsysctl -p <f-stack proc_id> [-bdehNnoqTtWx] [ -B <bufsize> ] -a
3891a931faSlogwang```
39df6ad731SlogwangFor more details, see [Manual page](https://www.freebsd.org/cgi/man.cgi?sysctl).
407abd0fb2Slogwang
41df6ad731Slogwang# ifconfig
42df6ad731SlogwangUsage:
4391a931faSlogwang```
44df6ad731Slogwangifconfig -p <f-stack proc_id> [-f type:format] %sinterface address_family
45df6ad731Slogwang        [address [dest_address]] [parameters]
46df6ad731Slogwang    ifconfig -p <f-stack proc_id> interface create
47df6ad731Slogwang    ifconfig -p <f-stack proc_id> -a %s[-d] [-m] [-u] [-v] [address_family]
48df6ad731Slogwang    ifconfig -p <f-stack proc_id> -l [-d] [-u] [address_family]
49df6ad731Slogwang    ifconfig -p <f-stack proc_id> %s[-d] [-m] [-u] [-v]
5091a931faSlogwang```
51cd4d3a58SrootWe has supportted inet6, you can config ipv6 address like this:
52cd4d3a58Sroot
53cd4d3a58Sroot    ifconfig -p <f-stack proc_id> interface inet6 <ipv6 address> autoconf
54cd4d3a58Sroot
55df6ad731SlogwangUnsupported interfaces or parameters:
56df6ad731Slogwang```
57df6ad731SlogwangMAC(Mandatory Access Control)
58df6ad731Slogwangmedia
59df6ad731SlogwangSFP/SFP+
60df6ad731SlogwangIEEE80211 Wireless
61df6ad731Slogwangpfsync
62df6ad731SlogwangLAGG LACP
63df6ad731Slogwangjail
64df6ad731Slogwang```
65df6ad731SlogwangFor more details, see [Manual page](https://www.freebsd.org/cgi/man.cgi?ifconfig).
667abd0fb2Slogwang
67144c6bcdSlogwang# route
68144c6bcdSlogwangUsage:
69144c6bcdSlogwang```
70144c6bcdSlogwangroute -p <f-stack proc_id> [-46dnqtv] command [[modifiers] args]
71144c6bcdSlogwang```
72144c6bcdSlogwangExamples:
73144c6bcdSlogwang```
74144c6bcdSlogwang     Add a default route:
75144c6bcdSlogwang
7665a9b498Sfengbojiang       ./sbin/route -p 0 add -net 0.0.0.0/0 192.168.1.1
77144c6bcdSlogwang
78144c6bcdSlogwang     A shorter version of adding a default route can also be written as:
79144c6bcdSlogwang
8065a9b498Sfengbojiang       ./sbin/route -p 0 add default 192.168.1.1
81144c6bcdSlogwang
82144c6bcdSlogwang     Add a static route to the 172.16.10.0/24 network via the 172.16.1.1 gate-
83144c6bcdSlogwang     way:
84144c6bcdSlogwang
8565a9b498Sfengbojiang       ./sbin/route -p 0 add -net 172.16.10.0/24 172.16.1.1
86144c6bcdSlogwang
87144c6bcdSlogwang     Change the gateway of an already established static route in the routing
88144c6bcdSlogwang     table:
89144c6bcdSlogwang
9065a9b498Sfengbojiang       ./sbin/route -p 0 change -net 172.16.10.0/24 172.16.1.2
91144c6bcdSlogwang
92144c6bcdSlogwang     Display the route for a destination network:
93144c6bcdSlogwang
9465a9b498Sfengbojiang       ./sbin/route -p 0 show 172.16.10.0
95cd4d3a58Sroot       ./sbin/route -p 0 -6 show ::/0
96144c6bcdSlogwang
97144c6bcdSlogwang     Delete a static route from the routing table:
98144c6bcdSlogwang
9965a9b498Sfengbojiang       ./sbin/route -p 0 delete -net 172.16.10.0/24 172.16.1.2
100144c6bcdSlogwang
101144c6bcdSlogwang     Remove all routes from the routing table:
102144c6bcdSlogwang
10365a9b498Sfengbojiang       ./sbin/route -p 0 flush
104144c6bcdSlogwang
105144c6bcdSlogwang    FreeBSD uses `netstat -rn ` to list the route table which we havn't ported,
106144c6bcdSlogwang    you can execute the following command instead, `-d` means debug mode, `-v`
107144c6bcdSlogwang    means verbose.
10865a9b498Sfengbojiang       ./sbin/route -p 0 -d -v flush
109144c6bcdSlogwang```
110144c6bcdSlogwangNote that, if you want to modify the route table, you must use `-p` to execute the same command for each f-stack process.
111144c6bcdSlogwang
112144c6bcdSlogwangFor more details, see [Manual page](https://www.freebsd.org/cgi/man.cgi?route).
113144c6bcdSlogwang
114e7741141SAndy# top
115e7741141SAndyUsage:
116e7741141SAndy```
117c9c09dfaSfengbojiangtop [-p <f-stack proc_id>] [-P <max proc_id>] [-d <secs>] [-n <num>]
118e7741141SAndy```
119e7741141SAndyExamples:
120e7741141SAndy```
121d02fa78dSfengbojiang(姜凤波)./sbin/top -p 0 -P 3
122d02fa78dSfengbojiang(姜凤波)|---------|---------|---------|---------|---------------|
123d02fa78dSfengbojiang(姜凤波)|  proc_id|     idle|      sys|      usr|           loop|
124d02fa78dSfengbojiang(姜凤波)|---------|---------|---------|---------|---------------|
1250f5432bbSfengbojiang|        0|   92.44%|    4.00%|    3.56%|          13427|
1260f5432bbSfengbojiang|        1|   92.18%|    4.21%|    3.61%|          14035|
1270f5432bbSfengbojiang|        2|   92.19%|    4.19%|    3.62%|          13929|
1280f5432bbSfengbojiang|        3|   92.33%|    4.14%|    3.53%|          13938|
1290f5432bbSfengbojiang|    total|  369.14%|   16.54%|   14.32%|          55329|
130d02fa78dSfengbojiang(姜凤波)|         |         |         |         |               |
1310f5432bbSfengbojiang|        0|   92.27%|    4.10%|    3.63%|          13438|
1320f5432bbSfengbojiang|        1|   92.03%|    4.27%|    3.70%|          13906|
1330f5432bbSfengbojiang|        2|   92.08%|    4.24%|    3.68%|          13817|
1340f5432bbSfengbojiang|        3|   92.28%|    4.15%|    3.57%|          13759|
1350f5432bbSfengbojiang|    total|  368.65%|   16.77%|   14.58%|          54920|
136d02fa78dSfengbojiang(姜凤波)|         |         |         |         |               |
1370f5432bbSfengbojiang|        0|   91.88%|    4.30%|    3.81%|          13802|
1380f5432bbSfengbojiang|        1|   91.94%|    4.32%|    3.74%|          13928|
1390f5432bbSfengbojiang|        2|   92.10%|    4.24%|    3.66%|          13856|
1400f5432bbSfengbojiang|        3|   92.30%|    4.14%|    3.56%|          13708|
1410f5432bbSfengbojiang|    total|  368.22%|   17.00%|   14.77%|          55294|
142d02fa78dSfengbojiang(姜凤波)|         |         |         |         |               |
143e7741141SAndy```
144e7741141SAndy
1451eaf0ac3Slogwang# netstat
1461eaf0ac3SlogwangUsage:
1471eaf0ac3Slogwang```
148*d4a07e70Sfengbojiang   netstat -t <f-stack proc_id> [-46AaLnRSTWx] [-f protocol_family | -p protocol]
149*d4a07e70Sfengbojiang   netstat -t <f-stack proc_id> -i | -I interface [-46abdhnW] [-f address_family]
150*d4a07e70Sfengbojiang   netstat -t <f-stack proc_id> -w wait [-I interface] [-46d] [-q howmany]
151*d4a07e70Sfengbojiang   netstat -t <f-stack proc_id> -s [-46sz] [-f protocol_family | -p protocol]
152*d4a07e70Sfengbojiang   netstat -t <f-stack proc_id> -i | -I interface -s [-46s]
1531eaf0ac3Slogwang           [-f protocol_family | -p protocol]
154*d4a07e70Sfengbojiang   netstat -t <f-stack proc_id> -B [-z] [-I interface]
155*d4a07e70Sfengbojiang   netstat -t <f-stack proc_id> -r [-46AnW] [-F fibnum] [-f address_family]
156*d4a07e70Sfengbojiang   netstat -t <f-stack proc_id> -rs [-s]
157*d4a07e70Sfengbojiang   netstat -t <f-stack proc_id> -g [-46W] [-f address_family]
158*d4a07e70Sfengbojiang   netstat -t <f-stack proc_id> -gs [-46s] [-f address_family]
159*d4a07e70Sfengbojiang   netstat -t <f-stack proc_id> -Q
1601eaf0ac3Slogwang```
1611eaf0ac3Slogwang
1621eaf0ac3SlogwangUnsupported commands or features:
1631eaf0ac3Slogwang```
1641eaf0ac3Slogwang-M
1651eaf0ac3Slogwang-N
1661eaf0ac3Slogwang-m
1671eaf0ac3Slogwangnetgraph
1681eaf0ac3Slogwangipsec
1691eaf0ac3Slogwang```
1701eaf0ac3Slogwang
1711eaf0ac3SlogwangFor more details, see [Manual page](https://www.freebsd.org/cgi/man.cgi?netstat).
172e7741141SAndy
173555c8489Slogwang# ngctl
174555c8489SlogwangUsage:
175555c8489Slogwang```
176555c8489Slogwangngctl -p <f-stack proc_id>  [-d] [-f file] [-n name] [command ...]
177555c8489Slogwang```
178555c8489Slogwang
179555c8489SlogwangAbout interactive mode:
180555c8489Slogwang- if you have `libedit` in your system, you can turn on `MK_HAVE_LIBEDIT` in `opts.mk`,
181555c8489Slogwang  the interactive mode will support generic line editing, history functions.
182555c8489Slogwang
183555c8489Slogwang
184555c8489SlogwangFor more details, see [Manual page](https://www.freebsd.org/cgi/man.cgi?ngctl).
185555c8489Slogwang
186127dd473Swhl739# ipfw
187127dd473Swhl739Usage:
188127dd473Swhl739```
189127dd473Swhl739ipfw -P <f-stack proc_id> [-abcdefhnNqStTv] <command>
190127dd473Swhl739
191127dd473Swhl739where <command> is one of the following:
192127dd473Swhl739
193127dd473Swhl739add [num] [set N] [prob x] RULE-BODY
194127dd473Swhl739{pipe|queue} N config PIPE-BODY
195127dd473Swhl739[pipe|queue] {zero|delete|show} [N{,N}]
196127dd473Swhl739nat N config {ip IPADDR|if IFNAME|log|deny_in|same_ports|unreg_only|reset|
197127dd473Swhl739                reverse|proxy_only|redirect_addr linkspec|
198127dd473Swhl739                redirect_port linkspec|redirect_proto linkspec}
199127dd473Swhl739set [disable N... enable N...] | move [rule] X to Y | swap X Y | show
200127dd473Swhl739set N {show|list|zero|resetlog|delete} [N{,N}] | flush
201127dd473Swhl739table N {add ip[/bits] [value] | delete ip[/bits] | flush | list}
202127dd473Swhl739table all {flush | list}
203127dd473Swhl739
204127dd473Swhl739RULE-BODY:      check-state [PARAMS] | ACTION [PARAMS] ADDR [OPTION_LIST]
205127dd473Swhl739ACTION: check-state | allow | count | deny | unreach{,6} CODE |
206127dd473Swhl739               skipto N | {divert|tee} PORT | forward ADDR |
207127dd473Swhl739               pipe N | queue N | nat N | setfib FIB | reass
208127dd473Swhl739PARAMS:         [log [logamount LOGLIMIT]] [altq QUEUE_NAME]
209127dd473Swhl739ADDR:           [ MAC dst src ether_type ]
210127dd473Swhl739                [ ip from IPADDR [ PORT ] to IPADDR [ PORTLIST ] ]
211127dd473Swhl739                [ ipv6|ip6 from IP6ADDR [ PORT ] to IP6ADDR [ PORTLIST ] ]
212127dd473Swhl739IPADDR: [not] { any | me | ip/bits{x,y,z} | table(t[,v]) | IPLIST }
213127dd473Swhl739IP6ADDR:        [not] { any | me | me6 | ip6/bits | IP6LIST }
214127dd473Swhl739IP6LIST:        { ip6 | ip6/bits }[,IP6LIST]
215127dd473Swhl739IPLIST: { ip | ip/bits | ip:mask }[,IPLIST]
216127dd473Swhl739OPTION_LIST:    OPTION [OPTION_LIST]
217127dd473Swhl739OPTION: bridged | diverted | diverted-loopback | diverted-output |
218127dd473Swhl739        {dst-ip|src-ip} IPADDR | {dst-ip6|src-ip6|dst-ipv6|src-ipv6} IP6ADDR |
219127dd473Swhl739        {dst-port|src-port} LIST |
220127dd473Swhl739        estab | frag | {gid|uid} N | icmptypes LIST | in | out | ipid LIST |
221127dd473Swhl739        iplen LIST | ipoptions SPEC | ipprecedence | ipsec | iptos SPEC |
222127dd473Swhl739        ipttl LIST | ipversion VER | keep-state | layer2 | limit ... |
223127dd473Swhl739        icmp6types LIST | ext6hdr LIST | flow-id N[,N] | fib FIB |
224127dd473Swhl739        mac ... | mac-type LIST | proto LIST | {recv|xmit|via} {IF|IPADDR} |
225127dd473Swhl739        setup | {tcpack|tcpseq|tcpwin} NN | tcpflags SPEC | tcpoptions SPEC |
226127dd473Swhl739        tcpdatalen LIST | verrevpath | versrcreach | antispoof
227127dd473Swhl739```
228127dd473Swhl739Note [dummynet](https://www.freebsd.org/cgi/man.cgi?query=dummynet) is not supported yet.
229127dd473Swhl739
230127dd473Swhl739For more details, see [Manual page](https://www.freebsd.org/cgi/man.cgi?ipfw) or [handbook](https://www.freebsd.org/doc/handbook/firewalls-ipfw.html).
231127dd473Swhl739
232fa74a859Slogwang# arp
233fa74a859SlogwangUsage
234fa74a859Slogwang```
235fa74a859Slogwangusage: arp -p <f-stack proc_id> [-n] [-i interface] hostname
236fa74a859Slogwang       arp -p <f-stack proc_id> [-n] [-i interface] -a
237fa74a859Slogwang       arp -p <f-stack proc_id> -d hostname [pub]
238fa74a859Slogwang       arp -p <f-stack proc_id> -d [-i interface] -a
239fa74a859Slogwang       arp -p <f-stack proc_id> -s hostname ether_addr [temp] [reject | blackhole] [pub [only]]
240fa74a859Slogwang       arp -p <f-stack proc_id> -S hostname ether_addr [temp] [reject | blackhole] [pub [only]]
241fa74a859Slogwang       arp -p <f-stack proc_id> -f filename
242fa74a859Slogwang```
243fa74a859Slogwang
244fa74a859SlogwangFor more details, see [Manual page](https://www.freebsd.org/cgi/man.cgi?arp).
245fa74a859Slogwang
24603df98deSfengbojiang# traffic
24703df98deSfengbojiangUsage:
24803df98deSfengbojiang```
249c9c09dfaSfengbojiangtraffic [-p <f-stack proc_id>] [-P <max proc_id>] [-d <secs>] [-n <num>]
25003df98deSfengbojiang```
25103df98deSfengbojiangExamples:
25203df98deSfengbojiang```
253c9c09dfaSfengbojiang./sbin/traffic -p 0 -P 3
25403df98deSfengbojiang
255c9c09dfaSfengbojiang|---------|--------------------|--------------------|--------------------|--------------------|
256c9c09dfaSfengbojiang|  proc_id|          rx packets|            rx bytes|          tx packets|            tx bytes|
257c9c09dfaSfengbojiang|---------|--------------------|--------------------|--------------------|--------------------|
258c9c09dfaSfengbojiang|        0|               39594|             3721836|               79218|            30945013|
259c9c09dfaSfengbojiang|        1|               43427|             4082138|               86860|            33918830|
260c9c09dfaSfengbojiang|        2|               37708|             3544552|               75448|            29462444|
261c9c09dfaSfengbojiang|        3|               41306|             3882764|               82598|            32254519|
262c9c09dfaSfengbojiang|    total|              162035|            15231290|              324124|           126580806|
263c9c09dfaSfengbojiang|         |                    |                    |                    |                    |
264c9c09dfaSfengbojiang|        0|               40849|             3839831|               81686|            31898383|
265c9c09dfaSfengbojiang|        1|               44526|             4185444|               89056|            34776368|
266c9c09dfaSfengbojiang|        2|               38491|             3618154|               76974|            30058347|
267c9c09dfaSfengbojiang|        3|               41631|             3913314|               83244|            32506782|
268c9c09dfaSfengbojiang|    total|              165497|            15556743|              330960|           129239880|
269c9c09dfaSfengbojiang|         |                    |                    |                    |                    |
270c9c09dfaSfengbojiang|        0|               41136|             3866750|               82268|            32125654|
271c9c09dfaSfengbojiang|        1|               42184|             3965296|               84372|            32947266|
272c9c09dfaSfengbojiang|        2|               39182|             3683108|               78358|            30598799|
273c9c09dfaSfengbojiang|        3|               41458|             3897052|               82926|            32382603|
274c9c09dfaSfengbojiang|    total|              163960|            15412206|              327924|           128054322|
275c9c09dfaSfengbojiang|         |                    |                    |                    |                    |
27603df98deSfengbojiang```
27703df98deSfengbojiang
278db7072c6Sfengbojiang# ndp
279db7072c6SfengbojiangUsage:
280db7072c6Sfengbojiang```
281db7072c6Sfengbojiangndp -C <f-stack proc_id> [-nt] hostname
282db7072c6Sfengbojiangndp -C <f-stack proc_id> [-nt] -a | -c | -p | -r | -H | -P | -R
283db7072c6Sfengbojiangndp -C <f-stack proc_id> [-nt] -A wait
284db7072c6Sfengbojiangndp -C <f-stack proc_id> [-nt] -d hostname
285db7072c6Sfengbojiangndp -C <f-stack proc_id> [-nt] -f filename
286db7072c6Sfengbojiangndp -C <f-stack proc_id> [-nt] -i interface [flags...]
287db7072c6Sfengbojiangndp -C <f-stack proc_id> [-nt] -I [interface|delete]
288db7072c6Sfengbojiangndp -C <f-stack proc_id> [-nt] -s nodename etheraddr [temp] [proxy]
289db7072c6Sfengbojiang```
290db7072c6SfengbojiangFor more details, see [Manual page](https://www.freebsd.org/cgi/man.cgi?ndp).
291db7072c6Sfengbojiang
2927abd0fb2Slogwang# how to implement a custom tool for communicating with F-Stack process
2937abd0fb2Slogwang
2947abd0fb2SlogwangAdd a new FF_MSG_TYPE in ff_msg.h:
2957abd0fb2Slogwang```
2967abd0fb2Slogwangenum FF_MSG_TYPE {
2977abd0fb2Slogwang    FF_UNKNOWN = 0,
2987abd0fb2Slogwang    FF_SYSCTL,
2997abd0fb2Slogwang    FF_HELLOWORLD,
3007abd0fb2Slogwang};
3017abd0fb2Slogwang```
3027abd0fb2Slogwang
3037abd0fb2SlogwangDefine a structure used to communicate:
3047abd0fb2Slogwang```
3057abd0fb2Slogwangstruct ff_helloworld_args {
3067abd0fb2Slogwang    void *request;
3077abd0fb2Slogwang    size_t req_len;
3087abd0fb2Slogwang    void *reply;
3097abd0fb2Slogwang    size_t rep_len;
3107abd0fb2Slogwang};
3117abd0fb2Slogwang```
3127abd0fb2SlogwangNote that, when using struct ff_helloworld_args, pointers in this structure must point to the addresses range from ff_msg.buf_addr and ff_msg.buf_addr+ff_msg.buf_len, ff_msg.buf_len is (10240 - sizeof(struct ff_msg)).
3137abd0fb2Slogwang
3147abd0fb2SlogwangAnd add it to ff_msg:
3157abd0fb2Slogwang```
3167abd0fb2Slogwangstruct ff_msg {
3177abd0fb2Slogwang    ...
3187abd0fb2Slogwang    union {
3197abd0fb2Slogwang        struct ff_sysctl_args sysctl;
3207abd0fb2Slogwang        struct ff_helloworld_args helloworld;
3217abd0fb2Slogwang    };
3227abd0fb2Slogwang};
3237abd0fb2Slogwang```
3247abd0fb2Slogwang
3257abd0fb2SlogwangModify ff_dpdk_if.c, add a handle function:
3267abd0fb2Slogwang```
3277abd0fb2Slogwangstatic inline void
3287abd0fb2Slogwanghandle_helloworld_msg(struct ff_msg *msg, uint16_t proc_id)
3297abd0fb2Slogwang{
3307abd0fb2Slogwang    printf("helloworld msg recved.\n");
3317abd0fb2Slogwang    msg->result = 0;
3327abd0fb2Slogwang    rte_ring_enqueue(msg_ring[proc_id].ring[1], msg);
3337abd0fb2Slogwang}
3347abd0fb2Slogwang
3357abd0fb2Slogwangstatic inline void
3367abd0fb2Slogwanghandle_msg(struct ff_msg *msg, uint16_t proc_id)
3377abd0fb2Slogwang{
3387abd0fb2Slogwang    switch (msg->msg_type) {
3397abd0fb2Slogwang        case FF_SYSCTL:
3407abd0fb2Slogwang            handle_sysctl_msg(msg, proc_id);
3417abd0fb2Slogwang            break;
3427abd0fb2Slogwang        case FF_HELLOWORLD:
3437abd0fb2Slogwang            handle_helloworld_msg(msg, proc_id);
3447abd0fb2Slogwang        default:
3457abd0fb2Slogwang            handle_default_msg(msg, proc_id);
3467abd0fb2Slogwang            break;
3477abd0fb2Slogwang    }
3487abd0fb2Slogwang}
3497abd0fb2Slogwang```
3507abd0fb2Slogwang
3517abd0fb2SlogwangCreate helloworld.c:
3527abd0fb2Slogwang
3537abd0fb2Slogwang```
3547abd0fb2Slogwangint main()
3557abd0fb2Slogwang{
3567abd0fb2Slogwang    struct ff_msg *msg = ff_ipc_msg_alloc();
3577abd0fb2Slogwang
3587abd0fb2Slogwang    char *buf = msg->buf_addr;
3597abd0fb2Slogwang
3607abd0fb2Slogwang    msg->helloworld.request = buf;
3617abd0fb2Slogwang    memcpy(msg->helloworld.request, "hello", 5);
3627abd0fb2Slogwang    msg->helloworld.req_len = 5;
3637abd0fb2Slogwang    buf += 5;
3647abd0fb2Slogwang
3657abd0fb2Slogwang    msg->helloworld.reply = buf;
3667abd0fb2Slogwang    msg->helloworld.rep_len = 10;
3677abd0fb2Slogwang
3687abd0fb2Slogwang    ff_ipc_send(msg, 0);
3697abd0fb2Slogwang
3707abd0fb2Slogwang    struct ff_msg *retmsg;
3717abd0fb2Slogwang    ff_ipc_recv(retmsg, 0);
3727abd0fb2Slogwang    assert(remsg==msg);
3737abd0fb2Slogwang
3747abd0fb2Slogwang    ff_ipc_msg_free(msg);
3757abd0fb2Slogwang}
3767abd0fb2Slogwang
3777abd0fb2Slogwang```
3787abd0fb2Slogwang
3797abd0fb2SlogwangThe Makefile may like this:
3807abd0fb2Slogwang```
3817abd0fb2SlogwangTOPDIR?=${CURDIR}/../..
3827abd0fb2Slogwang
3837abd0fb2SlogwangPROG=helloworld
3847abd0fb2Slogwang
3857abd0fb2Slogwanginclude ${TOPDIR}/tools/prog.mk
3867abd0fb2Slogwang```
387