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