On Sunday 21 March 2010 17:01, Denys Vlasenko wrote:
> You are using a config file specifically for option 43?
> What will happen when users will eventually want other options?
> 256 config files?
I don't think there are 255 options left to implement, quite a few are already
implemented (option 1 is the sub mask, option 6 is the list of ip addresses of
DNS servers, option 51 is lease time etc...), and very few of those are vendor
defined multiple-strings (see reference below). I agree most of these can be
handled by simple command line parameters, but I think this vendor_specific
option is a little more difficult. That being said, I need to further clarify
you idea for how the command line syntax would look:
> Then create a new option for udhcpc, say -x OPT, which allows
> udhcpc to add _any_ supported_ option_ (not only yours)
> to the emitted packet.
So for my OCAP use case would you expect the command line to look something
like (example 1):
udhcpc -i eth1 -s etc/udhcpc.script -V "OpenCable2.1" -x "OPT 43 SUB 2 ESTB SUB
3 ECM:ESTB SUB 4 $SERIAL_NO SUB 5 HW_VER1.0.0 SUB 6 FW_VER1.0.0 SUB 7
Boot_ROM25.008 SUB 8 001320 SUB 9 MODEL_NO_3100 SUB 10 'VENDOR NAME' SUB 54
0A859B428"
OR would it look like this (example 2):
udhcpc -i eth1 -s etc/udhcpc.script -V "OpenCable2.1" -x "OPT43SUB2 ESTB
OPT43SUB3 ECM:ESTB OPT43SUB4 $SERIAL_NO OPT43SUB5 HW_VER1.0.0 OPT43SUB6
FW_VER1.0.0 OPT43SUB7 Boot_ROM25.008 OPT43SUB8 001320 OPT43SUB9 MODEL_NO_3100
OPT43SUB10 'VENDOR NAME' OPT43SUB54 0A859B428"
OR this (example 3):
udhcpc -i eth1 -s etc/udhcpc.script -V "OpenCable2.1" -x "OPT43 2 'ESTB' OPT43
3 'ECM:ESTB' OPT43 4 $SERIAL_NO OPT43 5 'HW_VER1.0.0' OPT43 6 'FW_VER1.0.0'
OPT43 7 'Boot_ROM25.008' OPT43 8 '001320' OPT43 9 'MODEL_NO_3100' OPT43 10
'VENDOR NAME' OPT43 54 '0A859B428'"
And you think read_opt() will handle the above syntax (specifically one of the
first three examples). Then once the code reads the options and understands
how many, I will dynamically allocate an array of options, with a dynamic array
of sub strings and values, then based on a new type OPTION_VENDOR_SPECIFIC
finally concat the final option 43 string (of 256 or less bytes).
OR are you expecting the user to specify the binary values for the sub-option
and length bytes (example using octal escape sequences - which will make it
hard to use environment variables - example 4):
udhcpc -i eth1 -s etc/udhcpc.script -V "OpenCable2.1" -x OPT43
"\002\004ESTB\003\008ECM:ESTB\004\014$SERIAL_NO\005\013HW_VER1.0.0\006\013FW_VER1.0.0\007\016Boot_ROM25.008\008\006001320\010\015MODEL_NO_3100\011\013VENDOR
NAME\066\0100A859B428"
One thing I need help with, I used statically allocated arrays in my previous
prototype because I was not clear as to where/when to de-allocate, can you help
me with that?
Thanks,
Steve
For Reference: DHCP options:
Data
Tag Name Length Meaning
Reference
-------- ------------------------------- ------
------------------------------------------------ ---------
0 Pad 0 None
[RFC2132]
1 Subnet Mask 4 Subnet Mask Value
[RFC2132]
2 Time Offset 4 Time Offset in Seconds from
UTC [RFC2132]
(note: deprecated by 100 and
101)
3 Router N N/4 Router addresses
[RFC2132]
4 Time Server N N/4 Timeserver addresses
[RFC2132]
5 Name Server N N/4 IEN-116 Server addresses
[RFC2132]
6 Domain Server N N/4 DNS Server addresses
[RFC2132]
7 Log Server N N/4 Logging Server addresses
[RFC2132]
8 Quotes Server N N/4 Quotes Server addresses
[RFC2132]
9 LPR Server N N/4 Printer Server addresses
[RFC2132]
10 Impress Server N N/4 Impress Server addresses
[RFC2132]
11 RLP Server N N/4 RLP Server addresses
[RFC2132]
12 Hostname N Hostname string
[RFC2132]
13 Boot File Size 2 Size of boot file in 512
byte chunks [RFC2132]
14 Merit Dump File N Client to dump and name the
file to dump it to [RFC2132]
15 Domain Name N The DNS domain name of the
client [RFC2132]
16 Swap Server N Swap Server address
[RFC2132]
17 Root Path N Path name for root disk
[RFC2132]
18 Extension File N Path name for more BOOTP
info [RFC2132]
19 Forward On/Off 1 Enable/Disable IP Forwarding
[RFC2132]
20 SrcRte On/Off 1 Enable/Disable Source
Routing [RFC2132]
21 Policy Filter N Routing Policy Filters
[RFC2132]
22 Max DG Assembly 2 Max Datagram Reassembly Size
[RFC2132]
23 Default IP TTL 1 Default IP Time to Live
[RFC2132]
24 MTU Timeout 4 Path MTU Aging Timeout
[RFC2132]
25 MTU Plateau N Path MTU Plateau Table
[RFC2132]
26 MTU Interface 2 Interface MTU Size
[RFC2132]
27 MTU Subnet 1 All Subnets are Local
[RFC2132]
28 Broadcast Address 4 Broadcast Address
[RFC2132]
29 Mask Discovery 1 Perform Mask Discovery
[RFC2132]
30 Mask Supplier 1 Provide Mask to Others
[RFC2132]
31 Router Discovery 1 Perform Router Discovery
[RFC2132]
32 Router Request 4 Router Solicitation Address
[RFC2132]
33 Static Route N Static Routing Table
[RFC2132]
34 Trailers 1 Trailer Encapsulation
[RFC2132]
35 ARP Timeout 4 ARP Cache Timeout
[RFC2132]
36 Ethernet 1 Ethernet Encapsulation
[RFC2132]
37 Default TCP TTL 1 Default TCP Time to Live
[RFC2132]
38 Keepalive Time 4 TCP Keepalive Interval
[RFC2132]
39 Keepalive Data 1 TCP Keepalive Garbage
[RFC2132]
40 NIS Domain N NIS Domain Name
[RFC2132]
41 NIS Servers N NIS Server Addresses
[RFC2132]
42 NTP Servers N NTP Server Addresses
[RFC2132]
43 Vendor Specific N Vendor Specific Information
[RFC2132]
44 NETBIOS Name Srv N NETBIOS Name Servers
[RFC2132]
45 NETBIOS Dist Srv N NETBIOS Datagram
Distribution [RFC2132]
46 NETBIOS Node Type 1 NETBIOS Node Type
[RFC2132]
47 NETBIOS Scope N NETBIOS Scope
[RFC2132]
48 X Window Font N X Window Font Server
[RFC2132]
49 X Window Manager N X Window Display Manager
[RFC2132]
50 Address Request 4 Requested IP Address
[RFC2132]
51 Address Time 4 IP Address Lease Time
[RFC2132]
52 Overload 1 Overload "sname" or "file"
[RFC2132]
53 DHCP Msg Type 1 DHCP Message Type
[RFC2132]
54 DHCP Server Id 4 DHCP Server Identification
[RFC2132]
55 Parameter List N Parameter Request List
[RFC2132]
56 DHCP Message N DHCP Error Message
[RFC2132]
57 DHCP Max Msg Size 2 DHCP Maximum Message Size
[RFC2132]
58 Renewal Time 4 DHCP Renewal (T1) Time
[RFC2132]
59 Rebinding Time 4 DHCP Rebinding (T2) Time
[RFC2132]
60 Class Id N Class Identifier
[RFC2132]
61 Client Id N Client Identifier
[RFC2132]
62 NetWare/IP Domain N NetWare/IP Domain Name
[RFC2242]
63 NetWare/IP Option N NetWare/IP sub Options
[RFC2242]
64 NIS-Domain-Name N NIS+ v3 Client Domain Name
[RFC2132]
65 NIS-Server-Addr N NIS+ v3 Server Addresses
[RFC2132]
66 Server-Name N TFTP Server Name
[RFC2132]
67 Bootfile-Name N Boot File Name
[RFC2132]
68 Home-Agent-Addrs N Home Agent Addresses
[RFC2132]
69 SMTP-Server N Simple Mail Server Addresses
[RFC2132]
70 POP3-Server N Post Office Server Addresses
[RFC2132]
71 NNTP-Server N Network News Server
Addresses [RFC2132]
72 WWW-Server N WWW Server Addresses
[RFC2132]
73 Finger-Server N Finger Server Addresses
[RFC2132]
74 IRC-Server N Chat Server Addresses
[RFC2132]
75 StreetTalk-Server N StreetTalk Server Addresses
[RFC2132]
76 STDA-Server N ST Directory Assist.
Addresses [RFC2132]
77 User-Class N User Class Information
[RFC3004]
78 Directory Agent N directory agent information
[RFC2610]
79 Service Scope N service location agent scope
[RFC2610]
80 Rapid Commit 0 Rapid Commit
[RFC4039]
81 Client FQDN N Fully Qualified Domain Name
[RFC4702]
82 Relay Agent Information N Relay Agent Information
[RFC3046]
83 iSNS N Internet Storage Name
Service [RFC4174]
84 REMOVED/Unassigned
[RFC3679]
85 NDS Servers N Novell Directory Services
[RFC2241]
86 NDS Tree Name N Novell Directory Services
[RFC2241]
87 NDS Context N Novell Directory Services
[RFC2241]
88 BCMCS Controller Domain Name list
[RFC4280]
89 BCMCS Controller IPv4 address option
[RFC4280]
90 Authentication N Authentication
[RFC3118]
91 client-last-transaction-time option
[RFC4388]
92 associated-ip option
[RFC4388]
93 Client System N Client System Architecture
[RFC4578]
94 Client NDI N Client Network Device
Interface [RFC4578]
95 LDAP N Lightweight Directory Access
Protocol [RFC3679]
96 REMOVED/Unassigned
[RFC3679]
97 UUID/GUID N UUID/GUID-based Client
Identifier [RFC4578]
98 User-Auth N Open Group's User
Authentication [RFC2485]
99 GEOCONF_CIVIC
[RFC4776]
100 PCode N IEEE 1003.1 TZ String
[RFC4833]
101 TCode N Reference to the TZ Database
[RFC4833]
102-107 REMOVED/Unassigned
[RFC3679]
108 REMOVED/Unassigned
[RFC3679]
109 Unassigned
[RFC3679]
110 REMOVED/Unassigned
[RFC3679]
111 Unassigned
[RFC3679]
112 Netinfo Address N NetInfo Parent Server
Address [RFC3679]
113 Netinfo Tag N NetInfo Parent Server Tag
[RFC3679]
114 URL N URL
[RFC3679]
115 REMOVED/Unassigned
[RFC3679]
116 Auto-Config N DHCP Auto-Configuration
[RFC2563]
117 Name Service Search N Name Service Search
[RFC2937]
118 Subnet Selection Option 4 Subnet Selection Option
[RFC3011]
119 Domain Search N DNS domain search list
[RFC3397]
120 SIP Servers DHCP Option N SIP Servers DHCP Option
[RFC3361]
121 Classless Static Route Option N Classless Static Route
Option [RFC3442]
122 CCC N CableLabs Client
Configuration [RFC3495]
123 GeoConf Option 16 GeoConf Option
[RFC3825]
124 V-I Vendor Class Vendor-Identifying Vendor
Class [RFC3925]
125 V-I Vendor-Specific Information Vendor-Identifying
Vendor-Specific Information [RFC3925]
126 Removed/Unassigned
[RFC3679]
127 Removed/Unassigned
[RFC3679]
128 PXE - undefined (vendor specific)
[RFC4578]
128 Etherboot signature. 6 bytes: E4:45:74:68:00:00
128 DOCSIS "full security" server IP address
128 TFTP Server IP address (for IP Phone software load)
129 PXE - undefined (vendor specific)
[RFC4578]
129 Kernel options. Variable length string
129 Call Server IP address
130 PXE - undefined (vendor specific)
[RFC4578]
130 Ethernet interface. Variable length string.
130 Discrimination string (to identify vendor)
131 PXE - undefined (vendor specific)
[RFC4578]
131 Remote statistics server IP address
132 PXE - undefined (vendor specific)
[RFC4578]
132 IEEE 802.1Q VLAN ID
133 PXE - undefined (vendor specific)
[RFC4578]
133 IEEE 802.1D/p Layer 2 Priority
134 PXE - undefined (vendor specific)
[RFC4578]
134 Diffserv Code Point (DSCP) for VoIP signalling and media streams
135 PXE - undefined (vendor specific)
[RFC4578]
135 HTTP Proxy for phone-specific applications
136 OPTION_PANA_AGENT
[RFC5192]
137 OPTION_V4_LOST
[RFC5223]
138 OPTION_CAPWAP_AC_V4 N CAPWAP Access Controller
addresses [RFC5417]
139 OPTION-IPv4_Address-MoS N a series of suboptions
[RFC5678]
140 OPTION-IPv4_FQDN-MoS N a series of suboptions
[RFC5678]
141-149 Unassigned
[RFC3942]
150 TFTP server address
[RFC-raj-dhc-tftp-addr-option-06.txt]
150 Etherboot
150 GRUB configuration path name
151-174 Unassigned
[RFC3942]
175 Etherboot (Tentatively Assigned - 2005-06-23)
176 IP Telephone (Tentatively Assigned - 2005-06-23)
177 Etherboot (Tentatively Assigned - 2005-06-23)
177 PacketCable and CableHome (replaced by 122)
178-207 Unassigned
[RFC3942]
208 PXELINUX Magic 4 magic string = F1:00:74:7E
[RFC5071] Deprecated
209 Configuration File N Configuration file
[RFC5071]
210 Path Prefix N Path Prefix Option
[RFC5071]
211 Reboot Time 4 Reboot Time
[RFC5071]
212-219 Unassigned
220 Subnet Allocation Option (Tentatively Assigned - 2005-06-23)
221 Virtual Subnet Selection Option (Tentatively Assigned - 2005-06-23)
222-223 Unassigned
[RFC3942]
224-254 Reserved (Private Use)
255 End 0 None
[RFC2132]
-----Original Message-----
From: Denys Vlasenko [mailto:[email protected]]
Sent: Sunday, March 21, 2010 9:01 PM
To: Krebs, Steven
Cc: [email protected]
Subject: Re: submit patch for udhcpc - addition of Option 43
On Sunday 21 March 2010 13:53, Denys Vlasenko wrote:
> On Wednesday 17 March 2010 18:40, Krebs, Steven wrote:
> > Hi, you seem to be the main developer for the udhcpc functionality.
> > Have you had a chance to take a look at this patch yet?
>
> Thanks for pinging me, I somehow missed it.
>
> > All,
> >
> > Sorry if this is a little rough, this is my first submission for busybox.
> >
> > On some networks (in my case for a cable modem) the dhcp server requires
> > dhcp option 60 and option 43. dhcp option 60 is already supported
> > with the -V command line option in udhcpc. It looks to me like
> > option 43 is not supported. I have implemented a prototype for option 43.
Aha, understand what you want to achieve.
You want udhcpc to have more options in its DISCOVER and/or REQUEST
packets.
> > dhcp option 43 is known as the vendor specific option. I have chosen
> > the command line option -x (as -v was already taken).
> > I have made -x an optional argument with an optional value.
> > By default when -x is used, udhcpc will read the file
> > /etc/udhcpc.vendor_specific and parse the suboptions within
> > to create option 43. One may also optionally specify a path
> > and filename after -x. In my version of busybox (older) getopts32
> > does not allow a space after the -x when the value is optional.
> > So one could specific a different path for the file as so:
> >
> > udhcpc -x/tmp/udhcpc.vendor_specific
> >
> > Dhcp option 43 is a concatenation of substrings.
> > For my purposes I needed to implement it for (OpenCable)
> > OC-SP-HOST2.1-CFR-I10-091211 which requires suboptions
> > 2,3,4,5,6,7,8,9,10 and 54.
> > http://www.cablelabs.com/specifications/OC-SP-HOST2.1-CFR-I10-091211.pdf
> > So that is what is currently supported, but I tried to make
> > the implementation generic and it can be expanded fairly easily.
> >
> > The udhcpc.vendor_specific config file is KEY value string pairs
> > separated by whitespace. Example:
> >
> > SUBOPTION2 ESTB
> > SUBOPTION3 ECM:ESTB
You are using a config file specifically for option 43?
What will happen when users will eventually want other options?
256 config files?
I think at the very least the config file should be generic enough
to be extensible to more options. Or maybe we can avoid having
a file just yet - so far udhcpc was managing with command line options.
udhcp already has machinery for converting binary option representation
into string - it is used when udhcpc needs to export server's options
into environment variables
And it has machinery for converting strings into options -
this code is responsible for implementing "opt OPTION VALUE"
directive in udhcpd.conf file.
You need to extend this code - teach it to handle a new type
of option (since option 43 is neither a string nor an IP address),
and then hook this code up to a new udhcpc option.
To this end, add new #define DHCP_VENDOR_INFO to options.h,
and add the new _type_ of option, OPTION_VENDOR_INFO, in the same file.
Add it to dhcp_options[], dhcp_option_strings[], dhcp_option_lengths[].
Then teach read_opt() function to how to convert a string
into a binary representation of OPTION_VENDOR_INFO option,
and teach xmalloc_optname_optval() to do the opposite conversion.
Then create a new option for udhcpc, say -x OPT, which allows
udhcpc to add _any_ supported_ option_ (not only yours)
to the emitted packet.
This should be not so hard - use read_opt().
--
vda
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox