I have successfully made voip call works on Android phone using the built-in SIP client. Router is Mikrotik.
High level Steps:
1. Add a VLAN. I use name "voip", tag it to ID 400.
2. Attach DHCP client to VLAN "voip". Don't use peer DNS, NTP or default route.
3. Once the DHCP client successfully get an address, check the Status and get it's default gateway address.
4. Add a static route with Dst Address 10.225.0.0/16, and put the default gateway address you copied above. Immediate Gateway should show something like this: 10.40.255.254%voip
5.Add a NAT rule. Chain=srcnat. Out Interface=voip. Action=masquerade
6. Add another NAT rule. Chain=dstnat. In Interface=voip. Action=dst-nat. To Addresses=<IP address of your phone>
Step 6 is necessary for RTP packet to reach you. For Cisco IOS, use the following instead:
ip nat service allow-sip-even-rtp-ports
Obviously for Mikrotik you can only use 1 phone. Cisco allow you to use multiple phone with one router configuration.
Android phone overview:
1. I use the Phone app
2. Go to Settings
3. Calling accounts
4. SIP accounts
I set "Send keep-alive" to "Always send"
After that just enable "Receive incoming calls"
Go to "All calling accounts" and enable the voip account.
This is how it works for me previously - using ODI XPON stick. but i route/fwd the VLAN and bridge it to 1 eth port and assigned FreePBX raspberry PI to get the VLAN400 IP.
Now it's not working - seems like VLAN400 is not able to get IP anymore. Torching the sfp1-plus interface I can see that the DHCP server from VLAN400 is sending offer but without tagged VLAN id 400.
Another weird observation - I could get the IP from DHCP after I bridge VLAN400+sfp1-plus+any eth port or i put dhcp client on that new bridge - but it won't be able to route/traffic not working even after static route added.