Project Home
Project Home
Wiki
Wiki
Discussion Forums
Discussions
Project Information
Project Info
Forum Topic - Writing a network driver: Page 1 of 2 (41 Items)
   
Writing a network driver  
Hello all,

I hope I'm not making a mistake by asking some help here...

I'm currently working on a Qnx 6.5.0 system and I need to use a Wi-Fi client device (RedPine RS 9110-N-11-02 ) ...so I 
need to develop a driver so to be abble to make it work...

Except that I don't have any example or sample code to have a basis to develop my driver (it is the first time I have to
 develop such a thing so it's kind of intimidating !)

Is there anyone who can enlighten me ...please ?

Regards,

Paul
Re: Writing a network driver  
I have attached a sample outline of an io-pkt network driver.

-- 
Hugh Brown
QNX Software Systems Limited
175 Terence Matthews Crescent,
Ottawa. ON. K2M 1W8.
Telephone: 613-591-0931







On 11-09-27 12:00 PM, "Thilloy Paul" <community-noreply@qnx.com> wrote:

>Hello all,
>
>I hope I'm not making a mistake by asking some help here...
>
>I'm currently working on a Qnx 6.5.0 system and I need to use a Wi-Fi
>client device (RedPine RS 9110-N-11-02 ) ...so I need to develop a driver
>so to be abble to make it work...
>
>Except that I don't have any example or sample code to have a basis to
>develop my driver (it is the first time I have to develop such a thing so
>it's kind of intimidating !)
>
>Is there anyone who can enlighten me ...please ?
>
>Regards,
>
>Paul
>
>
>
>_______________________________________________
>
>Networking Drivers
>http://community.qnx.com/sf/go/post89096
>

Attachment: Text sample.tar.gz 20.61 KB
Re: Writing a network driver  
Hi Hugh,

Thanks a lot for your answer !
I'm reading the sample... and sorry to ask more but...do you have a documentation going with the code please ? 
I'm not sure to understand every line in the code and what I should modify/implement to make my own driver.

And if this is for io-pkt...I assume this code is for Qnx 6.5.0 ?

Again thanks for your help and thanks in advance for any further help !

Regards,

Paul
Re: Writing a network driver  
Here is all we have as far as documentation is concerned. Yes, io-pkt is
6.5.0.

Hugh.

-- 
Hugh Brown
QNX Software Systems Limited
175 Terence Matthews Crescent,
Ottawa. ON. K2M 1W8.
Telephone: 613-591-0931







On 11-09-28 10:34 AM, "Thilloy Paul" <community-noreply@qnx.com> wrote:

>Hi Hugh,
>
>Thanks a lot for your answer !
>I'm reading the sample... and sorry to ask more but...do you have a
>documentation going with the code please ?
>I'm not sure to understand every line in the code and what I should
>modify/implement to make my own driver.
>
>And if this is for io-pkt...I assume this code is for Qnx 6.5.0 ?
>
>Again thanks for your help and thanks in advance for any further help !
>
>Regards,
>
>Paul
>
>
>
>_______________________________________________
>
>Networking Drivers
>http://community.qnx.com/sf/go/post89116
>

Attachment: Text native_drvr.txt 15.51 KB
Re: Writing a network driver  
So the doc covering how to write a native drive mentionned in the Momentics Help (part " Network Drivers" ) : /trunk/lib
/io-pkt/sys/dev_qnx/doc is not available ?
Re: Writing a network driver  
That is what I sent you.

-- 
Hugh Brown
QNX Software Systems Limited
175 Terence Matthews Crescent,
Ottawa. ON. K2M 1W8.
Telephone: 613-591-0931







On 11-09-28 10:49 AM, "Thilloy Paul" <community-noreply@qnx.com> wrote:

>So the doc covering how to write a native drive mentionned in the
>Momentics Help (part " Network Drivers" ) :
>/trunk/lib/io-pkt/sys/dev_qnx/doc is not available ?
>
>
>
>_______________________________________________
>
>Networking Drivers
>http://community.qnx.com/sf/go/post89119
>
Re: Writing a network driver  
Oh ok...Thank you.

I was missleaded in the Momentics Help by : 
A tech note covering how to write a native driver is available in the source tree under /trunk/lib/io-pkt/sys/dev_qnx/
doc. Sample driver code is also available under the /trunk/lib/io-pkt/sys/dev_qnx/sample directory. 

Sorry if I bothered you.

Other question... if I want to compile sam.c in order to make my own .so... I should then compile the whole project ? Do
 you know where I can find the source code ?

Regards,

Paul
Re: Writing a network driver  
Does a "make" from the sample directory not work?

-- 
Hugh Brown
QNX Software Systems Limited
175 Terence Matthews Crescent,
Ottawa. ON. K2M 1W8.
Telephone: 613-591-0931







On 11-09-28 11:16 AM, "Thilloy Paul" <community-noreply@qnx.com> wrote:

>Oh ok...Thank you.
>
>I was missleaded in the Momentics Help by :
>A tech note covering how to write a native driver is available in the
>source tree under /trunk/lib/io-pkt/sys/dev_qnx/doc. Sample driver code
>is also available under the /trunk/lib/io-pkt/sys/dev_qnx/sample
>directory. 
>
>Sorry if I bothered you.
>
>Other question... if I want to compile sam.c in order to make my own
>.so... I should then compile the whole project ? Do you know where I can
>find the source code ?
>
>Regards,
>
>Paul
>
>
>
>_______________________________________________
>
>Networking Drivers
>http://community.qnx.com/sf/go/post89121
>
Re: Writing a network driver  
Actually I have several errors... 

- Momentics cannot find definition of IRUPT_PRIO_DEFAULT ...I searched but nothing so far...
- same problem on ieee80211com
- As well as other functions are marked as not implemented ( IFQ_SET_READY ; if_attach ; ether_ifattach ...)

Re: Writing a network driver  
>>>ieee80211com
Remember, io-pkt is a netBSD stack - not original with QNX.  You will find this definition (an probably others you 
require) in...

http://ftp.riken.jp/NetBSD/NetBSD-release-5-0/src/sys/net80211/

IRUPT_PRIO_DEFAULT is defined as -1.

Re: Writing a network driver  
Look in /usr/include. IRUPT_PRIO_DEFAULT is defined in nw_intr.h. Do a
search for the other missing definitions.

-- 
Hugh Brown
QNX Software Systems Limited
175 Terence Matthews Crescent,
Ottawa. ON. K2M 1W8.
Telephone: 613-591-0931







On 11-09-29 2:06 AM, "Thilloy Paul" <community-noreply@qnx.com> wrote:

>Actually I have several errors...
>
>- Momentics cannot find definition of IRUPT_PRIO_DEFAULT ...I searched
>but nothing so far...
>- same problem on ieee80211com
>- As well as other functions are marked as not implemented (
>IFQ_SET_READY ; if_attach ; ether_ifattach ...)
>
>
>
>
>
>_______________________________________________
>
>Networking Drivers
>http://community.qnx.com/sf/go/post89142
>
Re: Writing a network driver  
I've just started the process of trying to port a driver for a Redpine radio module to QNX, so I've found this thread to
 be very useful. I've been reading thru the guide and comparing it to what's in the sam.c file, and I've come up with 
the first of what will probably be several questions.

At about line 45 of sam.c is the declaration of the sam_syms array of type nw_dll_syms. The comment just before this 
declaration in sam.c says "This is what gets specified in the stack's dl.c". Does this mean I have to add this 
declaration to the dl.c file in the io-pkt source code, and rebuild the io-pkt stack?

Thanks for any clarification you can provide!

Greg Ludewig
Re: Writing a network driver  
No, you don't have to re-compile the io-pkt stack. This entry is used by
io-pkt when it loads you driver as a dll.

-- 
Hugh Brown
QNX Software Systems Limited
1001 Farrar Rd.,
Ottawa. ON. K2K 0B3.
Telephone: 613-591-0931







On 12-02-07 5:12 PM, "Greg Ludewig" <community-noreply@qnx.com> wrote:

>I've just started the process of trying to port a driver for a Redpine
>radio module to QNX, so I've found this thread to be very useful. I've
>been reading thru the guide and comparing it to what's in the sam.c file,
>and I've come up with the first of what will probably be several
>questions.
>
>At about line 45 of sam.c is the declaration of the sam_syms array of
>type nw_dll_syms. The comment just before this declaration in sam.c says
>"This is what gets specified in the stack's dl.c". Does this mean I have
>to add this declaration to the dl.c file in the io-pkt source code, and
>rebuild the io-pkt stack?
>
>Thanks for any clarification you can provide!
>
>Greg Ludewig
>
>
>
>_______________________________________________
>
>Networking Drivers
>http://community.qnx.com/sf/go/post91398
>
Re: Writing a network driver  
OK, thanks. I was hoping it worked something like that.

So, I'm trying to compile the example project (sam.c) and I'm running into a few problems. I've been adding additional 
header files (such as the nw_intr.h as mentioned above) and that takes care of some of them. I had to remove the '#ifdef
 _KERNEL' around the definition of ieee80211com in ieee80211_var.h in order for the compiler to find it. Currently I'm 
stuck on the CFATTACH_DECL code at around line 75 in sam.c. 

CFATTACH_DECL(sam,
	sizeof(struct sam_dev),
	NULL,
	sam_attach,
	sam_detach,
	NULL);

The compiler generates an error that says: 'error: 'sam' undeclared here (not in a function)' as well as a warning about
 implicit declaration of function '__STRING'. I can see that CFATTACH_DECL is defined in the device.h header in usr/
include/io-pkt/sys, and that header is being included, but I can't figure out how to make the error about 'sam' being 
undeclared go away.
Re: Writing a network driver  
You need __STRING; should be in <sys/cdefs.h>.

And you should have _KERNEL defined for a driver
that gets loaded in io-pkt.

Regards,

-seanb

On Wed, Feb 08, 2012 at 02:54:07PM -0500, Greg Ludewig wrote:
> OK, thanks. I was hoping it worked something like that.
> 
> So, I'm trying to compile the example project (sam.c) and I'm running into a few problems. I've been adding additional
 header files (such as the nw_intr.h as mentioned above) and that takes care of some of them. I had to remove the '#
ifdef _KERNEL' around the definition of ieee80211com in ieee80211_var.h in order for the compiler to find it. Currently 
I'm stuck on the CFATTACH_DECL code at around line 75 in sam.c. 
> 
> CFATTACH_DECL(sam,
> 	sizeof(struct sam_dev),
> 	NULL,
> 	sam_attach,
> 	sam_detach,
> 	NULL);
> 
> The compiler generates an error that says: 'error: 'sam' undeclared here (not in a function)' as well as a warning 
about implicit declaration of function '__STRING'. I can see that CFATTACH_DECL is defined in the device.h header in usr
/include/io-pkt/sys, and that header is being included, but I can't figure out how to make the error about 'sam' being 
undeclared go away.
> 
> 
> 
> _______________________________________________
> 
> Networking Drivers
> http://community.qnx.com/sf/go/post91415
> 
Re: Writing a network driver  
You need __STRING; should be in <sys/cdefs.h>.

And you should have _KERNEL defined for a driver
that gets loaded in io-pkt.


-- 
Hugh Brown
QNX Software Systems Limited
1001 Farrar Rd.,
Ottawa. ON. K2K 0B3.
Telephone: 613-591-0931







On 12-02-08 2:54 PM, "Greg Ludewig" <community-noreply@qnx.com> wrote:

>OK, thanks. I was hoping it worked something like that.
>
>So, I'm trying to compile the example project (sam.c) and I'm running
>into a few problems. I've been adding additional header files (such as
>the nw_intr.h as mentioned above) and that takes care of some of them. I
>had to remove the '#ifdef _KERNEL' around the definition of ieee80211com
>in ieee80211_var.h in order for the compiler to find it. Currently I'm
>stuck on the CFATTACH_DECL code at around line 75 in sam.c.
>
>CFATTACH_DECL(sam,
>	sizeof(struct sam_dev),
>	NULL,
>	sam_attach,
>	sam_detach,
>	NULL);
>
>The compiler generates an error that says: 'error: 'sam' undeclared here
>(not in a function)' as well as a warning about implicit declaration of
>function '__STRING'. I can see that CFATTACH_DECL is defined in the
>device.h header in usr/include/io-pkt/sys, and that header is being
>included, but I can't figure out how to make the error about 'sam' being
>undeclared go away.
>
>
>
>_______________________________________________
>
>Networking Drivers
>http://community.qnx.com/sf/go/post91415
>
Re: Writing a network driver  
Again, thanks for the help, I really appreciate it.

I've tried including sys/cdefs.h. I still get the warning about __STRING, and the error about 'sam' being undeclared 
still exists.

I had previously tried adding -D_KERNEL to the command line (by adding it to the Definitions line on the Compiler tab of
 the project properties). When I do this, I get dozens, if not hundreds, of compile errors in system include files, such
 as ieee80211_var.h.

Is this example driver not meant to built in the IDE for QNX 6.5.0?

Also, I have one other question. Around the sam_syms definition I've included below is a #ifdef VARIANT_a. The compiler 
automatically defines VARIANT_a if a set the project to be a static library. But I thought the driver was supposed to be
 a DLL. I assume that means it should be a .so type. Why isn't this a #ifdef VARIANT_so instead?

#ifdef VARIANT_a
#include <io-pkt/nw_dl.h>
/* This is what gets specified in the stack's dl.c */
struct nw_dll_syms sam_syms[] = {
        {"iopkt_drvr_entry", &IOPKT_DRVR_ENTRY_SYM(sam)},
        {NULL, NULL}
};
#endif

Greg
Re: Writing a network driver  
On Thu, Feb 09, 2012 at 01:21:18PM -0500, Greg Ludewig wrote:
> Again, thanks for the help, I really appreciate it.
> 
> I've tried including sys/cdefs.h. I still get the warning about __STRING, and the error about 'sam' being undeclared 
still exists.

