|
@@ -130,29 +130,6 @@ static inline const char * dhcp_msgtype_name ( unsigned int msgtype ) {
|
130
|
130
|
}
|
131
|
131
|
}
|
132
|
132
|
|
133
|
|
-/**
|
134
|
|
- * Transcribe DHCP client hardware address (for debugging)
|
135
|
|
- *
|
136
|
|
- * @v chaddr Client hardware address
|
137
|
|
- * @v hlen Client hardware address length
|
138
|
|
- */
|
139
|
|
-static const char * dhcp_chaddr_ntoa ( const void *chaddr, size_t hlen ) {
|
140
|
|
- static char buf[ 48 /* 16 x ( "xx" + ":" or NUL ) */ ];
|
141
|
|
- const uint8_t *chaddr_bytes = chaddr;
|
142
|
|
- char *tmp = buf;
|
143
|
|
-
|
144
|
|
- /* Sanity check */
|
145
|
|
- assert ( hlen < ( sizeof ( buf ) / 3 ) );
|
146
|
|
-
|
147
|
|
- /* Transcribe address */
|
148
|
|
- while ( hlen-- ) {
|
149
|
|
- tmp += sprintf ( tmp, "%s%02x", ( ( tmp == buf ) ? "" : ":" ),
|
150
|
|
- *(chaddr_bytes++) );
|
151
|
|
- }
|
152
|
|
-
|
153
|
|
- return buf;
|
154
|
|
-}
|
155
|
|
-
|
156
|
133
|
/****************************************************************************
|
157
|
134
|
*
|
158
|
135
|
* DHCP session
|
|
@@ -864,53 +841,6 @@ static struct dhcp_session_state dhcp_state_pxebs = {
|
864
|
841
|
*
|
865
|
842
|
*/
|
866
|
843
|
|
867
|
|
-/**
|
868
|
|
- * Construct DHCP client hardware address field and broadcast flag
|
869
|
|
- *
|
870
|
|
- * @v netdev Network device
|
871
|
|
- * @v chaddr Hardware address buffer
|
872
|
|
- * @v flags Flags to set (or NULL)
|
873
|
|
- * @ret hlen Hardware address length
|
874
|
|
- */
|
875
|
|
-unsigned int dhcp_chaddr ( struct net_device *netdev, void *chaddr,
|
876
|
|
- uint16_t *flags ) {
|
877
|
|
- struct ll_protocol *ll_protocol = netdev->ll_protocol;
|
878
|
|
- struct dhcphdr *dhcphdr;
|
879
|
|
- int rc;
|
880
|
|
-
|
881
|
|
- /* If the link-layer address cannot fit into the chaddr field
|
882
|
|
- * (as is the case for IPoIB) then try using the Ethernet-
|
883
|
|
- * compatible link-layer address. If we do this, set the
|
884
|
|
- * broadcast flag, since chaddr then does not represent a
|
885
|
|
- * valid link-layer address for the return path.
|
886
|
|
- *
|
887
|
|
- * If we cannot produce an Ethernet-compatible link-layer
|
888
|
|
- * address, try using the hardware address.
|
889
|
|
- *
|
890
|
|
- * If even the hardware address is too large, use an empty
|
891
|
|
- * chaddr field and set the broadcast flag.
|
892
|
|
- *
|
893
|
|
- * This goes against RFC4390, but RFC4390 mandates that we use
|
894
|
|
- * a DHCP client identifier that conforms with RFC4361, which
|
895
|
|
- * we cannot do without either persistent (NIC-independent)
|
896
|
|
- * storage, or by eliminating the hardware address completely
|
897
|
|
- * from the DHCP packet, which seems unfriendly to users.
|
898
|
|
- */
|
899
|
|
- if ( ll_protocol->ll_addr_len <= sizeof ( dhcphdr->chaddr ) ) {
|
900
|
|
- memcpy ( chaddr, netdev->ll_addr, ll_protocol->ll_addr_len );
|
901
|
|
- return ll_protocol->ll_addr_len;
|
902
|
|
- }
|
903
|
|
- if ( flags )
|
904
|
|
- *flags |= htons ( BOOTP_FL_BROADCAST );
|
905
|
|
- if ( ( rc = ll_protocol->eth_addr ( netdev->ll_addr, chaddr ) ) == 0 )
|
906
|
|
- return ETH_ALEN;
|
907
|
|
- if ( ll_protocol->hw_addr_len <= sizeof ( dhcphdr->chaddr ) ) {
|
908
|
|
- memcpy ( chaddr, netdev->hw_addr, ll_protocol->hw_addr_len );
|
909
|
|
- return ll_protocol->hw_addr_len;
|
910
|
|
- }
|
911
|
|
- return 0;
|
912
|
|
-}
|
913
|
|
-
|
914
|
844
|
/**
|
915
|
845
|
* Create a DHCP packet
|
916
|
846
|
*
|
|
@@ -1176,14 +1106,14 @@ static int dhcp_tx ( struct dhcp_session *dhcp ) {
|
1176
|
1106
|
static int dhcp_deliver ( struct dhcp_session *dhcp,
|
1177
|
1107
|
struct io_buffer *iobuf,
|
1178
|
1108
|
struct xfer_metadata *meta ) {
|
|
1109
|
+ struct net_device *netdev = dhcp->netdev;
|
|
1110
|
+ struct ll_protocol *ll_protocol = netdev->ll_protocol;
|
1179
|
1111
|
struct sockaddr_in *peer;
|
1180
|
1112
|
size_t data_len;
|
1181
|
1113
|
struct dhcp_packet *dhcppkt;
|
1182
|
1114
|
struct dhcphdr *dhcphdr;
|
1183
|
1115
|
uint8_t msgtype = 0;
|
1184
|
1116
|
struct in_addr server_id = { 0 };
|
1185
|
|
- uint8_t chaddr[ sizeof ( dhcphdr->chaddr ) ];
|
1186
|
|
- unsigned int hlen;
|
1187
|
1117
|
int rc = 0;
|
1188
|
1118
|
|
1189
|
1119
|
/* Sanity checks */
|
|
@@ -1229,12 +1159,12 @@ static int dhcp_deliver ( struct dhcp_session *dhcp,
|
1229
|
1159
|
};
|
1230
|
1160
|
|
1231
|
1161
|
/* Check for matching client hardware address */
|
1232
|
|
- hlen = dhcp_chaddr ( dhcp->netdev, chaddr, NULL );
|
1233
|
|
- if ( memcmp ( dhcphdr->chaddr, chaddr, hlen ) != 0 ) {
|
|
1162
|
+ if ( memcmp ( dhcphdr->chaddr, netdev->ll_addr,
|
|
1163
|
+ ll_protocol->ll_addr_len ) != 0 ) {
|
1234
|
1164
|
DBGC ( dhcp, "DHCP %p %s from %s:%d has bad chaddr %s\n",
|
1235
|
1165
|
dhcp, dhcp_msgtype_name ( msgtype ),
|
1236
|
1166
|
inet_ntoa ( peer->sin_addr ), ntohs ( peer->sin_port ),
|
1237
|
|
- dhcp_chaddr_ntoa ( dhcphdr->chaddr, hlen ) );
|
|
1167
|
+ ll_protocol->ntoa ( dhcphdr->chaddr ) );
|
1238
|
1168
|
rc = -EINVAL;
|
1239
|
1169
|
goto err_chaddr;
|
1240
|
1170
|
}
|