Ticket #6820: wide-dhcpv6.patch

File wide-dhcpv6.patch, 18.1 KB (added by Andrew Byrne <openwrt@…>, 6 years ago)

patch to convert package

  • wide-dhcpv6/files/dhcp6c-state

     
     1#!/bin/sh 
     2 
     3. /etc/functions.sh 
     4 
     5uci_revert_state dhcp6c state 
     6uci_set_state dhcp6c state "" dhcp6c_state 
     7uci_set_state dhcp6c state domain_name_servers "$new_domain_name_servers" 
     8uci_set_state dhcp6c state domain_name "$domain_name"                     
     9uci_set_state dhcp6c state ntp_servers "$ntp_servers"                     
     10uci_set_state dhcp6c state sip_server_address "$sip_server_address"       
     11uci_set_state dhcp6c state sip_domain_name "$sip_domain_name"             
     12uci_set_state dhcp6c state nis_server_address "$nis_server_address"       
     13uci_set_state dhcp6c state nis_domain_name "$nis_domain_name"             
     14uci_set_state dhcp6c state nisp_server_address "$nisp_server_address"     
     15uci_set_state dhcp6c state nisp_domain_name "$nisp_domain_name"           
     16uci_set_state dhcp6c state bcmcs_server_address "$bcmcs_server_address"   
     17uci_set_state dhcp6c state bcmcs_domain_name "$bcmcs_domain_name" 
     18 
  • wide-dhcpv6/files/dhcp6c-radvd.hotplug

     
     1#!/bin/sh 
     2 
     3[ -f /etc/config/radvd ] && /etc/init.d/radvd restart 
  • wide-dhcpv6/files/dhcp6c.hotplug

     
     1#!/bin/sh 
     2 
     3include /lib/network 
     4 
     5config_load "dhcp6c" 
     6 
     7local enabled 
     8config_get_bool enabled basic enabled 0 
     9[ $enabled -eq 0 ] && return 0 
     10 
     11local client_interface 
     12config_get client_interface basic interface 
     13 
     14if [ "$INTERFACE" = "$client_interface" ] && [ "$ACTION" = "ifup" ]; then 
     15        /etc/init.d/dhcp6c start 
     16fi 
     17 
     18if [ "$INTERFACE" = "$client_interface" ] && [ "$ACTION" = "ifdown" ]; then 
     19        /etc/init.d/dhcp6c stop 
     20fi 
  • wide-dhcpv6/files/dhcp6s.hotplug

     
     1#!/bin/sh 
     2 
     3include /lib/network 
     4 
     5config_load "dhcp6s" 
     6 
     7local enabled 
     8config_get_bool enabled basic enabled 0 
     9[ $enabled -eq 0 ] && return 0 
     10 
     11local server_interface 
     12config_get server_interface basic interface 
     13 
     14if [ "$INTERFACE" = "$server_interface" ] && [ "$ACTION" = "ifup" ]; then 
     15        /etc/init.d/dhcp6s start 
     16fi 
     17 
     18if [ "$INTERFACE" = "$server_interface" ] && [ "$ACTION" = "ifdown" ]; then 
     19        /etc/init.d/dhcp6s stop 
     20fi 
  • wide-dhcpv6/files/dhcp6c.init

     
     1#!/bin/sh /etc/rc.common  
     2 
     3DHCP6C_REQUEST_OPTIONS='domain_name_servers domain_name ntp_servers sip_server_address sip_domain_name nis_server_address nis_domain_name nisp_server_address nisp_domain_name bcmcs_server_address bcmcs_domain_name' 
     4 
     5get_ifname() { 
     6        local interface=$1 
     7        local ifname 
     8        scan_interfaces 
     9        config_get ifname "$interface" ifname 
     10        printf '%s\n' "$ifname" 
     11        return 0 
     12} 
     13 
     14dhcp6c_write_interface() { 
     15        local cfg=$1 
     16        local sla_id 
     17        local sla_len 
     18        local enabled 
     19         
     20        config_get_bool enabled "$cfg" enabled 0 
     21          
     22        if [ $enabled -ne 0 ]; then 
     23         
     24                config_get sla_id "$cfg" sla_id 
     25                config_get sla_len "$cfg" sla_len 
     26 
     27                printf '\tprefix-interface %s {\n' "$(get_ifname $cfg)" 
     28                printf '\t\tsla-id %s;\n' "$sla_id" 
     29                printf '\t\tsla-len %s;\n' "$sla_len" 
     30                printf '\t};\n' 
     31         
     32        fi 
     33         
     34} 
     35 
     36dhcp6c_write_request() { 
     37        printf '\trequest %s;\n' $1 | sed -e s/_/-/g 
     38} 
     39 
     40dhcp6c_write_config() { 
     41 
     42        local pd 
     43        local na 
     44        config_get_bool pd basic pd 0 
     45        config_get_bool na basic na 0 
     46         
     47        printf 'interface %s {\n' "$client_ifname" 
     48         
     49        if [ $pd -ne 0 ]; then 
     50                printf '\tsend ia-pd 0;\n' 
     51        fi 
     52         
     53        if [ $na -ne 0 ]; then 
     54                printf '\tsend ia-na 0;\n' 
     55        fi 
     56         
     57        local rapid_commit 
     58        config_get_bool rapid_commit basic rapid_commit 0 
     59        [ $rapid_commit -ne 0 ] && printf '\tsend rapid-commit;\n' 
     60         
     61        local script 
     62        config_get script basic script 
     63        [ "$script" != "" ] && printf '\tscript "%s";\n' "$script" 
     64         
     65        local request 
     66        local value 
     67        for request in $DHCP6C_REQUEST_OPTIONS; do 
     68                config_get_bool value basic "$request" 0 
     69                [ $value -ne 0 ] && dhcp6c_write_request "$request" 
     70        done 
     71 
     72        printf '};\n\n' 
     73         
     74        if [ $pd -ne 0 ]; then 
     75                printf 'id-assoc pd 0 {\n' 
     76                config_foreach dhcp6c_write_interface interface 
     77                printf '};\n\n' 
     78        fi 
     79         
     80        if [ $na -ne 0 ]; then 
     81                printf 'id-assoc na 0 {\n' 
     82                printf '};\n\n' 
     83        fi 
     84         
     85        return 0 
     86} 
     87 
     88start() { 
     89 
     90        [ ! -e /etc/dhcp6cctlkey ] && `dd if=/dev/urandom count=1 2> /dev/null | md5sum | cut -d" " -f1 > /etc/dhcp6cctlkey` 
     91 
     92        [ -e /var/run/dhcp6c.pid ] && return 0 
     93 
     94        include /lib/network 
     95 
     96        config_load "dhcp6c" 
     97         
     98        local enabled 
     99        config_get_bool enabled basic enabled 0 
     100        [ $enabled -eq 0 ] && return 0 
     101         
     102        logger starting dhcp6c 
     103         
     104        local client_interface 
     105        config_get client_interface basic interface 
     106        local client_ifname=$(get_ifname "$client_interface") 
     107         
     108        local config_file="/var/etc/dhcp6c.conf" 
     109        mkdir -m 755 -p /var/etc 
     110        dhcp6c_write_config > $config_file 
     111         
     112        /usr/sbin/dhcp6c -c $config_file $client_ifname 
     113         
     114        sleep 3 
     115        ACTION=start /sbin/hotplug-call dhcp6c 
     116         
     117        return 0 
     118         
     119} 
     120 
     121stop() { 
     122 
     123        logger stopping dhcp6c 
     124        rm -f /var/etc/dhcp6c.conf 
     125        kill -TERM `cat /var/run/dhcp6c.pid` 
     126        ACTION=stop /sbin/hotplug-call dhcp6c 
     127        return 0 
     128         
     129} 
     130 
     131 
  • wide-dhcpv6/files/dhcp6s.init

     
     1#!/bin/sh /etc/rc.common  
     2 
     3get_ifname() { 
     4        local interface=$1 
     5        local ifname 
     6        scan_interfaces 
     7        config_get ifname "$interface" ifname 
     8        printf '%s\n' "$ifname" 
     9        return 0 
     10} 
     11 
     12start() { 
     13 
     14        [ ! -e /etc/dhcp6sctlkey ] && `dd if=/dev/urandom count=1 2> /dev/null | md5sum | cut -d" " -f1 > /etc/dhcp6sctlkey` 
     15 
     16        [ -e /var/run/dhcp6s.pid ] && return 0 
     17 
     18        include /lib/network 
     19 
     20        config_load "dhcp6s" 
     21         
     22        local enabled 
     23        config_get_bool enabled basic enabled 0 
     24        [ $enabled -eq 0 ] && return 0 
     25         
     26        logger starting dhcp6s 
     27         
     28        local server_interface  
     29        config_get server_interface basic interface 
     30        local server_ifname=$(get_ifname "$server_interface") 
     31         
     32        local config_file 
     33        config_get config_file basic config_file 
     34 
     35        [ ! -e $config_file ] && return 1 
     36         
     37        /usr/sbin/dhcp6s -c $config_file $server_ifname 
     38         
     39        return 0 
     40         
     41} 
     42 
     43stop() { 
     44 
     45        logger stopping dhcp6s 
     46        kill -TERM `cat /var/run/dhcp6s.pid` 
     47        return 0 
     48         
     49} 
     50 
  • wide-dhcpv6/files/dhcp6c.config

     
    1 # The followings are a sample configuration for requiring the "stateless" 
    2 # DHCPv6 service. 
    3 # interface eth0 { 
    4 #       information-only; 
    5 #}; 
    6  
    7  
    8 # The followings are a sample configuration to be delegated an IPv6 prefix 
    9 # from an upstream service provider.  With this configuration dhcp6c will 
    10 # send solicit messages containing an IA_PD option, with an IAID 0, on to 
    11 # an upstream PPP link, ppp0.  After receiving some prefixes from a server, 
    12 # dhcp6c will then configure derived IPv6 prefixes with the SLA ID 1 on a 
    13 # local ethernet interface, ne0.  Note that the IAID for the id-assoc 
    14 # statement is 0 according to the default. 
    15  
    16 interface ppp1 { 
    17         send ia-pd 0; 
    18 }; 
    19  
    20 id-assoc pd { 
    21         prefix-interface lan0 { 
    22                 sla-id 1; 
    23                                 sla-len 8; 
    24         }; 
    25 }; 
  • wide-dhcpv6/files/dhcp6c.conf

     
     1config 'dhcp6c' 'basic' 
     2        option 'enabled' '0'                            # 1 = enabled; 0 = disabled 
     3        option 'interface' 'wan'                        # This is the interface the DHCPv6 client will run on 
     4        option 'dns' 'dnsmasq'                          # Which DNS server you run (only dnsmasq currently supported) 
     5         
     6        # Send options (1 = send; 0 = do not send) 
     7        option 'pd' '1'                                 # Prefix Delegation 
     8        option 'na' '0'                                 # Non-Temporary Address 
     9        option 'rapid_commit' '1'                       # Rapid Commit 
     10         
     11        # Request options (1 = request; 0 = do not request) 
     12        option 'domain_name_servers' '1' 
     13        option 'domain_name' '0' 
     14        option 'ntp_servers' '0' 
     15        option 'sip_server_address' '0' 
     16        option 'sip_domain_name' '0' 
     17        option 'nis_server_address' '0' 
     18        option 'nis_domain_name' '0' 
     19        option 'nisp_server_address' '0' 
     20        option 'nisp_domain_name' '0' 
     21        option 'bcmcs_server_address' '0' 
     22        option 'bcmcs_domain_name' '0' 
     23         
     24        # Script to run when a reply is received 
     25        option 'script' '/usr/bin/dhcp6c-state' 
     26 
     27# Define one or more interfaces on which prefixes should be assigned 
     28config 'interface' 'loopback' 
     29        option 'enabled' '1'                            # 1 = enabled; 0 = disabled 
     30        option 'sla_id' '0'                             # Site level aggregator identifier specified in decimal (subnet) 
     31        option 'sla_len' '4'                            # Site level aggregator length (64 - size of prefix being delegated) 
     32                                                        # e.g. /60 from ISP -> 64 - 60 = 4 
     33 
     34config 'interface' 'lan' 
     35        option 'enabled' '1' 
     36        option 'sla_id' '1' 
     37        option 'sla_len' '4' 
  • wide-dhcpv6/files/dhcp6s.conf

     
     1config 'dhcp6s' 'basic' 
     2        option 'enabled' '0'                            # 1 = enabled; 0 = disabled 
     3        option 'interface' 'lan'                        # This is the interface the DHCPv6 server will run on 
     4        option 'config_file' '/etc/dhcp6s.conf'         # Config file (as this UCI config doesn't fully support all options) 
  • wide-dhcpv6/files/dhcp6c-dnsmasq.hotplug

     
     1#!/bin/sh 
     2 
     3. /etc/functions.sh 
     4 
     5getoption() { 
     6        local cfg=$1 
     7        config_get resolvfile "$cfg" resolvfile 
     8} 
     9 
     10config_load dhcp6c 
     11 
     12local dns  
     13config_get dns basic dns none 
     14[ $dns != "dnsmasq" ] && return 0 
     15 
     16if [ "$ACTION" = "start" ]; then 
     17 
     18        local domain_name_servers 
     19        config_get domain_name_servers state domain_name_servers 
     20 
     21        if [ -n "$domain_name_servers" ]; then 
     22 
     23                config_load dhcp 
     24         
     25                local resolvfile 
     26                config_foreach getoption dnsmasq 
     27 
     28                if [ -n "$resolvfile" ]; then 
     29 
     30                        cp -pf $resolvfile "$resolvfile.dhcp6c_backup" 
     31         
     32                        for nameserver in $domain_name_servers; do 
     33                                echo nameserver $nameserver >> $resolvfile 
     34                        done 
     35 
     36                fi 
     37         
     38        fi 
     39 
     40fi 
     41 
     42if [ "$ACTION" = "stop" ]; then 
     43 
     44        config_load dhcp 
     45 
     46        local resolvfile 
     47        config_foreach getoption dnsmasq 
     48        if [ -f "$resolvfile.dhcp6c_backup" ]; then 
     49                mv -f "$resolvfile.dhcp6c_backup" $resolvfile 
     50        fi  
     51 
     52fi 
     53 
  • wide-dhcpv6/patches/001-linux_old_compat.patch

     
     1--- wide-dhcpv6-20080615.orig/common.h  2007-03-21 20:52:57.000000000 +1100 
     2+++ wide-dhcpv6-20080615/common.h       2009-11-29 16:00:02.000000000 +1100 
     3@@ -187,3 +187,34 @@ 
     4 #ifndef HAVE_STRLCPY 
     5 extern size_t strlcpy __P((char *, const char *, size_t)); 
     6 #endif 
     7+ 
     8+/* 
     9+ * compat hacks in case libc and kernel get out of sync: 
     10+ * 
     11+ * glibc 2.4 and uClibc 0.9.29 introduce IPV6_RECVPKTINFO etc. and change IPV6_PKTINFO 
     12+ * This is only supported in Linux kernel >= 2.6.14 
     13+ * 
     14+ * This is only an approximation because the kernel version that libc was compiled against 
     15+ * could be older or newer than the one being run.  But this should not be a problem -- 
     16+ * we just keep using the old kernel interface. 
     17+ * 
     18+ * these are placed here because they're needed in all of socket.c, recv.c and send.c 
     19+ */ 
     20+#ifdef __linux__ 
     21+#  if defined IPV6_RECVHOPLIMIT || defined IPV6_RECVPKTINFO 
     22+#    include <linux/version.h> 
     23+#    if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) 
     24+#      if defined IPV6_RECVHOPLIMIT && defined IPV6_2292HOPLIMIT 
     25+#        undef IPV6_RECVHOPLIMIT 
     26+#        define IPV6_RECVHOPLIMIT IPV6_2292HOPLIMIT 
     27+#      endif 
     28+#      if defined IPV6_RECVPKTINFO && defined IPV6_2292PKTINFO 
     29+#        undef IPV6_RECVPKTINFO 
     30+#        undef IPV6_PKTINFO 
     31+#        define IPV6_RECVPKTINFO IPV6_2292PKTINFO 
     32+#        define IPV6_PKTINFO IPV6_2292PKTINFO 
     33+#      endif 
     34+#    endif 
     35+#  endif 
     36+#endif 
     37+ 
  • wide-dhcpv6/Makefile

     
    1 # 
    2 # Copyright (C) 2006-2010 OpenWrt.org 
    3 # 
    4 # This is free software, licensed under the GNU General Public License v2. 
    5 # See /LICENSE for more information. 
    6 # 
    71 
    82include $(TOPDIR)/rules.mk 
    93 
    104PKG_NAME:=wide-dhcpv6 
    115PKG_VERSION:=20080615 
    12 PKG_RELEASE:=1 
     6PKG_RELEASE:=3 
    137 
    148PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz 
    159PKG_SOURCE_URL:=@SF/$(PKG_NAME) 
     
    2014define Package/wide-dhcpv6/Default 
    2115  SECTION:=ipv6 
    2216  CATEGORY:=IPv6 
    23   TITLE:=IPv6 DHCPv6 implementaion for BSD and Linux 
    24   URL:=http://wide-dhcpv6.sourceforge.net/ 
     17  TITLE:=WIDE-DHCPv6 
     18  SUBMENU:=wide-dhcpv6 
     19  DEPENDS:=+kmod-ipv6  
     20  URL:=https://sourceforge.net/projects/wide-dhcpv6/ 
    2521endef 
    2622 
    27 define Package/wide-dhcpv6/description 
    28 WIDE-DHCPv6 is an open-source implementation of Dynamic Host Configuration 
    29 Protocol for IPv6 (DHCPv6) originally developed by the KAME project. The 
    30 implementation mainly conforms to the following standards: RFC3315,3319,3633, 
    31 3646,4075,4272,etc. 
     23define Package/wide-dhcpv6-client 
     24  $(call Package/wide-dhcpv6/Default) 
     25  TITLE+= client 
    3226endef 
    3327 
    34 define Package/wide-dhcpv6-client 
    35         $(call Package/wide-dhcpv6/Default) 
    36         TITLE+= client 
     28define Package/wide-dhcpv6-client/description 
     29        WIDE-DHCPv6 is an open-source implementation of Dynamic Host Configuration Protocol 
     30        for IPv6 (DHCPv6) originally developed by the KAME project. The implementation 
     31        mainly conforms to the following standards: RFC3315,3319,3633,3646,4075,4272,etc. 
     32 
     33        This package installs the client component. 
    3734endef 
    3835 
    3936define Package/wide-dhcpv6-server 
    40         $(call Package/wide-dhcpv6/Default) 
    41         TITLE+= server 
     37  $(call Package/wide-dhcpv6/Default) 
     38  TITLE+= server 
    4239endef 
    4340 
     41define Package/wide-dhcpv6-server/description 
     42        WIDE-DHCPv6 is an open-source implementation of Dynamic Host Configuration Protocol 
     43        for IPv6 (DHCPv6) originally developed by the KAME project. The implementation 
     44        mainly conforms to the following standards: RFC3315,3319,3633,3646,4075,4272,etc. 
     45 
     46        This package installs the server component. 
     47endef 
     48 
    4449define Package/wide-dhcpv6-relay 
    45         $(call Package/wide-dhcpv6/Default) 
    46         TITLE+= relay 
     50  $(call Package/wide-dhcpv6/Default) 
     51  TITLE+= relay 
    4752endef 
    4853 
    49 define Package/wide-dhcpv6-ctl 
    50         $(call Package/wide-dhcpv6/Default) 
    51         TITLE+= ctl 
     54define Package/wide-dhcpv6-relay/description 
     55        WIDE-DHCPv6 is an open-source implementation of Dynamic Host Configuration Protocol 
     56        for IPv6 (DHCPv6) originally developed by the KAME project. The implementation 
     57        mainly conforms to the following standards: RFC3315,3319,3633,3646,4075,4272,etc. 
     58 
     59        This package installs the relay component. 
    5260endef 
    5361 
     62define Package/wide-dhcpv6-control 
     63  $(call Package/wide-dhcpv6/Default) 
     64  TITLE+= client and server control utility 
     65endef 
     66 
     67define Package/wide-dhcpv6-control/description 
     68        WIDE-DHCPv6 is an open-source implementation of Dynamic Host Configuration Protocol 
     69        for IPv6 (DHCPv6) originally developed by the KAME project. The implementation 
     70        mainly conforms to the following standards: RFC3315,3319,3633,3646,4075,4272,etc. 
     71 
     72        This package installs the client and server control utility. 
     73endef 
     74 
     75define Build/Configure 
     76        $(call Build/Configure/Default,--with-localdbdir=/var) 
     77endef 
     78 
     79define Build/Compile     
     80        $(MAKE) -C $(PKG_BUILD_DIR) \ 
     81                DESTDIR="$(PKG_INSTALL_DIR)" \ 
     82                all  
     83endef 
     84 
     85define Package/wide-dhcpv6-client/conffiles 
     86/etc/config/dhcp6c 
     87endef 
     88 
    5489define Package/wide-dhcpv6-client/install 
    55         $(INSTALL_DIR) $(1)/sbin 
    56         $(INSTALL_BIN) $(PKG_BUILD_DIR)/dhcp6c $(1)/sbin 
     90        $(INSTALL_DIR) $(1)/usr/sbin 
     91        $(INSTALL_BIN) $(PKG_BUILD_DIR)/dhcp6c $(1)/usr/sbin 
     92        $(INSTALL_DIR) $(1)/etc/config 
     93        $(INSTALL_CONF) ./files/dhcp6c.conf $(1)/etc/config/dhcp6c 
     94        $(INSTALL_DIR) $(1)/etc/init.d 
     95        $(INSTALL_BIN) ./files/dhcp6c.init $(1)/etc/init.d/dhcp6c 
     96        $(INSTALL_DIR) $(1)/etc/hotplug.d/iface 
     97        $(INSTALL_DATA) ./files/dhcp6c.hotplug $(1)/etc/hotplug.d/iface/40-dhcp6c        
     98        $(INSTALL_DIR) $(1)/etc/hotplug.d/dhcp6c 
     99        $(INSTALL_DATA) ./files/dhcp6c-dnsmasq.hotplug $(1)/etc/hotplug.d/dhcp6c/10-dnsmasq 
     100        $(INSTALL_DATA) ./files/dhcp6c-radvd.hotplug $(1)/etc/hotplug.d/dhcp6c/20-radvd 
     101        $(INSTALL_DIR) $(1)/usr/bin 
     102        $(INSTALL_BIN) ./files/dhcp6c-state $(1)/usr/bin/dhcp6c-state 
     103endef 
    57104 
     105define Package/wide-dhcpv6-server/conffiles 
     106/etc/config/dhcp6s 
     107endef 
     108 
     109define Package/wide-dhcpv6-server/install 
     110        $(INSTALL_DIR) $(1)/usr/sbin 
     111        $(INSTALL_BIN) $(PKG_BUILD_DIR)/dhcp6s $(1)/usr/sbin 
    58112        $(INSTALL_DIR) $(1)/etc 
    59         $(INSTALL_DATA) ./files/dhcp6c.config $(1)/etc/dhcp6c.conf 
     113        $(INSTALL_CONF) $(PKG_BUILD_DIR)/dhcp6s.conf.sample $(1)/etc 
     114        $(INSTALL_DIR) $(1)/etc/config 
     115        $(INSTALL_CONF) ./files/dhcp6s.conf $(1)/etc/config/dhcp6s 
     116        $(INSTALL_DIR) $(1)/etc/init.d 
     117        $(INSTALL_BIN) ./files/dhcp6s.init $(1)/etc/init.d/dhcp6s 
     118        $(INSTALL_DIR) $(1)/etc/hotplug.d/iface 
     119        $(INSTALL_DATA) ./files/dhcp6s.hotplug $(1)/etc/hotplug.d/iface/50-dhcp6s        
    60120endef 
    61121 
     122define Package/wide-dhcpv6-relay/install 
     123        $(INSTALL_DIR) $(1)/usr/sbin 
     124        $(INSTALL_BIN) $(PKG_BUILD_DIR)/dhcp6relay $(1)/usr/sbin 
     125endef 
     126 
     127define Package/wide-dhcpv6-control/install 
     128        $(INSTALL_DIR) $(1)/usr/sbin 
     129        $(INSTALL_BIN) $(PKG_BUILD_DIR)/dhcp6ctl $(1)/usr/sbin 
     130endef 
     131 
    62132$(eval $(call BuildPackage,wide-dhcpv6-client)) 
    63133$(eval $(call BuildPackage,wide-dhcpv6-server)) 
    64134$(eval $(call BuildPackage,wide-dhcpv6-relay)) 
    65 $(eval $(call BuildPackage,wide-dhcpv6-ctl)) 
     135$(eval $(call BuildPackage,wide-dhcpv6-control))