It's there.  You'll have to look at the preprocessed file to see
why you're not seeing it.

> 
> I had previously tried adding -D_KERNEL to the command line (by adding it to the Definitions line on the Compiler tab 
of the project properties). When I do this, I get dozens, if not hundreds, of compile errors in system include files, 
such as ieee80211_var.h.
> 
> Is this example driver not meant to built in the IDE for QNX 6.5.0?
> 
> Also, I have one other question. Around the sam_syms definition I've included below is a #ifdef VARIANT_a. The 
compiler automatically defines VARIANT_a if a set the project to be a static library. But I thought the driver was 
supposed to be a DLL. I assume that means it should be a .so type. Why isn't this a #ifdef VARIANT_so instead?

Don't use a static library project.

> 
> #ifdef VARIANT_a
> #include <io-pkt/nw_dl.h>
> /* This is what gets specified in the stack's dl.c */
> struct nw_dll_syms sam_syms[] = {
>         {"iopkt_drvr_entry", &IOPKT_DRVR_ENTRY_SYM(sam)},
>         {NULL, NULL}
> };
> #endif
> 
> Greg
> 
> 
> 
> _______________________________________________
> 
> Networking Drivers
> http://community.qnx.com/sf/go/post91444
> 
Re: Writing a network driver  
See the comments in-line.

-- 
Hugh Brown
QNX Software Systems Limited
1001 Farrar Rd.,
Ottawa. ON. K2K 0B3.
Telephone: 613-591-0931







On 12-02-09 1:21 PM, "Greg Ludewig" <community-noreply@qnx.com> wrote:

>Again, thanks for the help, I really appreciate it.
>
>I've tried including sys/cdefs.h. I still get the warning about __STRING,
>and the error about 'sam' being undeclared still exists.

HB: It's there.  You'll have to look at the preprocessed file to see why
you're not seeing it.

>
>I had previously tried adding -D_KERNEL to the command line (by adding it
>to the Definitions line on the Compiler tab of the project properties).
>When I do this, I get dozens, if not hundreds, of compile errors in
>system include files, such as ieee80211_var.h.
>
>Is this example driver not meant to built in the IDE for QNX 6.5.0?
>
>Also, I have one other question. Around the sam_syms definition I've
>included below is a #ifdef VARIANT_a. The compiler automatically defines
>VARIANT_a if a set the project to be a static library. But I thought the
>driver was supposed to be a DLL. I assume that means it should be a .so
>type. Why isn't this a #ifdef VARIANT_so instead?

HB: Don't use a static library project.


>#ifdef VARIANT_a
>#include <io-pkt/nw_dl.h>
>/* This is what gets specified in the stack's dl.c */
>struct nw_dll_syms sam_syms[] = {
>        {"iopkt_drvr_entry", &IOPKT_DRVR_ENTRY_SYM(sam)},
>        {NULL, NULL}
>};
>#endif
>
>Greg
>
>
>
>_______________________________________________
>
>Networking Drivers
>http://community.qnx.com/sf/go/post91444
>
Re: Writing a network driver  
Thanks again for all the help on this. 

