Hi,

“

*Acknowledge on "Client moves".*  *The 'releases IP' is probably*

*something like "I'm unaware that IP stands for Internet Protocol*

*and want to try how far I can get by being vague how the release*

*of the DHCP lease was done"*

—>

Client is executing “dhclient -4 eth1 -r” to release the IP address.





*The issue of moving clients,*

*the issue of interfaces go down and come up,*

*the issue of moving clients AND flipping interfaces?*

—>

There is no flapping of the interfaces, interfaces are not going down and
comping up. Need to have at least one interface in DOWN state with dhcpv4
pool address range defined for it, to reproduce the issue.



The steps to reproduce the issue are as follows:

1) Have one client, 3 dhcp pools for 3 vlans or interfaces as shown below.
Out of these 3 interfaces, need to keep one interface in DOWN state, and
move the client across the other two UP interfaces, to reproduce the issue.

vlan9 (State UP) : Range: 192.168.9.10-192.168.9.254

vlan19 (State UP): Range: 192.168.19.10-192.168.19.254

vlan99 (State DOWN): Range: 192.168.99.10-192.168.99.254



2) Put the client on vlan9. Client gets IP from vlan9 pool (e.g.
192.168.9.10) by executing “dhclient -4 eth1”.



3) Put the same client on vlan19. Client releases previously acquired IP
(e.g. 192.168.9.10) by executing “dhclient -4 eth1 -r”.



4) The same client tries to get the IP by executing “dhclient -4 eth1”.

Here client should get IP address from 192.168.19.xx pool, but it gets from
192.168.99.xx pool.



5) In case if the issue is not seen at step 4, then need to move the client
across vlan9 and vlan19 couple of times, where client will release the
previously acquired IP address on the current vlan and then try to acquire
the IP address on the current vlan.



Looking for your help to root cause the issue.

”





Thanks and Regards,

Shashi

On Tue, Aug 8, 2023 at 11:23 AM Geert Stappers <stapp...@stappers.nl> wrote:

> On Sun, Aug 06, 2023 at 08:00:11PM +0000, Bastian Bittorf wrote:
> > Hello hackers,
> >
> > according to 'man dnsmasq' the var DNSMASQ_INTERFACE stores the name
> > of the interface on which the request arrived; this is not set for "old"
> > actions when dnsmasq restarts.
> >
> > all this in done in src/helper.c:
> > my_setenv("DNSMASQ_INTERFACE", strlen(data.interface) != 0 ?
> data.interface : NULL, &err);
> >
> > With my (up-to-date) OpenWRT setup this seems sometimes not the case.
> > Ontop of my dhcp-script.sh[1] i do (something like):
> >
> >
> > #!/bin/sh
> > MODE="$1"
> > MAC="$2"
> > IP="$3"
> > HOST="$4"
> >
> > if [ -n "$DNSMASQ_INTERFACE" ]; then
> >   log "provided dev: $DNSMASQ_INTERFACE mode: $MODE mac: $MAC ip: $IP
> host: $HOST"
> > else
> >   DEV="$( guess_dev "$IP" )"
> >   log "guessed dev: $DEV mode: $MODE mac: $MAC ip: $IP host: $HOST"
> > fi
> >
> >
> > Here the log output, when env-var DNSMASQ_INTERFACE is empty/unset and
> MODE is arp-add/add(!):
> > There are 2 interesting lines - both from the same client (linux, under
> my control):
> >
> > provided dev: br-mastergate mode: old mac: e4:f8:9c:73:8b:1f ip:
> 100.66.19.131 host: filmforecast
> > guessed dev:  br-mastergate mode: add mac: e4:f8:9c:73:8b:1f ip:
> 100.66.19.131 host: unset
> >
> > root@box:~ logread | grep e4:f8:9c:73:8b:1f
> > Sun Aug  6 21:12:38 2023 daemon.info kalua: /usr/lib/dnsmasq/dhcp-sc:
> dhcp_script() provided dev: br-mastergate mode: old mac: e4:f8:9c:73:8b:1f
> ip: 100.66.19.131 host: filmforecast
>
> Network 19
>
> > Sun Aug  6 21:12:38 2023 daemon.info kalua: /usr/lib/dnsmasq/dhcp-sc:
> dhcp_old() 'e4:f8:9c:73:8b:1f' is from 'br-mastergate' = roaming-DEV HOST:
> filmforecast
> > Sun Aug  6 21:16:01 2023 daemon.info hostapd: phy1-ap0: STA
> e4:f8:9c:73:8b:1f IEEE 802.11: authenticated
> > Sun Aug  6 21:16:01 2023 daemon.info kalua: /usr/sbin/cron.wireless_:
> iwevent() EVENT 6993: 'phy1-ap0: new station e4:f8:9c:73:8b:1f'
> > Sun Aug  6 21:16:01 2023 daemon.info hostapd: phy1-ap0: STA
> e4:f8:9c:73:8b:1f IEEE 802.11: associated (aid 3)
> > Sun Aug  6 21:16:01 2023 daemon.notice hostapd: phy1-ap0:
> AP-STA-CONNECTED e4:f8:9c:73:8b:1f auth_alg=open
>
>
> > Sun Aug  6 21:16:01 2023 daemon.info dnsmasq-dhcp[19331]:
> DHCPREQUEST(br-mastergate) 100.65.42.131 e4:f8:9c:73:8b:1f
> > Sun Aug  6 21:16:01 2023 daemon.info dnsmasq-dhcp[19331]:
> DHCPNAK(br-mastergate) 100.65.42.131 e4:f8:9c:73:8b:1f wrong address
>
> Network 42 DHCPREQUEST  _and_  DHCPNAK
>
>
> > Sun Aug  6 21:16:01 2023 daemon.info kalua: /usr/sbin/cron.wireless_:
> wifi_signal_get() dev: phy1-ap0 mac: e4:f8:9c:73:8b:1f try: 3 signal: -64
> file: ''
> > Sun Aug  6 21:16:01 2023 daemon.info kalua: /usr/sbin/cron.wireless_:
> iwevent() worker(7175) dev:phy1-ap0 ch:5 MODE: new MAC: e4:f8:9c:73:8b:1f -
> signal: '-64' border: '-73' try: 4
>
> > Sun Aug  6 21:16:01 2023 daemon.info kalua: /usr/sbin/cron.wireless_:
> iwevent() mac2ipv4(20) grabbed ip from arp: e4:f8:9c:73:8b:1f ->
> 100.65.42.131
> > Sun Aug  6 21:16:01 2023 daemon.info kalua: /usr/sbin/cron.wireless_:
> iwevent() worker(7175) dev:phy1-ap0 ch:5 MODE: new MAC: e4:f8:9c:73:8b:1f -
> ip: '100.65.42.131' signal: '-64' (is_good)
>
> Network 42
>
>
> > Sun Aug  6 21:16:01 2023 daemon.info dnsmasq-dhcp[19331]:
> DHCPDISCOVER(br-mastergate) 100.65.42.131 e4:f8:9c:73:8b:1f
>
> A  discover, usualy  0.0.0.0,  this time  100.65.42.131    (Note the 42)
>
>
> > Sun Aug  6 21:16:01 2023 daemon.info dnsmasq-dhcp[19331]:
> DHCPOFFER(br-mastergate) 100.66.19.131 e4:f8:9c:73:8b:1f
>
> Note the 19
>
>
> > Sun Aug  6 21:16:01 2023 daemon.info dnsmasq-dhcp[19331]:
> DHCPREQUEST(br-mastergate) 100.66.19.131 e4:f8:9c:73:8b:1f
> > Sun Aug  6 21:16:01 2023 daemon.info dnsmasq-dhcp[19331]:
> DHCPACK(br-mastergate) 100.66.19.131 e4:f8:9c:73:8b:1f filmforecast
>
> > Sun Aug  6 21:16:01 2023 daemon.info kalua: /usr/lib/dnsmasq/dhcp-sc:
> dhcp_script() provided dev: br-mastergate mode: old mac: e4:f8:9c:73:8b:1f
> ip: 100.66.19.131 host: filmforecast
>
> dhcp_script
>
>
> > Sun Aug  6 21:16:01 2023 daemon.info kalua: /usr/lib/dnsmasq/dhcp-sc:
> dhcp_old() 'e4:f8:9c:73:8b:1f' is from 'br-mastergate' = roaming-DEV HOST:
> filmforecast
>
> dhcp_old
>
>
> 70 seconds
>
> > Sun Aug  6 21:17:11 2023 daemon.info kalua: /usr/lib/dnsmasq/dhcp-sc:
> dhcp_script() guessed dev: br-mastergate mode: add mac: e4:f8:9c:73:8b:1f
> ip: 100.66.19.131 host: unset
>
> dhcp_script
>
>
> > Sun Aug  6 21:17:11 2023 daemon.info kalua: /usr/lib/dnsmasq/dhcp-sc:
> dhcp_add() 'e4:f8:9c:73:8b:1f' is from 'br-mastergate' = roaming-DEV HOST:
> unset
>
> dhcp_add
>
>
> > Sun Aug  6 21:17:11 2023 daemon.info kalua: /usr/lib/dnsmasq/dhcp-sc:
> F36-stube_dhcp-add() [OK] _weblogin login_check e4:f8:9c:73:8b:1f
>
> dhcp_F36-stube_dhcp-add
>
>
> >
> > the environment during the "guessed dev" call (without DNSMASQ_INTERFACE
> set)
> > was written ontop of the dhcp-script with:
> > {
> > echo "# $@"
> > set
> > } >>"/tmp/dhcp-$2-$1-$3"
> >
> > root@F36-stube:~ cat /tmp/dhcp-e4:f8:9c:73:8b:1f-arp-add-100.66.19.131
> > # arp-add e4:f8:9c:73:8b:1f 100.66.19.131
> > FUNCNAME=''
> > HOME='/'
> > HOSTNAME='F36-stube'
> > IFS='
> > '
> > LINENO=''
> > OPTIND='1'
> > PATH='/usr/sbin:/usr/bin:/sbin:/bin'
> > PPID='19337'
> > PS1='\w \$ '
> > PS2='> '
> > PS4='+ '
> > PWD='/'
> > SHLVL='1'
> > TERM='linux'
> > USER_DHCPSCRIPT='/etc/dhcp-script.d/10dhcpscript'
> >
> > root@F36-stube:~ dnsmasq --version
> > Dnsmasq version 2.89  Copyright (c) 2000-2022 Simon Kelley
> > ...
> >
> > Maybe somebody has an idea why this can happen, looking through the
> > source it is not obvious and *should not happen* 8-) => except
> 'data.interface' is unknown.
> > This happens on different CPU architectures, at least: mips, arm and
> powerpc.
> >
> > I'am happy to test patches or suggestions.
>
> Suggestion:  Dig deeper
>
>
> > Thanks for your great work & bye,
> > Bastian Bittorf
>
> Groeten
> Geert Stappers
>
> [1]
> #!/bin/sh
> . /tmp/loader
>
> MODE="${1:-unset}"
> MAC="${2:-ff:00:00:00:00:00}"           # FIXME! this enforces an invalid
> mac, see sanitizer_mac()
> IP="${3:-127.0.0.1}"
> HOST="${4:-unset}"
>
> case "$MODE" in
>         arp-add) MODE=add ;;
>         arp-del) MODE=del ;;
>         old) test -e /tmp/CRON_OVERLOAD && exit 0 ;;
> esac
>
> case "$MAC" in
>         '00:00:00:00:00:00')
>                 MODE='cron-watchdog'
>         ;;
>         *'-'*)
>                 _log it dhcp_script daemon info "ignore non-ethernet
> events: $MAC"
>                 exit 0
>         ;;
> esac
>
> if   [ -n "$DNSMASQ_INTERFACE" ]; then
>         # see: man dnsmasq - we get some env vars, debug with 'set
> >/tmp/foo' ontop of this script
>         # DNSMASQ_CLIENT_ID
>         # DNSMASQ_DATA_MISSING
>         # DNSMASQ_DOMAIN
>         # DNSMASQ_INTERFACE => DNSMASQ_INTERFACE stores the name of the
> interface on which the request arrived; this is not set for "old" actions
> when dnsmasq restarts.
>         # DNSMASQ_LEASE_EXPIRES
>         # DNSMASQ_TIME_REMAINING
>
>         export DNSMASQ_INTERFACE                # needed in
> netfilter_user_reachable()
>         DEV="$DNSMASQ_INTERFACE"
>         _log it dhcp_script daemon info "provided dev: $DEV mode: $MODE
> mac: $MAC ip: $IP host: $HOST"
> elif [ -e "$TMPDIR/firmware_burn" ]; then
>         exit 0
> else
>         case "$IP" in fe80::*) exit 0 ;; esac   # ignore IPv6 linklocal,
> ip2dev() does not work here reliable anyway
>
>         #
> https://lists.thekelleys.org.uk/pipermail/dnsmasq-discuss/2023q3/017193.html
>         DEV="$( _net ip2dev $IP )"
>         _log it dhcp_script daemon info "guessed dev: $DEV mode: $MODE
> mac: $MAC ip: $IP host: $HOST"
> fi
>
> case "$DEV" in
>         'br-mastergate')
>                 TYPE='roaming'
>
>                 case "$MODE" in
>                         'add')
>                                 echo "$MAC $IP $DNSMASQ_LEASE_EXPIRES"
> >>"$TMPDIR/roaming_dhcp_worker"
>                                 # recent entries on top ("tac")
>                                 grep -sn '' "$TMPDIR/roaming_dhcp_worker"
> | sort -rn | cut -d: -f2- >"$TMPDIR/roaming_dhcp"
>                         ;;
>                         'del')
>                                 sed -i "/^$MAC/d"
> "$TMPDIR/roaming_dhcp_worker"
>                                 sed -i "/^$MAC/d" "$TMPDIR/roaming_dhcp"
>                         ;;
>                 esac
>         ;;
>         $WANDEV)
>                 TYPE='wan'
>         ;;
>         $LANDEV)
>                 TYPE='lan'
>
>                 case "$MODE" in
>                         'add'|'old')
>                                 bool_true 
> 'system.@monitoring[0].report_lan_dhcp'
> && {
>                                         SHOW_HOST="$HOST"
>                                         [ "$SHOW_HOST" = 'unset' ] &&
> SHOW_HOST="$( _net mac2vendor "$MAC" short )"
>                                         echo >>$SCHEDULER_IMPORTANT "_log
> remote 'lan_dhcp: date: $( date ) CLIENT: mac: $MAC ip: $IP hostname:
> $SHOW_HOST ROUTER: $HOSTNAME'"
>                                 }
>                         ;;
>                 esac
>         ;;
>         $WIFIDEV)
>                 TYPE='wifi'
>         ;;
>         $LODEV)
>                 TYPE='loopback'
>         ;;
>         'by-mybridge'|'gateway0')       # just for better logging
>                 TYPE='batman'
>         ;;
>         *)
>                 TYPE='unknown'
>         ;;
> esac
>
> case "$HOST" in
>         'reanimateV2')
>                 # seed watch_reanimate_dead_neighbour()
>                 MODE='invalid'
>                 _http robotstxt_generate
>         ;;
> esac
>
> if [ "$MODE" = 'old' ]; then
>         _log it dhcp_$MODE daemon info "'$MAC' is from '$DEV' =
> ${TYPE}-DEV HOST: $HOST"
> else
>         _log it dhcp_$MODE daemon info "'$MAC' is from '$DEV' =
> ${TYPE}-DEV HOST: $HOST"
>
>         case "$MODE-$HOST" in
>                 'add-check_if_reachable')
>                         MODE="$HOST"
>                         _log it dhcp_add_check_if_reachable daemon info
> "MAC: $MAC IP: $IP DEV: $DEV"
>                         _netfilter user_add "$MAC" "$IP"
>                 ;;
>         esac
> fi
>
> case "$MODE" in
>         add|old)
>                 bool_true 'system.@weblogin[0].enabled' && {
>                         case "$MODE" in
>                                 'old')
>                                         _netfilter user_probe "$MAC" &&
> exit 0
>                                         # maybe unknown after unscheduled
> reboot, so go further
>                                 ;;
>                                 'add')
>                                         case "$TYPE" in
>                                                 'roaming')
>                                                         echo
> >>$SCHEDULER_IMPORTANT "_net roaming_report_new $MAC $IP
> $DNSMASQ_LEASE_EXPIRES"
>                                                 ;;
>                                         esac
>                                 ;;
>                         esac
>
>                         USER="$MAC"
>                         SIGNAL="${HOSTNAME}_dhcp-${MODE}"
>              # keyword 'dhcp' is important for login_check()
>                         export REMOTE_ADDR="$IP"
>
>                         if _weblogin login_check "$USER" '' "$MAC"
> "$SIGNAL" ; then
>                                 # for "very fast unsplashing" and not
> showing 'please use credentials'
>                                 $IPT -t mangle -I PREROUTING -j ACCEPT
>                                 _log it $SIGNAL daemon info "[OK]
> _weblogin login_check $USER"
>                                 _netfilter user_add "$MAC" "$IP"
>                                 # remove the hack for "very fast
> unsplashing"
>                                 $IPT -t mangle -D PREROUTING -j ACCEPT
>                         else
>                                 if _weblogin login_check "$USER"
> "$HOSTNAME" "$MAC" "$SIGNAL" ; then
>                                         _log it $SIGNAL daemon info "[OK]
> _weblogin login_check $USER/$HOSTNAME (2nd try)"
>                                         _netfilter user_add "$MAC" "$IP"
>                                 else
>                                         _log it $SIGNAL daemon info "[ERR]
> _weblogin login_check $USER/$HOSTNAME"
>                                 fi
>                         fi
>                 }
>
>                 echo >>$SCHEDULER "_netfilter portforwarding_request $IP
> $MAC $HOST"
>         ;;
>         del)
> #               if bool_true 'system.@weblogin[0].dhcpautologout'; then
>                         echo >>$SCHEDULER "_netfilter user_del $MAC
> dhcp_del"
> #               else
> #                       _netfilter set_arp reachable "$MAC" "$IP" "$DEV"
> #               fi
>         ;;
> esac
>
> # wrong place but works:
> [ -e '/etc/crontabs/root' ] && {
>         [ $( _stopwatch stop '/tmp/CRON_LASTCALL' interim,nolog,seconds )
> -gt 900 ] && {
>                 mkdir '/tmp/LOCK_dhcpscript_cron_restart' && {
>                         _stopwatch start '/tmp/CRON_LASTCALL' global
>                         _log it watch_cron daemon alert "cron died,
> restarting"
>                         /etc/init.d/S51crond_fff+ restart
>                         rm -fR '/tmp/LOCK_dhcpscript_cron_restart'
>                 }
>         }
> }
>
> true
> --
> Silence is hard to parse
>
> _______________________________________________
> Dnsmasq-discuss mailing list
> Dnsmasq-discuss@lists.thekelleys.org.uk
> https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss
>
_______________________________________________
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss

Reply via email to