I've managed to get sam.c to compile, although I had to pull some definitions out of system include files and put them 
in a separate file to make it work. Like I said before, if I define _KERNEL, I get lots of compile errors. Do you have 
any idea what I'm doing wrong that's causing this? If I collect the definitions I need in a separate file, I get around 
the errors, but I am wondering if there are any other flags I should have defined (such as QNXNTO or ALTQ, for example) 
for a network driver.

I also have another basic question. The driver I'm trying to port is a Linux driver, and it references the Linux 
net_device struct alot. I'm assuming the closest thing to the Linux net_device struct in QNX is the device struct in the
 io-pkt/sys/device.h include file. Does anyone know if that's the correct structure I should be using?
Re: Writing a network driver  
On Mon, Feb 20, 2012 at 03:23:29PM -0500, Greg Ludewig wrote:
> Thanks again for all the help on this. 
> 
> I've managed to get sam.c to compile, although I had to pull some definitions out of system include files and put them
 in a separate file to make it work. Like I said before, if I define _KERNEL, I get lots of compile errors. Do you have 
any idea what I'm doing wrong that's causing this? If I collect the definitions I need in a separate file, I get around 
the errors, but I am wondering if there are any other flags I should have defined (such as QNXNTO or ALTQ, for example) 
for a network driver.


If you have the source presumably you have the makefiles?
A straight 'make' should build it; otherwise, this works
for me on 6.5

# qcc -shared -Wl,-Bsymbolic -o devnp-sample.so -I /usr/include/io-pkt/ -D_KERNEL sam.c

> 
> I also have another basic question. The driver I'm trying to port is a Linux driver, and it references the Linux 
net_device struct alot. I'm assuming the closest thing to the Linux net_device struct in QNX is the device struct in the
 io-pkt/sys/device.h include file. Does anyone know if that's the correct structure I should be using?

No idea on that one.  Try starting with a BSD based driver
if possible.

Regards,

-seanb
Re: Writing a network driver  
Please see comments below.

-- 
Hugh Brown
QNX Software Systems Limited
1001 Farrar Rd.,
Ottawa. ON. K2K 0B3.
Telephone: 613-591-0931




On 12-02-20 3:23 PM, "Greg Ludewig" <community-noreply@qnx.com> wrote:

>Thanks again for all the help on this.
>
>I've managed to get sam.c to compile, although I had to pull some
>definitions out of system include files and put them in a separate file
>to make it work. Like I said before, if I define _KERNEL, I get lots of
>compile errors. Do you have any idea what I'm doing wrong that's causing
>this? If I collect the definitions I need in a separate file, I get
>around the errors, but I am wondering if there are any other flags I
>should have defined (such as QNXNTO or ALTQ, for example) for a network
>driver.

If you have the source presumably you have the makefiles?
A straight 'make' should build it; otherwise, this works
for me on 6.5

# qcc -shared -Wl,-Bsymbolic -o devnp-sample.so -I /usr/include/io-pkt/
-D_KERNEL sam.c

>
>I also have another basic question. The driver I'm trying to port is a
>Linux driver, and it references the Linux net_device struct alot. I'm
>assuming the closest thing to the Linux net_device struct in QNX is the
>device struct in the io-pkt/sys/device.h include file. Does anyone know
>if that's the correct structure I should be using?

No idea on that one.  Try starting with a BSD based driver
if possible.


_______________________________________________

Networking Drivers
http://community.qnx.com/sf/go/post91676

Re: Writing a network driver  
If I unzip the tar file and then do a 'make' I get the following error:

C:\QNXDriver\sample>make
make -j 1 -Carm -fMakefile
make[1]: Entering directory 'C:/QNXDriver/sample/arm'
make -j 1 -Cdll.le -fMakefile
make[2]: Entering directory 'C:/QNXDriver/sample/arm/dll.le' 
../../common.mk:18: C:/QNXDriver/prodroot_pkt.mk: No such file or directory
make[2]: *** No rule to make target 'C:/QNXDriver/prodroot_pkt.mk'. Stop.
make[2]: Leaving directory 'C:/QNXDriver/sample/arm/dll.le'
make[1]: *** [all] Error 2
make[1]: Leaving directory 'C:/QNXDriver/sample/arm'
make *** [all] Error 2

If I call qcc directly using the command line you suggest, I get lots of errors in system include files, which is the 
same thing I get if I try to build in the IDE with _KERNEL defined.

Like I said, if I copy all of the defines I need from the system headers into a separate file, I can get it to compile 
without defining _KERNEL. Do you know if there are other things that don't get included if I don't define _KERNEL that 
will result in the driver not working?

Unfortunately, there is no NetBSD based driver for the radio module we're using that I can start my port from.

Thanks again.

Greg
Re: Writing a network driver  
Unfortunately, I don't know what tar file you were given.
Attached is your missing prodroot_pkt.mk.  Not sure if you'll
see other issues.

Regards,

-seanb

On Thu, Feb 23, 2012 at 10:30:58AM -0500, Greg Ludewig wrote:
> If I unzip the tar file and then do a 'make' I get the following error:
> 
> C:\QNXDriver\sample>make
> make -j 1 -Carm -fMakefile
> make[1]: Entering directory 'C:/QNXDriver/sample/arm'
> make -j 1 -Cdll.le -fMakefile
> make[2]: Entering directory 'C:/QNXDriver/sample/arm/dll.le' 
> ../../common.mk:18: C:/QNXDriver/prodroot_pkt.mk: No such file or directory
> make[2]: *** No rule to make target 'C:/QNXDriver/prodroot_pkt.mk'. Stop.
> make[2]: Leaving directory 'C:/QNXDriver/sample/arm/dll.le'
> make[1]: *** [all] Error 2
> make[1]: Leaving directory 'C:/QNXDriver/sample/arm'
> make *** [all] Error 2
> 
> If I call qcc directly using the command line you suggest, I get lots of errors in system include files, which is the 
same thing I get if I try to build in the IDE with _KERNEL defined.
> 
> Like I said, if I copy all of the defines I need from the system headers into a separate file, I can get it to compile
 without defining _KERNEL. Do you know if there are other things that don't get included if I don't define _KERNEL that 
will result in the driver not working?
> 
> Unfortunately, there is no NetBSD based driver for the radio module we're using that I can start my port from.
> 
> Thanks again.
> 
> Greg
> 
> 
> 
> _______________________________________________
> 
> Networking Drivers
> http://community.qnx.com/sf/go/post91734
> 
Attachment: Text prodroot_pkt.mk 704 bytes
Re: Writing a network driver  
Have you tried the following link?

http://www.qnx.com/download/feature.html?programid=9404

-- 
Hugh Brown
QNX Software Systems Limited
1001 Farrar Rd.,
Ottawa. ON. K2K 0B3.
Telephone: 613-591-0931







On 12-02-23 10:30 AM, "Greg Ludewig" <community-noreply@qnx.com> wrote:

>If I unzip the tar file and then do a 'make' I get the following error:
>
>C:\QNXDriver\sample>make
>make -j 1 -Carm -fMakefile
>make[1]: Entering directory 'C:/QNXDriver/sample/arm'
>make -j 1 -Cdll.le -fMakefile
>make[2]: Entering directory 'C:/QNXDriver/sample/arm/dll.le'
>../../common.mk:18: C:/QNXDriver/prodroot_pkt.mk: No such file or
>directory
>make[2]: *** No rule to make target 'C:/QNXDriver/prodroot_pkt.mk'. Stop.
>make[2]: Leaving directory 'C:/QNXDriver/sample/arm/dll.le'
>make[1]: *** [all] Error 2
>make[1]: Leaving directory 'C:/QNXDriver/sample/arm'
>make *** [all] Error 2
>
>If I call qcc directly using the command line you suggest, I get lots of
>errors in system include files, which is the same thing I get if I try to
>build in the IDE with _KERNEL defined.
>
>Like I said, if I copy all of the defines I need from the system headers
>into a separate file, I can get it to compile without defining _KERNEL.
>Do you know if there are other things that don't get included if I don't
>define _KERNEL that will result in the driver not working?
>
>Unfortunately, there is no NetBSD based driver for the radio module we're
>using that I can start my port from.
>
>Thanks again.
>
>Greg
>
>
>
>_______________________________________________
>
>Networking Drivers
>http://community.qnx.com/sf/go/post91734
>